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

Last change on this file since 41 was 41, checked in by aitotat, 14 years ago

Initial commit for Assembly Library.

File size: 19.6 KB
Line 
1; File name     :   DialogFile.asm
2; Project name  :   Assembly Library
3; Created date  :   6.9.2010
4; Last update   :   16.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, 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, 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
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
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     ax, BUFFER_OUTPUT_WITH_CHAR_ONLY
256    CALL_DISPLAY_LIBRARY SetCharacterOutputFunctionFromAX
257
258    call    .FormatFileOrDirectoryToBufferFromDTAinDSSI
259
260    CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
261    mov     es, bx
262    xchg    cx, ax
263    CALL_DISPLAY_LIBRARY PopDisplayContext
264    mov     di, cx
265    pop     si
266    pop     bp
267    ret
268
269;--------------------------------------------------------------------
270; .FormatFileOrDirectoryToBufferFromDTAinDSSI
271;   Parameters:
272;       DS:SI:  Ptr to DTA containing file information
273;   Returns:
274;       Nothing
275;   Corrupts registers:
276;       AX, BX, CX, DX, SI, DI, BP
277;--------------------------------------------------------------------
278ALIGN JUMP_ALIGN
279.FormatFileOrDirectoryToBufferFromDTAinDSSI:
280    mov     bp, sp
281    lea     ax, [si+DTA.szFile]
282    push    ax
283    push    ds
284
285    test    BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
286    jnz     SHORT .FormatDirectory
287
288    mov     ax, [si+DTA.dwFileSize]
289    mov     dx, [si+DTA.dwFileSize+2]
290    xor     bx, bx
291    xor     cx, cx
292    call    Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
293    mov     cl, 'i'
294    cmp     dl, ' '
295    eCMOVE  cl, dl
296    push    ax
297    push    dx
298    push    cx
299    mov     si, g_szFileFormat
300    jmp     SHORT .FormatStringInCSSIandReturn
301
302ALIGN JUMP_ALIGN
303.FormatDirectory:
304    mov     ax, g_szSub
305    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
306    eCMOVE  ax, g_szUp
307    push    ax
308    mov     si, g_szDirectoryFormat
309ALIGN JUMP_ALIGN
310.FormatStringInCSSIandReturn:
311    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
312    ret
313
314;--------------------------------------------------------------------
315; .FilterCurrentDirectory
316; .FilterUpDirectoryWhenInRoot
317;   Parameters:
318;       DL:     Zero if root directory selected
319;       DS:SI:  Ptr to DTA containing file information
320;   Returns:
321;       Nothing
322;       Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
323;   Corrupts registers:
324;       AX
325;--------------------------------------------------------------------
326ALIGN JUMP_ALIGN
327.FilterCurrentDirectory:
328    cmp     WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
329    jne     SHORT .ReturnWithoutFiltering
330    add     sp, BYTE 2      ; Remove return address from stack
331    ret
332
333ALIGN JUMP_ALIGN
334.FilterUpDirectoryWhenInRoot:
335    test    dl, dl          ; Set ZF if root directory selected
336    jnz     SHORT .ReturnWithoutFiltering
337    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
338    jne     SHORT .ReturnWithoutFiltering
339    add     sp, BYTE 2      ; Remove return address from stack
340ALIGN JUMP_ALIGN, ret
341.ReturnWithoutFiltering:
342    ret
343
344
345;--------------------------------------------------------------------
346; GetInfoLinesToCXandDialogFlagsToAX
347;   Parameters:
348;       SS:BP:  Ptr to DIALOG
349;   Returns:
350;       AX:     Dialog flags
351;       CX:     Number of info lines to be displayed
352;   Corrupts registers:
353;       SI, DS
354;--------------------------------------------------------------------
355ALIGN JUMP_ALIGN
356GetInfoLinesToCXandDialogFlagsToAX:
357    xor     ax, ax
358    call    GetDialogFlagsToAL
359    jmp     Bit_GetSetCountToCXfromAX
360
361;--------------------------------------------------------------------
362; GetDialogFlagsToAL
363;   Parameters:
364;       SS:BP:  Ptr to DIALOG
365;   Returns:
366;       AL:     Dialog flags
367;   Corrupts registers:
368;       SI, DS
369;--------------------------------------------------------------------
370ALIGN JUMP_ALIGN
371GetDialogFlagsToAL:
372    lds     si, [bp+DIALOG.fpDialogIO]
373    mov     al, [si+FILE_DIALOG_IO.bDialogFlags]
374    ret
375
376
377;--------------------------------------------------------------------
378; ParseSelectionFromItemLineInDSSI
379;   Parameters:
380;       DS:SI:  Ptr to char buffer containing file or directory to be selected
381;       SS:BP:  Ptr to DIALOG
382;   Returns:
383;       Nothing
384;   Corrupts registers:
385;       All, except BP
386;--------------------------------------------------------------------
387ALIGN JUMP_ALIGN
388ParseSelectionFromItemLineInDSSI:
389    cmp     BYTE [si], '['
390    je      SHORT .ChangeToSubdirInDSSI
391    ; Fall to .SelectFileFromDSSI
392
393;--------------------------------------------------------------------
394; .SelectFileFromDSSI
395;   Parameters:
396;       DS:SI:  Ptr to char buffer containing file name to be selected
397;       SS:BP:  Ptr to DIALOG
398;   Returns:
399;       Nothing (exits dialog)
400;   Corrupts registers:
401;       All, except BP
402;--------------------------------------------------------------------
403;ALIGN JUMP_ALIGN
404.SelectFileFromDSSI:
405    les     di, [bp+DIALOG.fpDialogIO]
406    add     di, BYTE FILE_DIALOG_IO.szFile
407    mov     cx, FILENAME_BUFFER_SIZE-1
408    cld
409    rep movsb
410    xor     ax, ax
411    stosb                       ; Terminate with NULL
412    jmp     CloseFileDialogAfterSuccessfullSelection
413
414;--------------------------------------------------------------------
415; ChangeToSubdirInDSSI
416;   Parameters:
417;       DS:SI:  NULL terminated string containing new subdir in []
418;       SS:BP:  Ptr to DIALOG
419;   Returns:
420;       Nothing
421;   Corrupts registers:
422;       All, except BP
423;--------------------------------------------------------------------
424ALIGN JUMP_ALIGN
425.ChangeToSubdirInDSSI:
426    inc     si                  ; Skip '['
427    mov     BYTE [si+12], NULL  ; Replace ']' with NULL
428    cmp     WORD [si], UPDIR_CHARACTERS
429    eCMOVE  si, g_szUpdir       ; Real DOS do not accept spaces after ".."
430    call    Directory_ChangeToPathFromDSSI
431    ; Fall to RefreshFilesToDisplay
432
433;--------------------------------------------------------------------
434; RefreshFilesToDisplay
435;   Parameters:
436;       SS:BP:  Ptr to DIALOG
437;   Returns:
438;       Nothing
439;   Corrupts registers:
440;       All, except BP
441;--------------------------------------------------------------------
442ALIGN JUMP_ALIGN
443RefreshFilesToDisplay:
444    call    InitializeMenuinitFromSSBP
445    jmp     MenuInit_RefreshMenuWindow
446
447
448;--------------------------------------------------------------------
449; HandleFunctionKeyFromAH
450;   Parameters:
451;       AH:     Scancode for function key
452;       SS:BP:  Ptr to DIALOG
453;   Returns:
454;       Nothing
455;   Corrupts registers:
456;       AX, SI, DI, BP
457;--------------------------------------------------------------------
458ALIGN JUMP_ALIGN
459HandleFunctionKeyFromAH:
460    call    GetDialogFlagsToAL
461    cmp     ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
462    je      SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
463    cmp     ah, KEY_FILEDIALOG_SELECT_DIRECTORY
464    je      SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
465    cmp     ah, KEY_FILEDIALOG_CHANGE_DRIVE
466    je      SHORT HandleFunctionKeyForDriveChange
467ReturnWithoutHandlingKeystroke:
468    clc     ; Event not processed
469    ret
470
471
472;--------------------------------------------------------------------
473; HandleFunctionKeyForCreatingNewFileOrDirectory
474;   Parameters:
475;       AL:     File dialog flags
476;       SS:BP:  Ptr to DIALOG
477;   Returns:
478;       Closes file dialog
479;   Corrupts registers:
480;       All, except BP
481;--------------------------------------------------------------------
482ALIGN JUMP_ALIGN
483HandleFunctionKeyForCreatingNewFileOrDirectory:
484    test    al, FLG_FILEDIALOG_NEW
485    jz      SHORT ReturnWithoutHandlingKeystroke
486
487    mov     cx, STRING_DIALOG_IO_size
488    call    Memory_ReserveCXbytesFromStackToDSSI
489    call    .InitializeStringDialogIoInDSSIforInputtingFileName
490
491    CALL_MENU_LIBRARY GetStringWithIoInDSSI
492    mov     al, [si+STRING_DIALOG_IO.bUserCancellation]
493    add     sp, BYTE STRING_DIALOG_IO_size
494    test    al, al      ; User cancellation?
495    jnz     SHORT ReturnWithoutHandlingKeystroke
496    jmp     CloseFileDialogAfterSuccessfullSelection
497
498ALIGN JUMP_ALIGN
499.InitializeStringDialogIoInDSSIforInputtingFileName:
500    call    InitializeNullStringsToDialogInputInDSSI
501    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
502    mov     WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
503    mov     WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
504    les     ax, [bp+DIALOG.fpDialogIO]
505    add     ax, BYTE FILE_DIALOG_IO.szFile
506    mov     [si+STRING_DIALOG_IO.fpReturnBuffer], ax
507    mov     [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
508    ret
509
510
511;--------------------------------------------------------------------
512; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
513;   Parameters:
514;       AL:     File dialog flags
515;       SS:BP:  Ptr to DIALOG
516;   Returns:
517;       Closes file dialog
518;   Corrupts registers:
519;       All, except BP
520;--------------------------------------------------------------------
521ALIGN JUMP_ALIGN
522HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
523    test    al, FLG_FILEDIALOG_DIRECTORY
524    jz      SHORT ReturnWithoutHandlingKeystroke
525    ; Fall to CloseFileDialogAfterSuccessfullSelection
526
527;--------------------------------------------------------------------
528; CloseFileDialogAfterSuccessfullSelection
529;   Parameters:
530;       SS:BP:  Ptr to DIALOG
531;   Returns:
532;       Nothing (exits dialog)
533;   Corrupts registers:
534;       All, except BP
535;--------------------------------------------------------------------
536ALIGN JUMP_ALIGN
537CloseFileDialogAfterSuccessfullSelection:
538    lds     di, [bp+DIALOG.fpDialogIO]
539    mov     BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
540    jmp     MenuInit_CloseMenuWindow
541
542
543;--------------------------------------------------------------------
544; HandleFunctionKeyForDriveChange
545;   Parameters:
546;       AL:     File dialog flags
547;       SS:BP:  Ptr to DIALOG
548;   Returns:
549;       Nothing
550;   Corrupts registers:
551;       All, except BP
552;--------------------------------------------------------------------
553ALIGN JUMP_ALIGN
554HandleFunctionKeyForDriveChange:
555    test    al, FLG_FILEDIALOG_DRIVES
556    jz      SHORT ReturnWithoutHandlingKeystroke
557
558    call    .ShowDriveSelectionDialogAndGetDriveNumberToDL
559    jnc     SHORT RefreshFilesToDisplay
560    call    Drive_SetDefaultFromDL
561    jmp     SHORT RefreshFilesToDisplay
562
563;--------------------------------------------------------------------
564; .ShowDriveSelectionDialogAndGetDriveNumberToDL
565;   Parameters:
566;       SS:BP:  Ptr to DIALOG
567;   Returns:
568;       DL:     Drive selected by user
569;       CF:     Set if new drive selected
570;               Cleared if selection cancelled by user
571;   Corrupts registers:
572;       All, except BP
573;--------------------------------------------------------------------
574ALIGN JUMP_ALIGN
575.ShowDriveSelectionDialogAndGetDriveNumberToDL:
576    mov     cx, DIALOG_INPUT_size
577    call    Memory_ReserveCXbytesFromStackToDSSI
578    call    .InitializeDialogInputInDSSIforDriveSelection
579    call    DialogSelection_GetSelectionToAXwithInputInDSSI
580    add     sp, BYTE DIALOG_INPUT_size
581    cmp     ax, BYTE NO_ITEM_SELECTED   ; Clear CF if equal
582    jne     SHORT .ConvertDriveNumberToDLfromItemIndexInAX
583    ret
584
585ALIGN JUMP_ALIGN
586.InitializeDialogInputInDSSIforDriveSelection:
587    call    InitializeNullStringsToDialogInputInDSSI
588    call    LoadItemStringBufferToESDI
589    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
590    mov     [si+DIALOG_INPUT.fszItems], di
591    mov     [si+DIALOG_INPUT.fszItems+2], es
592    call    Drive_GetFlagsForAvailableDrivesToDXAX
593    ; Fall to .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
594
595;--------------------------------------------------------------------
596; .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
597;   Parameters:
598;       DX:AX:  Drive letter flags
599;       ES:DI:  Ptr to item string buffer
600;       SS:BP:  Ptr to DIALOG
601;   Returns:
602;       Nothing
603;   Corrupts registers:
604;       AX, BX, CX, DX, DI, ES
605;--------------------------------------------------------------------
606;ALIGN JUMP_ALIGN
607.GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX:
608    cld
609    xchg    cx, ax
610    mov     ax, 3A41h       ; A:
611ALIGN JUMP_ALIGN
612.BitShiftLoop:
613    shr     dx, 1
614    rcr     cx, 1
615    jnc     SHORT .CheckIfMoreDrivesLeft
616    stosw
617    mov     BYTE [es:di], LF
618    inc     di
619ALIGN JUMP_ALIGN
620.CheckIfMoreDrivesLeft:
621    inc     ax              ; Next drive letter
622    mov     bx, dx
623    or      bx, cx
624    jnz     SHORT .BitShiftLoop
625    jmp     RemoveLastLFandTerminateESDIwithNull
626
627;--------------------------------------------------------------------
628; .ConvertDriveNumberToDLfromItemIndexInAX
629;   Parameters:
630;       AX:     Selected drive item 
631;   Returns:
632;       DL:     Drive number
633;       CF:     Set since drive selected
634;   Corrupts registers:
635;       AX, CX, DH
636;--------------------------------------------------------------------
637ALIGN JUMP_ALIGN
638.ConvertDriveNumberToDLfromItemIndexInAX:
639    mov     ah, -1
640    xchg    cx, ax
641    call    Drive_GetFlagsForAvailableDrivesToDXAX
642ALIGN JUMP_ALIGN
643.BitScanLoop:
644    shr     dx, 1
645    rcr     ax, 1
646    inc     ch              ; Increment drive number
647    sbb     cl, 0           ; Decrement selection index
648    jnc     SHORT .BitScanLoop
649    mov     dl, ch
650    stc                     ; Drive selected by user
651    ret
652
653
654;--------------------------------------------------------------------
655; InitializeNullStringsToDialogInputInDSSI
656;   Parameters:
657;       DS:SI:  Ptr to DIALOG_INPUT
658;       SS:BP:  Ptr to DIALOG
659;   Returns:
660;       Nothing
661;   Corrupts registers:
662;       AX
663;--------------------------------------------------------------------
664ALIGN JUMP_ALIGN
665InitializeNullStringsToDialogInputInDSSI:
666    mov     ax, g_szNull
667    mov     [si+DIALOG_INPUT.fszTitle], ax
668    mov     [si+DIALOG_INPUT.fszTitle+2], cs
669    mov     [si+DIALOG_INPUT.fszItems], ax
670    mov     [si+DIALOG_INPUT.fszItems+2], cs
671    mov     [si+DIALOG_INPUT.fszInfo], ax
672    mov     [si+DIALOG_INPUT.fszInfo+2], cs
673    ret
Note: See TracBrowser for help on using the repository browser.