source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/Dialog/DialogFile.asm@ 45

Last change on this file since 45 was 45, checked in by Tomi Tilli, 14 years ago

Changes to assembly library:
Changed SetCharOutputFunctionFromAXwithAttribFlagInDL to SetCharOutputFunctionFromAXwithAttribFlagInBL since DX register gets corrupted by Display_FunctionFromDI.
Implemented quicksort.

File size: 19.7 KB
Line 
1; File name : DialogFile.asm
2; Project name : Assembly Library
3; Created date : 6.9.2010
4; Last update : 28.9.2010
5; Author : Tomi Tilli
6; Description : Displays file dialog.
7
8
9CURRENTDIR_CHARACTERS EQU 002Eh
10UPDIR_CHARACTERS EQU 2E2Eh
11
12; Section containing code
13SECTION .text
14
15;--------------------------------------------------------------------
16; DialogFile_GetFileNameWithIoInDSSI
17; Parameters:
18; DS:SI: Ptr to FILE_DIALOG_IO
19; SS:BP: Ptr to parent MENU
20; Returns:
21; Nothing
22; Corrupts registers:
23; AX, BX, CX, DX, SI, DI
24;--------------------------------------------------------------------
25ALIGN JUMP_ALIGN
26DialogFile_GetFileNameWithIoInDSSI:
27 mov bx, FileEventHandler
28 mov BYTE [si+FILE_DIALOG_IO.bUserCancellation], TRUE
29 jmp Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
30
31
32;--------------------------------------------------------------------
33; FileEventHandler
34; Common parameters for all events:
35; BX: Menu event (anything from MENUEVENT struct)
36; SS:BP: Ptr to DIALOG
37; Common return values for all events:
38; CF: Set if event processed
39; Cleared if event not processed
40; Corrupts registers:
41; All
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44FileEventHandler:
45 jmp [cs:bx+.rgfnEventHandlers]
46
47
48ALIGN JUMP_ALIGN
49.ItemSelectedFromCX:
50 call LoadItemStringBufferToESDI
51 call LineSplitter_GetOffsetToSIforLineCXfromStringInESDI
52 push es
53 pop ds
54 jmp ParseSelectionFromItemLineInDSSI
55
56
57ALIGN JUMP_ALIGN
58.RefreshInformation:
59 call GetInfoLinesToCXandDialogFlagsToAX
60 mov si, [cs:.rgszInfoStringLookup]
61 xor bx, bx
62 xchg dx, ax
63ALIGN JUMP_ALIGN
64.InfoLineLoop:
65 shr dl, 1
66 jnc SHORT .CheckNextFlag
67 mov si, [cs:bx+.rgszInfoStringLookup]
68 push bx
69 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
70 pop bx
71ALIGN JUMP_ALIGN
72.CheckNextFlag:
73 inc bx
74 inc bx
75 loop .InfoLineLoop
76 stc ; Event processed
77 ret
78
79
80ALIGN WORD_ALIGN
81.rgszInfoStringLookup:
82 dw g_szChangeDrive
83 dw g_szSelectDirectory
84 dw g_szCreateNew
85
86.rgfnEventHandlers:
87istruc MENUEVENT
88 at MENUEVENT.InitializeMenuinitFromDSSI, dw InitializeMenuinitFromSSBP
89 at MENUEVENT.ExitMenu, dw Dialog_EventNotHandled
90 at MENUEVENT.IdleProcessing, dw Dialog_EventNotHandled
91 at MENUEVENT.ItemHighlightedFromCX, dw Dialog_EventNotHandled
92 at MENUEVENT.ItemSelectedFromCX, dw .ItemSelectedFromCX
93 at MENUEVENT.KeyStrokeInAX, dw HandleFunctionKeyFromAH
94 at MENUEVENT.RefreshTitle, dw Dialog_EventRefreshTitle
95 at MENUEVENT.RefreshInformation, dw .RefreshInformation
96 at MENUEVENT.RefreshItemFromCX, dw Dialog_EventRefreshItemFromCX
97iend
98
99
100;--------------------------------------------------------------------
101; InitializeMenuinitFromSSBP
102; Parameters:
103; DS:SI: Ptr to MENUINIT to initialize (also points to DIALOG)
104; SS:BP: Ptr to DIALOG
105; Returns:
106; Nothing
107; Corrupts registers:
108; All, except BP
109;--------------------------------------------------------------------
110ALIGN JUMP_ALIGN
111InitializeMenuinitFromSSBP:
112 call LoadItemStringBufferToESDI
113 call CreateStringFromCurrentDirectoryContentsToESDI
114 push ss
115 pop ds
116 mov si, bp
117 call Dialog_EventInitializeMenuinitFromDSSI
118 call GetInfoLinesToCXandDialogFlagsToAX
119 mov [bp+MENUINIT.bInfoLines], cl
120 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
121 mov [bp+MENUINIT.bHeight], ah ; Always max height
122 mov WORD [bp+MENU.wHighlightedItem], 0
123 ret
124
125
126;--------------------------------------------------------------------
127; LoadItemStringBufferToESDI
128; Parameters:
129; SS:BP: Ptr to DIALOG
130; Returns:
131; ES:DI: Ptr to item string buffer
132; Corrupts registers:
133; Nothing
134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
136LoadItemStringBufferToESDI:
137 les di, [bp+DIALOG.fpDialogIO]
138 les di, [es:di+FILE_DIALOG_IO.fszItemBuffer]
139 ret
140
141
142;--------------------------------------------------------------------
143; CreateStringFromCurrentDirectoryContentsToESDI
144; Parameters:
145; ES:DI: Buffer where to create item string
146; SS:BP: Ptr to DIALOG
147; Returns:
148; Nothing
149; Corrupts registers:
150; AX, CX, DX, SI, DI, DS, ES
151;--------------------------------------------------------------------
152ALIGN JUMP_ALIGN
153CreateStringFromCurrentDirectoryContentsToESDI:
154 lds si, [bp+DIALOG.fpDialogIO]
155 eMOVZX cx, BYTE [si+FILE_DIALOG_IO.bFileAttributes]
156 lds si, [si+FILE_DIALOG_IO.fpFileFilterString]
157 call Directory_UpdateDTAForFirstMatchForDSSIwithAttributesInCX
158 rcr cx, 1 ; Store CF
159 call .ClearDLifInRootDirectory
160 call Directory_GetDiskTransferAreaAddressToDSSI
161 rcl cx, 1 ; Restore CF
162 ; Fall to .FindMatchingFilesAndWriteThemToESDI
163
164;--------------------------------------------------------------------
165; .FindMatchingFilesAndWriteThemToESDI
166; Parameters:
167; DL: Zero if root directory selected
168; DS:SI: Ptr to DTA with first matching file
169; ES:DI: Ptr to destination string buffer
170; Returns:
171; Nothing
172; Corrupts registers:
173; AX, CX, DX, DI
174;--------------------------------------------------------------------
175;ALIGN JUMP_ALIGN
176.FindMatchingFilesAndWriteThemToESDI:
177 jc SHORT RemoveLastLFandTerminateESDIwithNull
178 call AppendFileToBufferInESDIfromDtaInDSSI
179 call Directory_UpdateDTAForNextMatchUsingPreviousParameters
180 jmp SHORT .FindMatchingFilesAndWriteThemToESDI
181
182;--------------------------------------------------------------------
183; .ClearDLifInRootDirectory
184; Parameters:
185; SS:BP: Ptr to DIALOG
186; ES:DI: Ptr to destination string buffer
187; Returns:
188; DL: Cleared if in root directory
189; Set if in any other directory
190; Corrupts registers:
191; AX, SI, DS
192;--------------------------------------------------------------------
193ALIGN JUMP_ALIGN
194.ClearDLifInRootDirectory:
195 push es
196 pop ds
197 mov si, di
198 call Directory_WriteCurrentPathToDSSI
199 mov dl, [si]
200 ret
201
202;--------------------------------------------------------------------
203; RemoveLastLFandTerminateESDIwithNull
204; Parameters:
205; ES:DI: Ptr to destination string buffer
206; Returns:
207; Nothing
208; Corrupts registers:
209; AX
210;--------------------------------------------------------------------
211ALIGN JUMP_ALIGN
212RemoveLastLFandTerminateESDIwithNull:
213 xor ax, ax
214 dec di ; Remove last LF
215 stosb
216 ret
217
218;--------------------------------------------------------------------
219; AppendFileToBufferInESDIfromDtaInDSSI
220; Parameters:
221; DL: Zero if root directory selected
222; DS:SI: Ptr to DTA containing file information
223; ES:DI: Ptr to destination string buffer
224; Returns:
225; DI: Updated for next file
226; Corrupts registers:
227; AX, BX, CX, DX
228;--------------------------------------------------------------------
229ALIGN JUMP_ALIGN
230AppendFileToBufferInESDIfromDtaInDSSI:
231 call .FilterCurrentDirectory ; We never want "."
232 call .FilterUpDirectoryWhenInRoot ; No ".." when in root directory
233 ; Fall to .PrepareBufferFormattingAndFormatFromDTAinDSSI
234
235;--------------------------------------------------------------------
236; .PrepareBufferFormattingAndFormatFromDTAinDSSI
237; Parameters:
238; DS:SI: Ptr to DTA containing file information
239; ES:DI: Ptr to destination string buffer
240; Returns:
241; DI: Updated for next file
242; Corrupts registers:
243; AX, BX, CX, DX
244;--------------------------------------------------------------------
245;ALIGN JUMP_ALIGN
246.PrepareBufferFormattingAndFormatFromDTAinDSSI:
247 push bp
248 push si
249 mov cx, di
250 CALL_DISPLAY_LIBRARY PushDisplayContext
251
252 mov bx, es
253 xchg ax, cx
254 CALL_DISPLAY_LIBRARY SetCharacterPointerFromBXAX
255 mov bl, ATTRIBUTES_NOT_USED
256 mov ax, BUFFER_OUTPUT_WITH_CHAR_ONLY
257 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
258
259 call .FormatFileOrDirectoryToBufferFromDTAinDSSI
260
261 CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
262 mov es, bx
263 xchg cx, ax
264 CALL_DISPLAY_LIBRARY PopDisplayContext
265 mov di, cx
266 pop si
267 pop bp
268 ret
269
270;--------------------------------------------------------------------
271; .FormatFileOrDirectoryToBufferFromDTAinDSSI
272; Parameters:
273; DS:SI: Ptr to DTA containing file information
274; Returns:
275; Nothing
276; Corrupts registers:
277; AX, BX, CX, DX, SI, DI, BP
278;--------------------------------------------------------------------
279ALIGN JUMP_ALIGN
280.FormatFileOrDirectoryToBufferFromDTAinDSSI:
281 mov bp, sp
282 lea ax, [si+DTA.szFile]
283 push ax
284 push ds
285
286 test BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
287 jnz SHORT .FormatDirectory
288
289 mov ax, [si+DTA.dwFileSize]
290 mov dx, [si+DTA.dwFileSize+2]
291 xor bx, bx
292 xor cx, cx
293 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
294 mov cl, 'i'
295 cmp dl, ' '
296 eCMOVE cl, dl
297 push ax
298 push dx
299 push cx
300 mov si, g_szFileFormat
301 jmp SHORT .FormatStringInCSSIandReturn
302
303ALIGN JUMP_ALIGN
304.FormatDirectory:
305 mov ax, g_szSub
306 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
307 eCMOVE ax, g_szUp
308 push ax
309 mov si, g_szDirectoryFormat
310ALIGN JUMP_ALIGN
311.FormatStringInCSSIandReturn:
312 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
313 ret
314
315;--------------------------------------------------------------------
316; .FilterCurrentDirectory
317; .FilterUpDirectoryWhenInRoot
318; Parameters:
319; DL: Zero if root directory selected
320; DS:SI: Ptr to DTA containing file information
321; Returns:
322; Nothing
323; Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
324; Corrupts registers:
325; AX
326;--------------------------------------------------------------------
327ALIGN JUMP_ALIGN
328.FilterCurrentDirectory:
329 cmp WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
330 jne SHORT .ReturnWithoutFiltering
331 add sp, BYTE 2 ; Remove return address from stack
332 ret
333
334ALIGN JUMP_ALIGN
335.FilterUpDirectoryWhenInRoot:
336 test dl, dl ; Set ZF if root directory selected
337 jnz SHORT .ReturnWithoutFiltering
338 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
339 jne SHORT .ReturnWithoutFiltering
340 add sp, BYTE 2 ; Remove return address from stack
341ALIGN JUMP_ALIGN, ret
342.ReturnWithoutFiltering:
343 ret
344
345
346;--------------------------------------------------------------------
347; GetInfoLinesToCXandDialogFlagsToAX
348; Parameters:
349; SS:BP: Ptr to DIALOG
350; Returns:
351; AX: Dialog flags
352; CX: Number of info lines to be displayed
353; Corrupts registers:
354; SI, DS
355;--------------------------------------------------------------------
356ALIGN JUMP_ALIGN
357GetInfoLinesToCXandDialogFlagsToAX:
358 xor ax, ax
359 call GetDialogFlagsToAL
360 jmp Bit_GetSetCountToCXfromAX
361
362;--------------------------------------------------------------------
363; GetDialogFlagsToAL
364; Parameters:
365; SS:BP: Ptr to DIALOG
366; Returns:
367; AL: Dialog flags
368; Corrupts registers:
369; SI, DS
370;--------------------------------------------------------------------
371ALIGN JUMP_ALIGN
372GetDialogFlagsToAL:
373 lds si, [bp+DIALOG.fpDialogIO]
374 mov al, [si+FILE_DIALOG_IO.bDialogFlags]
375 ret
376
377
378;--------------------------------------------------------------------
379; ParseSelectionFromItemLineInDSSI
380; Parameters:
381; DS:SI: Ptr to char buffer containing file or directory to be selected
382; SS:BP: Ptr to DIALOG
383; Returns:
384; Nothing
385; Corrupts registers:
386; All, except BP
387;--------------------------------------------------------------------
388ALIGN JUMP_ALIGN
389ParseSelectionFromItemLineInDSSI:
390 cmp BYTE [si], '['
391 je SHORT .ChangeToSubdirInDSSI
392 ; Fall to .SelectFileFromDSSI
393
394;--------------------------------------------------------------------
395; .SelectFileFromDSSI
396; Parameters:
397; DS:SI: Ptr to char buffer containing file name to be selected
398; SS:BP: Ptr to DIALOG
399; Returns:
400; Nothing (exits dialog)
401; Corrupts registers:
402; All, except BP
403;--------------------------------------------------------------------
404;ALIGN JUMP_ALIGN
405.SelectFileFromDSSI:
406 les di, [bp+DIALOG.fpDialogIO]
407 add di, BYTE FILE_DIALOG_IO.szFile
408 mov cx, FILENAME_BUFFER_SIZE-1
409 cld
410 rep movsb
411 xor ax, ax
412 stosb ; Terminate with NULL
413 jmp CloseFileDialogAfterSuccessfullSelection
414
415;--------------------------------------------------------------------
416; ChangeToSubdirInDSSI
417; Parameters:
418; DS:SI: NULL terminated string containing new subdir in []
419; SS:BP: Ptr to DIALOG
420; Returns:
421; Nothing
422; Corrupts registers:
423; All, except BP
424;--------------------------------------------------------------------
425ALIGN JUMP_ALIGN
426.ChangeToSubdirInDSSI:
427 inc si ; Skip '['
428 mov BYTE [si+12], NULL ; Replace ']' with NULL
429 cmp WORD [si], UPDIR_CHARACTERS
430 eCMOVE si, g_szUpdir ; Real DOS do not accept spaces after ".."
431 call Directory_ChangeToPathFromDSSI
432 ; Fall to RefreshFilesToDisplay
433
434;--------------------------------------------------------------------
435; RefreshFilesToDisplay
436; Parameters:
437; SS:BP: Ptr to DIALOG
438; Returns:
439; Nothing
440; Corrupts registers:
441; All, except BP
442;--------------------------------------------------------------------
443ALIGN JUMP_ALIGN
444RefreshFilesToDisplay:
445 call InitializeMenuinitFromSSBP
446 jmp MenuInit_RefreshMenuWindow
447
448
449;--------------------------------------------------------------------
450; HandleFunctionKeyFromAH
451; Parameters:
452; AH: Scancode for function key
453; SS:BP: Ptr to DIALOG
454; Returns:
455; Nothing
456; Corrupts registers:
457; AX, SI, DI, BP
458;--------------------------------------------------------------------
459ALIGN JUMP_ALIGN
460HandleFunctionKeyFromAH:
461 call GetDialogFlagsToAL
462 cmp ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
463 je SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
464 cmp ah, KEY_FILEDIALOG_SELECT_DIRECTORY
465 je SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
466 cmp ah, KEY_FILEDIALOG_CHANGE_DRIVE
467 je SHORT HandleFunctionKeyForDriveChange
468ReturnWithoutHandlingKeystroke:
469 clc ; Event not processed
470 ret
471
472
473;--------------------------------------------------------------------
474; HandleFunctionKeyForCreatingNewFileOrDirectory
475; Parameters:
476; AL: File dialog flags
477; SS:BP: Ptr to DIALOG
478; Returns:
479; Closes file dialog
480; Corrupts registers:
481; All, except BP
482;--------------------------------------------------------------------
483ALIGN JUMP_ALIGN
484HandleFunctionKeyForCreatingNewFileOrDirectory:
485 test al, FLG_FILEDIALOG_NEW
486 jz SHORT ReturnWithoutHandlingKeystroke
487
488 mov cx, STRING_DIALOG_IO_size
489 call Memory_ReserveCXbytesFromStackToDSSI
490 call .InitializeStringDialogIoInDSSIforInputtingFileName
491
492 CALL_MENU_LIBRARY GetStringWithIoInDSSI
493 mov al, [si+STRING_DIALOG_IO.bUserCancellation]
494 add sp, BYTE STRING_DIALOG_IO_size
495 test al, al ; User cancellation?
496 jnz SHORT ReturnWithoutHandlingKeystroke
497 jmp CloseFileDialogAfterSuccessfullSelection
498
499ALIGN JUMP_ALIGN
500.InitializeStringDialogIoInDSSIforInputtingFileName:
501 call InitializeNullStringsToDialogInputInDSSI
502 mov WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
503 mov WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
504 mov WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
505 les ax, [bp+DIALOG.fpDialogIO]
506 add ax, BYTE FILE_DIALOG_IO.szFile
507 mov [si+STRING_DIALOG_IO.fpReturnBuffer], ax
508 mov [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
509 ret
510
511
512;--------------------------------------------------------------------
513; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
514; Parameters:
515; AL: File dialog flags
516; SS:BP: Ptr to DIALOG
517; Returns:
518; Closes file dialog
519; Corrupts registers:
520; All, except BP
521;--------------------------------------------------------------------
522ALIGN JUMP_ALIGN
523HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
524 test al, FLG_FILEDIALOG_DIRECTORY
525 jz SHORT ReturnWithoutHandlingKeystroke
526 ; Fall to CloseFileDialogAfterSuccessfullSelection
527
528;--------------------------------------------------------------------
529; CloseFileDialogAfterSuccessfullSelection
530; Parameters:
531; SS:BP: Ptr to DIALOG
532; Returns:
533; Nothing (exits dialog)
534; Corrupts registers:
535; All, except BP
536;--------------------------------------------------------------------
537ALIGN JUMP_ALIGN
538CloseFileDialogAfterSuccessfullSelection:
539 lds di, [bp+DIALOG.fpDialogIO]
540 mov BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
541 jmp MenuInit_CloseMenuWindow
542
543
544;--------------------------------------------------------------------
545; HandleFunctionKeyForDriveChange
546; Parameters:
547; AL: File dialog flags
548; SS:BP: Ptr to DIALOG
549; Returns:
550; Nothing
551; Corrupts registers:
552; All, except BP
553;--------------------------------------------------------------------
554ALIGN JUMP_ALIGN
555HandleFunctionKeyForDriveChange:
556 test al, FLG_FILEDIALOG_DRIVES
557 jz SHORT ReturnWithoutHandlingKeystroke
558
559 call .ShowDriveSelectionDialogAndGetDriveNumberToDL
560 jnc SHORT RefreshFilesToDisplay
561 call Drive_SetDefaultFromDL
562 jmp SHORT RefreshFilesToDisplay
563
564;--------------------------------------------------------------------
565; .ShowDriveSelectionDialogAndGetDriveNumberToDL
566; Parameters:
567; SS:BP: Ptr to DIALOG
568; Returns:
569; DL: Drive selected by user
570; CF: Set if new drive selected
571; Cleared if selection cancelled by user
572; Corrupts registers:
573; All, except BP
574;--------------------------------------------------------------------
575ALIGN JUMP_ALIGN
576.ShowDriveSelectionDialogAndGetDriveNumberToDL:
577 mov cx, DIALOG_INPUT_size
578 call Memory_ReserveCXbytesFromStackToDSSI
579 call .InitializeDialogInputInDSSIforDriveSelection
580 call DialogSelection_GetSelectionToAXwithInputInDSSI
581 add sp, BYTE DIALOG_INPUT_size
582 cmp ax, BYTE NO_ITEM_SELECTED ; Clear CF if equal
583 jne SHORT .ConvertDriveNumberToDLfromItemIndexInAX
584 ret
585
586ALIGN JUMP_ALIGN
587.InitializeDialogInputInDSSIforDriveSelection:
588 call InitializeNullStringsToDialogInputInDSSI
589 call LoadItemStringBufferToESDI
590 mov WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
591 mov [si+DIALOG_INPUT.fszItems], di
592 mov [si+DIALOG_INPUT.fszItems+2], es
593 call Drive_GetFlagsForAvailableDrivesToDXAX
594 ; Fall to .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
595
596;--------------------------------------------------------------------
597; .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
598; Parameters:
599; DX:AX: Drive letter flags
600; ES:DI: Ptr to item string buffer
601; SS:BP: Ptr to DIALOG
602; Returns:
603; Nothing
604; Corrupts registers:
605; AX, BX, CX, DX, DI, ES
606;--------------------------------------------------------------------
607;ALIGN JUMP_ALIGN
608.GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX:
609 cld
610 xchg cx, ax
611 mov ax, 3A41h ; A:
612ALIGN JUMP_ALIGN
613.BitShiftLoop:
614 shr dx, 1
615 rcr cx, 1
616 jnc SHORT .CheckIfMoreDrivesLeft
617 stosw
618 mov BYTE [es:di], LF
619 inc di
620ALIGN JUMP_ALIGN
621.CheckIfMoreDrivesLeft:
622 inc ax ; Next drive letter
623 mov bx, dx
624 or bx, cx
625 jnz SHORT .BitShiftLoop
626 jmp RemoveLastLFandTerminateESDIwithNull
627
628;--------------------------------------------------------------------
629; .ConvertDriveNumberToDLfromItemIndexInAX
630; Parameters:
631; AX: Selected drive item
632; Returns:
633; DL: Drive number
634; CF: Set since drive selected
635; Corrupts registers:
636; AX, CX, DH
637;--------------------------------------------------------------------
638ALIGN JUMP_ALIGN
639.ConvertDriveNumberToDLfromItemIndexInAX:
640 mov ah, -1
641 xchg cx, ax
642 call Drive_GetFlagsForAvailableDrivesToDXAX
643ALIGN JUMP_ALIGN
644.BitScanLoop:
645 shr dx, 1
646 rcr ax, 1
647 inc ch ; Increment drive number
648 sbb cl, 0 ; Decrement selection index
649 jnc SHORT .BitScanLoop
650 mov dl, ch
651 stc ; Drive selected by user
652 ret
653
654
655;--------------------------------------------------------------------
656; InitializeNullStringsToDialogInputInDSSI
657; Parameters:
658; DS:SI: Ptr to DIALOG_INPUT
659; SS:BP: Ptr to DIALOG
660; Returns:
661; Nothing
662; Corrupts registers:
663; AX
664;--------------------------------------------------------------------
665ALIGN JUMP_ALIGN
666InitializeNullStringsToDialogInputInDSSI:
667 mov ax, g_szNull
668 mov [si+DIALOG_INPUT.fszTitle], ax
669 mov [si+DIALOG_INPUT.fszTitle+2], cs
670 mov [si+DIALOG_INPUT.fszItems], ax
671 mov [si+DIALOG_INPUT.fszItems+2], cs
672 mov [si+DIALOG_INPUT.fszInfo], ax
673 mov [si+DIALOG_INPUT.fszInfo+2], cs
674 ret
Note: See TracBrowser for help on using the repository browser.