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

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

Changes to Assembly Library:
Removed Memory_ExchangeSSBPwithESDI since it obviously corrupted stack.
CGA detection is now only done once when initializing Display Context.
Moved File Library defines to File.inc.

File size: 23.1 KB
Line 
1; File name : DialogFile.asm
2; Project name : Assembly Library
3; Created date : 6.9.2010
4; Last update : 9.10.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 call LoadItemStringBufferToESDI
115 call SortDirectoryContentsStringFromESDIwithCountInCX
116 call Memory_CopySSBPtoDSSI
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 xor ax, ax
123 mov [bp+MENU.wHighlightedItem], ax
124 mov [bp+MENU.wFirstVisibleItem], ax
125 ret
126
127
128;--------------------------------------------------------------------
129; LoadItemStringBufferToESDI
130; Parameters:
131; SS:BP: Ptr to DIALOG
132; Returns:
133; ES:DI: Ptr to item string buffer
134; Corrupts registers:
135; Nothing
136;--------------------------------------------------------------------
137ALIGN JUMP_ALIGN
138LoadItemStringBufferToESDI:
139 les di, [bp+DIALOG.fpDialogIO]
140 les di, [es:di+FILE_DIALOG_IO.fszItemBuffer]
141 ret
142
143
144;--------------------------------------------------------------------
145; CreateStringFromCurrentDirectoryContentsToESDI
146; Parameters:
147; ES:DI: Buffer where to create item string
148; SS:BP: Ptr to DIALOG
149; Returns:
150; CX: Number of files or directories found
151; Corrupts registers:
152; AX, DX, SI, DI, DS, ES
153;--------------------------------------------------------------------
154ALIGN JUMP_ALIGN
155CreateStringFromCurrentDirectoryContentsToESDI:
156 lds si, [bp+DIALOG.fpDialogIO]
157 eMOVZX cx, BYTE [si+FILE_DIALOG_IO.bFileAttributes]
158 lds si, [si+FILE_DIALOG_IO.fpFileFilterString]
159 call Directory_UpdateDTAForFirstMatchForDSSIwithAttributesInCX
160 rcr cx, 1 ; Store CF
161 call .ClearDLifInRootDirectory
162 call Directory_GetDiskTransferAreaAddressToDSSI
163 rcl cx, 1 ; Restore CF
164 xor cx, cx ; Clear file/directory count
165 ; Fall to .FindMatchingFilesAndWriteThemToESDI
166
167;--------------------------------------------------------------------
168; .FindMatchingFilesAndWriteThemToESDI
169; Parameters:
170; CX: Initial directory count
171; DL: Zero if root directory selected
172; DS:SI: Ptr to DTA with first matching file
173; ES:DI: Ptr to destination string buffer
174; Returns:
175; CX: Incremented by number of files/directories found
176; Corrupts registers:
177; AX, DX, DI
178;--------------------------------------------------------------------
179;ALIGN JUMP_ALIGN
180.FindMatchingFilesAndWriteThemToESDI:
181 jc SHORT TerminateESDIwithNull
182 call AppendFileToBufferInESDIfromDtaInDSSI
183 call Directory_UpdateDTAForNextMatchUsingPreviousParameters
184 jmp SHORT .FindMatchingFilesAndWriteThemToESDI
185
186;--------------------------------------------------------------------
187; .ClearDLifInRootDirectory
188; Parameters:
189; SS:BP: Ptr to DIALOG
190; ES:DI: Ptr to destination string buffer
191; Returns:
192; DL: Cleared if in root directory
193; Set if in any other directory
194; Corrupts registers:
195; AX, SI, DS
196;--------------------------------------------------------------------
197ALIGN JUMP_ALIGN
198.ClearDLifInRootDirectory:
199 call Memory_CopyESDItoDSSI
200 call Directory_WriteCurrentPathToDSSI
201 mov dl, [si]
202 ret
203
204
205;--------------------------------------------------------------------
206; TerminateESDIwithNull
207; Parameters:
208; ES:DI: Ptr to destination string buffer
209; Returns:
210; Nothing
211; Corrupts registers:
212; AX
213;--------------------------------------------------------------------
214ALIGN JUMP_ALIGN
215TerminateESDIwithNull:
216 xor ax, ax
217 stosb
218 ret
219
220
221;--------------------------------------------------------------------
222; AppendFileToBufferInESDIfromDtaInDSSI
223; Parameters:
224; CX: Files/directores found
225; DL: Zero if root directory selected
226; DS:SI: Ptr to DTA containing file information
227; ES:DI: Ptr to destination string buffer
228; Returns:
229; CX: Incremented by number of files/directories found
230; DI: Updated for next file
231; Corrupts registers:
232; AX, BX, DX
233;--------------------------------------------------------------------
234ALIGN JUMP_ALIGN
235AppendFileToBufferInESDIfromDtaInDSSI:
236 call .FilterCurrentDirectory ; We never want "."
237 call .FilterUpDirectoryWhenInRoot ; No ".." when in root directory
238 inc cx ; Nothing filtered so increment files/directories
239 ; Fall to .PrepareBufferFormattingAndFormatFromDTAinDSSI
240
241;--------------------------------------------------------------------
242; .PrepareBufferFormattingAndFormatFromDTAinDSSI
243; Parameters:
244; DS:SI: Ptr to DTA containing file information
245; ES:DI: Ptr to destination string buffer
246; Returns:
247; DI: Updated for next file
248; Corrupts registers:
249; AX, BX, DX
250;--------------------------------------------------------------------
251;ALIGN JUMP_ALIGN
252.PrepareBufferFormattingAndFormatFromDTAinDSSI:
253 push bp
254 push si
255 push cx
256 mov bx, di
257 CALL_DISPLAY_LIBRARY PushDisplayContext
258 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXtoESDI
259
260 call .FormatFileOrDirectoryToBufferFromDTAinDSSI
261
262 CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
263 xchg bx, ax
264 CALL_DISPLAY_LIBRARY PopDisplayContext
265 mov di, bx
266 pop cx
267 pop si
268 pop bp
269 ret
270
271;--------------------------------------------------------------------
272; .FormatFileOrDirectoryToBufferFromDTAinDSSI
273; Parameters:
274; DS:SI: Ptr to DTA containing file information
275; Returns:
276; Nothing
277; Corrupts registers:
278; AX, BX, CX, DX, SI, DI, BP
279;--------------------------------------------------------------------
280ALIGN JUMP_ALIGN
281.FormatFileOrDirectoryToBufferFromDTAinDSSI:
282 mov bp, sp
283 lea ax, [si+DTA.szFile]
284
285 test BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
286 jnz SHORT .FormatDirectory
287 ; Fall to .FormatFile
288
289;--------------------------------------------------------------------
290; .FormatFile
291; Parameters:
292; BP: SP before pushing formatting parameters
293; DS:AX: Far pointer to file name
294; DS:SI: Ptr to DTA containing file information
295; Returns:
296; Nothing
297; Corrupts registers:
298; AX, BX, CX, DX, SI, DI, BP
299;--------------------------------------------------------------------
300.FormatFile:
301 ; Push parameters for file name
302 xchg si, ax
303 call String_ConvertDSSItoLowerCase
304 xchg ax, si
305 push ax ; Push directory name offset
306 push ds ; Push directory name segment
307
308 ; Push parameters for file size
309 mov ax, [si+DTA.dwFileSize]
310 mov dx, [si+DTA.dwFileSize+2]
311 xor bx, bx
312 xor cx, cx
313 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
314 mov cl, 'i'
315 cmp dl, ' '
316 eCMOVE cl, dl
317 push ax
318 push dx
319 push cx
320
321 ; Format to buffer
322 mov si, g_szFileFormat
323 jmp SHORT .FormatStringInCSSIandReturn
324
325;--------------------------------------------------------------------
326; .FormatDirectory
327; Parameters:
328; BP: SP before pushing formatting parameters
329; DS:AX: Far pointer to directory name
330; DS:SI: Ptr to DTA containing file information
331; Returns:
332; Nothing
333; Corrupts registers:
334; AX, BX, CX, DX, SI, DI, BP
335;--------------------------------------------------------------------
336ALIGN JUMP_ALIGN
337.FormatDirectory:
338 push ax ; Push directory name offset
339 push ds ; Push directory name segment
340 mov ax, g_szSub
341 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
342 eCMOVE ax, g_szUp
343 push ax
344 mov si, g_szDirectoryFormat
345ALIGN JUMP_ALIGN
346.FormatStringInCSSIandReturn:
347 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
348 ret
349
350;--------------------------------------------------------------------
351; .FilterCurrentDirectory
352; .FilterUpDirectoryWhenInRoot
353; Parameters:
354; DL: Zero if root directory selected
355; DS:SI: Ptr to DTA containing file information
356; Returns:
357; Nothing
358; Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
359; Corrupts registers:
360; AX
361;--------------------------------------------------------------------
362ALIGN JUMP_ALIGN
363.FilterCurrentDirectory:
364 cmp WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
365 jne SHORT .ReturnWithoutFiltering
366 add sp, BYTE 2 ; Remove return address from stack
367 ret
368
369ALIGN JUMP_ALIGN
370.FilterUpDirectoryWhenInRoot:
371 test dl, dl ; Set ZF if root directory selected
372 jnz SHORT .ReturnWithoutFiltering
373 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
374 jne SHORT .ReturnWithoutFiltering
375 add sp, BYTE 2 ; Remove return address from stack
376ALIGN JUMP_ALIGN, ret
377.ReturnWithoutFiltering:
378 ret
379
380
381;--------------------------------------------------------------------
382; SortDirectoryContentsStringFromESDIwithCountInCX
383; Parameters:
384; CX: Number of files and directories
385; ES:DI: Buffer containing directory contents string
386; SS:BP: Ptr to DIALOG
387; Returns:
388; Nothing
389; Corrupts registers:
390; AX, BX, CX, DX, SI, DI, DS, ES
391;--------------------------------------------------------------------
392ALIGN JUMP_ALIGN
393SortDirectoryContentsStringFromESDIwithCountInCX:
394 call Memory_ExchangeDSSIwithESDI
395 mov bx, .FileStringComparator
396 xchg dx, cx
397 mov cx, FILE_STRING_LENGTH
398 jmp Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
399
400;--------------------------------------------------------------------
401; .FileStringComparator
402; Parameters:
403; CX: Item size in bytes
404; DS:SI: Ptr to first item to compare
405; ES:DI: Ptr to second item to compare
406; Returns:
407; FLAGS: Signed comparition between first and second item
408; Corrupts registers:
409; Nothing
410;--------------------------------------------------------------------
411ALIGN JUMP_ALIGN
412.FileStringComparator:
413 push di
414 push si
415 push cx
416 push bx
417
418 mov bx, FILE_STRING_LENGTH-2 ; Zero BH
419 cmp WORD [si], UPDIR_CHARACTERS
420 je SHORT .ForceValueFromDSSItoBeLess
421 mov bl, [si+bx]
422 cmp bl, [es:di+FILE_STRING_LENGTH-2] ; 'B' for files, 'R' for directories
423 jne SHORT .ForceValueFromDSSItoBeMoreOrLess
424 repe cmpsb ; Two directories or two files
425
426ALIGN JUMP_ALIGN
427.ReturnFromComparison:
428 pop bx
429 pop cx
430 pop si
431 pop di
432 ret
433ALIGN JUMP_ALIGN
434.ForceValueFromDSSItoBeMoreOrLess:
435 ja SHORT .ForceValueFromDSSItoBeLess ; Directory in SI, file in DI
436 xchg bl, bh
437 ; Fall to ForceValueFromDSSItoBeLess
438ALIGN JUMP_ALIGN
439.ForceValueFromDSSItoBeLess:
440 cmp bh, bl
441 jmp SHORT .ReturnFromComparison
442
443
444;--------------------------------------------------------------------
445; GetInfoLinesToCXandDialogFlagsToAX
446; Parameters:
447; SS:BP: Ptr to DIALOG
448; Returns:
449; AX: Dialog flags
450; CX: Number of info lines to be displayed
451; Corrupts registers:
452; SI, DS
453;--------------------------------------------------------------------
454ALIGN JUMP_ALIGN
455GetInfoLinesToCXandDialogFlagsToAX:
456 xor ax, ax
457 call GetDialogFlagsToAL
458 jmp Bit_GetSetCountToCXfromAX
459
460;--------------------------------------------------------------------
461; GetDialogFlagsToAL
462; Parameters:
463; SS:BP: Ptr to DIALOG
464; Returns:
465; AL: Dialog flags
466; Corrupts registers:
467; SI, DS
468;--------------------------------------------------------------------
469ALIGN JUMP_ALIGN
470GetDialogFlagsToAL:
471 lds si, [bp+DIALOG.fpDialogIO]
472 mov al, [si+FILE_DIALOG_IO.bDialogFlags]
473 ret
474
475
476;--------------------------------------------------------------------
477; ParseSelectionFromItemLineInDSSI
478; Parameters:
479; DS:SI: Ptr to char buffer containing file or directory to be selected
480; SS:BP: Ptr to DIALOG
481; Returns:
482; Nothing
483; Corrupts registers:
484; All, except BP
485;--------------------------------------------------------------------
486ALIGN JUMP_ALIGN
487ParseSelectionFromItemLineInDSSI:
488 mov ax, [si]
489 cmp ax, UPDIR_CHARACTERS
490 je SHORT .ChangeToUpdir
491 call Char_IsUpperCaseLetterInAL
492 jc SHORT .ParseAndChangeToSubdirInDSSI
493 ; Fall to .ParseAndSelectFileFromDSSI
494
495;--------------------------------------------------------------------
496; .ParseAndSelectFileFromDSSI
497; Parameters:
498; DS:SI: NULL terminated string selected from dialog
499; SS:BP: Ptr to DIALOG
500; Returns:
501; Nothing (exits dialog)
502; Corrupts registers:
503; All, except BP
504;--------------------------------------------------------------------
505.ParseAndSelectFileFromDSSI:
506 les di, [bp+DIALOG.fpDialogIO]
507 add di, BYTE FILE_DIALOG_IO.szFile
508 mov cx, FILENAME_BUFFER_SIZE-1
509 call Memory_CopyCXbytesFromDSSItoESDI
510 xor ax, ax
511 stosb ; Terminate with NULL
512 jmp SHORT CloseFileDialogAfterSuccessfullSelection
513
514;--------------------------------------------------------------------
515; .ChangeToUpdir
516; Parameters:
517; SS:BP: Ptr to DIALOG
518; Returns:
519; Nothing
520; Corrupts registers:
521; All, except BP
522;--------------------------------------------------------------------
523ALIGN JUMP_ALIGN
524.ChangeToUpdir:
525 mov si, g_szUpdir
526 jmp SHORT .ChangeDirectoryToDSSI
527
528;--------------------------------------------------------------------
529; .ParseAndChangeToSubdirInDSSI
530; Parameters:
531; DS:SI: NULL terminated string selected from dialog
532; SS:BP: Ptr to DIALOG
533; Returns:
534; Nothing
535; Corrupts registers:
536; All, except BP
537;--------------------------------------------------------------------
538ALIGN JUMP_ALIGN
539.ParseAndChangeToSubdirInDSSI:
540 mov BYTE [si+12], NULL ; Terminate with NULL (unnecessary spaces do not matter)
541.ChangeDirectoryToDSSI:
542 call Directory_ChangeToPathFromDSSI
543 ; Fall to RefreshFilesToDisplay
544
545;--------------------------------------------------------------------
546; RefreshFilesToDisplay
547; Parameters:
548; SS:BP: Ptr to DIALOG
549; Returns:
550; Nothing
551; Corrupts registers:
552; All, except BP
553;--------------------------------------------------------------------
554ALIGN JUMP_ALIGN
555RefreshFilesToDisplay:
556 call InitializeMenuinitFromSSBP
557 jmp MenuInit_RefreshMenuWindow
558
559
560;--------------------------------------------------------------------
561; HandleFunctionKeyFromAH
562; Parameters:
563; AH: Scancode for function key
564; SS:BP: Ptr to DIALOG
565; Returns:
566; Nothing
567; Corrupts registers:
568; AX, SI, DI, BP
569;--------------------------------------------------------------------
570ALIGN JUMP_ALIGN
571HandleFunctionKeyFromAH:
572 call GetDialogFlagsToAL
573 cmp ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
574 je SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
575 cmp ah, KEY_FILEDIALOG_SELECT_DIRECTORY
576 je SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
577 cmp ah, KEY_FILEDIALOG_CHANGE_DRIVE
578 je SHORT HandleFunctionKeyForDriveChange
579ReturnWithoutHandlingKeystroke:
580 clc ; Event not processed
581 ret
582
583
584;--------------------------------------------------------------------
585; HandleFunctionKeyForCreatingNewFileOrDirectory
586; Parameters:
587; AL: File dialog flags
588; SS:BP: Ptr to DIALOG
589; Returns:
590; Closes file dialog
591; Corrupts registers:
592; All, except BP
593;--------------------------------------------------------------------
594ALIGN JUMP_ALIGN
595HandleFunctionKeyForCreatingNewFileOrDirectory:
596 test al, FLG_FILEDIALOG_NEW
597 jz SHORT ReturnWithoutHandlingKeystroke
598
599 mov cx, STRING_DIALOG_IO_size
600 call Memory_ReserveCXbytesFromStackToDSSI
601 call .InitializeStringDialogIoInDSSIforInputtingFileName
602
603 CALL_MENU_LIBRARY GetStringWithIoInDSSI
604 mov al, [si+STRING_DIALOG_IO.bUserCancellation]
605 add sp, BYTE STRING_DIALOG_IO_size
606 test al, al ; User cancellation?
607 jnz SHORT ReturnWithoutHandlingKeystroke
608 jmp CloseFileDialogAfterSuccessfullSelection
609
610ALIGN JUMP_ALIGN
611.InitializeStringDialogIoInDSSIforInputtingFileName:
612 call InitializeNullStringsToDialogInputInDSSI
613 mov WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
614 mov WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
615 mov WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
616 les ax, [bp+DIALOG.fpDialogIO]
617 add ax, BYTE FILE_DIALOG_IO.szFile
618 mov [si+STRING_DIALOG_IO.fpReturnBuffer], ax
619 mov [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
620 ret
621
622
623;--------------------------------------------------------------------
624; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
625; Parameters:
626; AL: File dialog flags
627; SS:BP: Ptr to DIALOG
628; Returns:
629; Closes file dialog
630; Corrupts registers:
631; All, except BP
632;--------------------------------------------------------------------
633ALIGN JUMP_ALIGN
634HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
635 test al, FLG_FILEDIALOG_DIRECTORY
636 jz SHORT ReturnWithoutHandlingKeystroke
637 ; Fall to CloseFileDialogAfterSuccessfullSelection
638
639;--------------------------------------------------------------------
640; CloseFileDialogAfterSuccessfullSelection
641; Parameters:
642; SS:BP: Ptr to DIALOG
643; Returns:
644; Nothing (exits dialog)
645; Corrupts registers:
646; All, except BP
647;--------------------------------------------------------------------
648ALIGN JUMP_ALIGN
649CloseFileDialogAfterSuccessfullSelection:
650 lds di, [bp+DIALOG.fpDialogIO]
651 mov BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
652 jmp MenuInit_CloseMenuWindow
653
654
655;--------------------------------------------------------------------
656; HandleFunctionKeyForDriveChange
657; Parameters:
658; AL: File dialog flags
659; SS:BP: Ptr to DIALOG
660; Returns:
661; Nothing
662; Corrupts registers:
663; All, except BP
664;--------------------------------------------------------------------
665ALIGN JUMP_ALIGN
666HandleFunctionKeyForDriveChange:
667 test al, FLG_FILEDIALOG_DRIVES
668 jz SHORT ReturnWithoutHandlingKeystroke
669
670 call .ShowDriveSelectionDialogAndGetDriveNumberToDL
671 jnc SHORT RefreshFilesToDisplay
672 call Drive_SetDefaultFromDL
673 jmp SHORT RefreshFilesToDisplay
674
675;--------------------------------------------------------------------
676; .ShowDriveSelectionDialogAndGetDriveNumberToDL
677; Parameters:
678; SS:BP: Ptr to DIALOG
679; Returns:
680; DL: Drive selected by user
681; CF: Set if new drive selected
682; Cleared if selection cancelled by user
683; Corrupts registers:
684; All, except BP
685;--------------------------------------------------------------------
686ALIGN JUMP_ALIGN
687.ShowDriveSelectionDialogAndGetDriveNumberToDL:
688 mov cx, DIALOG_INPUT_size
689 call Memory_ReserveCXbytesFromStackToDSSI
690 call .InitializeDialogInputInDSSIforDriveSelection
691 call DialogSelection_GetSelectionToAXwithInputInDSSI
692 add sp, BYTE DIALOG_INPUT_size
693 cmp ax, BYTE NO_ITEM_SELECTED ; Clear CF if equal
694 jne SHORT .ConvertDriveNumberToDLfromItemIndexInAX
695 ret
696
697ALIGN JUMP_ALIGN
698.InitializeDialogInputInDSSIforDriveSelection:
699 call InitializeNullStringsToDialogInputInDSSI
700 call LoadItemStringBufferToESDI
701 mov WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
702 mov [si+DIALOG_INPUT.fszItems], di
703 mov [si+DIALOG_INPUT.fszItems+2], es
704 call Drive_GetFlagsForAvailableDrivesToDXAX
705 ; Fall to .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
706
707;--------------------------------------------------------------------
708; .GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX
709; Parameters:
710; DX:AX: Drive letter flags
711; ES:DI: Ptr to item string buffer
712; SS:BP: Ptr to DIALOG
713; Returns:
714; Nothing
715; Corrupts registers:
716; AX, BX, CX, DX, DI, ES
717;--------------------------------------------------------------------
718;ALIGN JUMP_ALIGN
719.GenerateDriveSelectionStringToESDIfromDriveFlagsInDXAX:
720 cld
721 xchg cx, ax
722 mov ax, 3A41h ; A:
723ALIGN JUMP_ALIGN
724.BitShiftLoop:
725 shr dx, 1
726 rcr cx, 1
727 jnc SHORT .CheckIfMoreDrivesLeft
728 stosw
729 mov BYTE [es:di], LF
730 inc di
731ALIGN JUMP_ALIGN
732.CheckIfMoreDrivesLeft:
733 inc ax ; Next drive letter
734 mov bx, dx
735 or bx, cx
736 jnz SHORT .BitShiftLoop
737 jmp TerminateESDIwithNull
738
739;--------------------------------------------------------------------
740; .ConvertDriveNumberToDLfromItemIndexInAX
741; Parameters:
742; AX: Selected drive item
743; Returns:
744; DL: Drive number
745; CF: Set since drive selected
746; Corrupts registers:
747; AX, CX, DH
748;--------------------------------------------------------------------
749ALIGN JUMP_ALIGN
750.ConvertDriveNumberToDLfromItemIndexInAX:
751 mov ah, -1
752 xchg cx, ax
753 call Drive_GetFlagsForAvailableDrivesToDXAX
754ALIGN JUMP_ALIGN
755.BitScanLoop:
756 shr dx, 1
757 rcr ax, 1
758 inc ch ; Increment drive number
759 sbb cl, 0 ; Decrement selection index
760 jnc SHORT .BitScanLoop
761 mov dl, ch
762 stc ; Drive selected by user
763 ret
764
765
766;--------------------------------------------------------------------
767; InitializeNullStringsToDialogInputInDSSI
768; Parameters:
769; DS:SI: Ptr to DIALOG_INPUT
770; SS:BP: Ptr to DIALOG
771; Returns:
772; Nothing
773; Corrupts registers:
774; AX
775;--------------------------------------------------------------------
776ALIGN JUMP_ALIGN
777InitializeNullStringsToDialogInputInDSSI:
778 mov ax, g_szNull
779 mov [si+DIALOG_INPUT.fszTitle], ax
780 mov [si+DIALOG_INPUT.fszTitle+2], cs
781 mov [si+DIALOG_INPUT.fszItems], ax
782 mov [si+DIALOG_INPUT.fszItems+2], cs
783 mov [si+DIALOG_INPUT.fszInfo], ax
784 mov [si+DIALOG_INPUT.fszInfo+2], cs
785 ret
Note: See TracBrowser for help on using the repository browser.