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

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

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

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 : 27.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 dl, ATTRIBUTES_NOT_USED
256 mov ax, BUFFER_OUTPUT_WITH_CHAR_ONLY
257 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInDL
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.