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

Last change on this file since 599 was 596, checked in by Krister Nordvall, 6 years ago

Changes:

  • Made changes to HotkeyBar.asm to give the Boot Menu and Hotkey Bar a more consistent look. It will probably seem a bit strange at first to people used to the classic theme.
  • Added the missing parts of USE_NEC_V that should have been committed with the rest in r593.
  • Removed DEFINES_ALL_FEATURES from the BIOS makefile. It didn't work anymore and never really made sense anyway. Added all the official builds to 'make unused' instead which actually uncovered some unused code in the Tiny build.
  • XTIDECFG will no longer load color themes from unrecognized versions of the BIOS.
  • Other fixes in comments and some minor optimizations.
File size: 24.0 KB
Line 
1; Project name : Assembly Library
2; Description : Displays file dialog.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20CURRENTDIR_CHARACTERS EQU 002Eh
21UPDIR_CHARACTERS EQU 2E2Eh
22
23; Section containing code
24SECTION .text
25
26;--------------------------------------------------------------------
27; DialogFile_GetFileNameWithIoInDSSI
28; Parameters:
29; DS:SI: Ptr to FILE_DIALOG_IO
30; SS:BP: Ptr to parent MENU
31; Returns:
32; Nothing
33; Corrupts registers:
34; AX, BX, CX, DX, DI
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37DialogFile_GetFileNameWithIoInDSSI:
38 ; We need to store default drive because user might change drive but
39 ; then cancel the file selection. In that case the original default directory
40 ; must be restored.
41 call Drive_GetDefaultToAL
42 push ax
43
44 mov bx, FileEventHandler
45 mov BYTE [si+FILE_DIALOG_IO.bUserCancellation], TRUE
46 call Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
47
48 ; Now restore the default drive if user cancellation
49 pop dx
50 cmp BYTE [si+FILE_DIALOG_IO.bUserCancellation], TRUE
51 jne SHORT .UserDidNotCancel
52 jmp Drive_SetDefaultFromDL
53
54.UserDidNotCancel:
55 ret
56
57
58;--------------------------------------------------------------------
59; FileEventHandler
60; Common parameters for all events:
61; BX: Menu event (anything from MENUEVENT struct)
62; SS:BP: Ptr to DIALOG
63; Common return values for all events:
64; CF: Set if event processed
65; Cleared if event not processed
66; Corrupts registers:
67; All
68;--------------------------------------------------------------------
69ALIGN JUMP_ALIGN
70FileEventHandler:
71 jmp [cs:bx+.rgfnEventHandlers]
72
73
74ALIGN JUMP_ALIGN
75.ItemSelectedFromCX:
76 call LoadItemStringBufferToESDI
77 call Registers_CopyESDItoDSSI
78 call ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
79 jmp ParseSelectionFromItemLineInDSSI
80
81
82ALIGN JUMP_ALIGN
83.RefreshInformation:
84 call GetInfoLinesToCXandDialogFlagsToAX
85 mov si, [cs:.rgszInfoStringLookup]
86 xor bx, bx
87 xchg dx, ax
88ALIGN JUMP_ALIGN
89.InfoLineLoop:
90 shr dl, 1
91 jnc SHORT .CheckNextFlag
92 mov si, [cs:bx+.rgszInfoStringLookup]
93 push bx
94 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
95 pop bx
96ALIGN JUMP_ALIGN
97.CheckNextFlag:
98 inc bx
99 inc bx
100 loop .InfoLineLoop
101 stc ; Event processed
102 ret
103
104
105ALIGN JUMP_ALIGN
106.RefreshItemFromCX:
107 call LoadItemStringBufferToESDI
108 mov ax, FILE_STRING_LENGTH
109 xchg ax, cx
110 mul cx
111 add di, ax
112 mov si, di
113 mov bx, es
114 dec cx ; Do not print LF at the end of file string
115 CALL_DISPLAY_LIBRARY PrintCharBufferFromBXSIwithLengthInCX
116 stc
117 ret
118
119
120ALIGN WORD_ALIGN
121.rgszInfoStringLookup:
122 dw g_szChangeDrive
123 dw g_szSelectDirectory
124 dw g_szCreateNew
125
126.rgfnEventHandlers:
127istruc MENUEVENT
128 at MENUEVENT.InitializeMenuinitFromDSSI, dw InitializeMenuinitFromSSBP
129 at MENUEVENT.ExitMenu, dw Dialog_EventExitMenu
130 at MENUEVENT.IdleProcessing, dw Dialog_EventNotHandled
131 at MENUEVENT.ItemHighlightedFromCX, dw Dialog_EventNotHandled
132 at MENUEVENT.ItemSelectedFromCX, dw .ItemSelectedFromCX
133 at MENUEVENT.KeyStrokeInAX, dw HandleFunctionKeyFromAH
134 at MENUEVENT.RefreshTitle, dw Dialog_EventRefreshTitle
135 at MENUEVENT.RefreshInformation, dw .RefreshInformation
136 at MENUEVENT.RefreshItemFromCX, dw .RefreshItemFromCX
137iend
138
139
140;--------------------------------------------------------------------
141; ReInitializeMenuinitFromSSBP
142; InitializeMenuinitFromSSBP
143; Parameters:
144; SS:BP: Ptr to DIALOG
145; Returns:
146; Nothing
147; Corrupts registers:
148; All, except BP
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151ReInitializeMenuinitFromSSBP:
152 call DisplayLoadingMessageInInformationArea
153InitializeMenuinitFromSSBP:
154 call LoadItemStringBufferToESDI
155 call CreateStringFromCurrentDirectoryContentsToESDI
156 call LoadItemStringBufferToESDI
157 call SortDirectoryContentsStringFromESDIwithCountInCX
158 call RemoveLastLFandTerminateESDIwithNull
159
160 call Registers_CopySSBPtoDSSI
161 xor ax, ax
162 call Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
163 call GetInfoLinesToCXandDialogFlagsToAX
164 mov [bp+MENUINIT.bInfoLines], cl
165 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
166 mov [bp+MENUINIT.bHeight], ah ; Always max height
167 mov WORD [bp+MENU.wFirstVisibleItem], 0
168 ret
169
170
171;--------------------------------------------------------------------
172; LoadItemStringBufferToESDI
173; Parameters:
174; SS:BP: Ptr to DIALOG
175; Returns:
176; ES:DI: Ptr to item string buffer
177; Corrupts registers:
178; Nothing
179;--------------------------------------------------------------------
180ALIGN JUMP_ALIGN
181LoadItemStringBufferToESDI:
182 les di, [bp+DIALOG.fpDialogIO]
183 les di, [es:di+FILE_DIALOG_IO.fszItemBuffer]
184 ret
185
186
187;--------------------------------------------------------------------
188; CreateStringFromCurrentDirectoryContentsToESDI
189; Parameters:
190; ES:DI: Buffer where to create item string
191; SS:BP: Ptr to DIALOG
192; Returns:
193; CX: Number of files or directories found
194; Corrupts registers:
195; AX, BX, DX, SI, DI, DS
196;--------------------------------------------------------------------
197ALIGN JUMP_ALIGN
198CreateStringFromCurrentDirectoryContentsToESDI:
199 mov bx, di
200 CALL_DISPLAY_LIBRARY PushDisplayContext
201 mov cx, -1
202 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX ; ES:DI now points to buffer
203
204 lds si, [bp+DIALOG.fpDialogIO]
205 eMOVZX cx, [si+FILE_DIALOG_IO.bFileAttributes]
206 lds si, [si+FILE_DIALOG_IO.fpFileFilterString]
207 call Directory_UpdateDTAForFirstMatchForDSSIwithAttributesInCX
208
209 call .ClearDLifInRootDirectory
210 call Directory_GetDiskTransferAreaAddressToDSSI
211 xor cx, cx ; Clear file/directory count
212 call .FindMatchingFilesAndPrintThemToOffScreenBuffer
213
214 JMP_DISPLAY_LIBRARY PopDisplayContext
215
216;--------------------------------------------------------------------
217; .ClearDLifInRootDirectory
218; Parameters:
219; SS:BP: Ptr to DIALOG
220; ES:DI: Ptr to destination string buffer
221; Returns:
222; DL: Cleared if in root directory
223; Set if in any other directory
224; Corrupts registers:
225; AX, SI, DS
226;--------------------------------------------------------------------
227ALIGN JUMP_ALIGN
228.ClearDLifInRootDirectory:
229 call Registers_CopyESDItoDSSI
230 call Directory_WriteCurrentPathToDSSI
231 mov dl, [si]
232 ret
233
234;--------------------------------------------------------------------
235; .FindMatchingFilesAndPrintThemToOffScreenBuffer
236; Parameters:
237; CX: Initial directory count
238; DL: Zero if root directory selected
239; DS:SI: Ptr to DTA with first matching file
240; Returns:
241; CX: Incremented by number of files/directories found
242; Corrupts registers:
243; AX, BX, DX, DI, DS
244;--------------------------------------------------------------------
245ALIGN JUMP_ALIGN
246.FindMatchingFilesAndPrintThemToOffScreenBuffer:
247 call AppendFileFromDTAinDSSItoOffScreenBuffer
248 call Directory_UpdateDTAForNextMatchUsingPreviousParameters
249 jnc SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
250 ret
251
252
253;--------------------------------------------------------------------
254; AppendFileFromDTAinDSSItoOffScreenBuffer
255; Parameters:
256; CX: Files/directories found
257; DL: Zero if root directory selected
258; DS:SI: Ptr to DTA containing file information
259; Returns:
260; CX: Incremented by number of files/directories found
261; Corrupts registers:
262; AX, BX
263;--------------------------------------------------------------------
264ALIGN JUMP_ALIGN
265AppendFileFromDTAinDSSItoOffScreenBuffer:
266 cmp WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
267 je SHORT .Return ; We never want "."
268 test dl, dl
269 jnz SHORT .NotInRootDirectory
270 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
271 je SHORT .Return ; No ".." when in root directory
272.NotInRootDirectory:
273 inc cx ; Nothing filtered so increment files/directories
274
275 push bp
276 push si
277 push dx
278 push cx
279 call .FormatFileOrDirectoryToBufferFromDTAinDSSI
280 pop cx
281 pop dx
282 pop si
283 pop bp
284.Return:
285 ret
286
287;--------------------------------------------------------------------
288; .FormatFileOrDirectoryToBufferFromDTAinDSSI
289; Parameters:
290; DS:SI: Ptr to DTA containing file information
291; Returns:
292; Nothing
293; Corrupts registers:
294; AX, BX, CX, DX, SI, DI, BP
295;--------------------------------------------------------------------
296ALIGN JUMP_ALIGN
297.FormatFileOrDirectoryToBufferFromDTAinDSSI:
298 mov bp, sp
299 lea ax, [si+DTA.szFile]
300
301 test BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
302 jnz SHORT .FormatDirectory
303 ; Fall to .FormatFile
304
305;--------------------------------------------------------------------
306; .FormatFile
307; Parameters:
308; BP: SP before pushing formatting parameters
309; DS:AX: Far pointer to file name
310; DS:SI: Ptr to DTA containing file information
311; Returns:
312; Nothing
313; Corrupts registers:
314; AX, BX, CX, DX, SI, DI
315;--------------------------------------------------------------------
316.FormatFile:
317 xchg si, ax
318 call String_ConvertDSSItoLowerCase
319 xchg ax, si
320
321 ; Push parameters for file name
322 push ax ; Push file name offset
323 push ds ; Push file name segment
324
325 ; Push parameters for file size
326 mov ax, [si+DTA.dwFileSize]
327 mov dx, [si+DTA.dwFileSize+2]
328 xor bx, bx
329 xor cx, cx
330 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
331 mov cl, 'i'
332 cmp dl, ' '
333 eCMOVE cl, dl
334 push ax
335 push dx
336 push cx
337
338 ; Format to buffer
339 mov si, g_szFileFormat
340 jmp SHORT .FormatStringInCSSIandReturn
341
342;--------------------------------------------------------------------
343; .FormatDirectory
344; Parameters:
345; BP: SP before pushing formatting parameters
346; DS:AX: Far pointer to directory name
347; DS:SI: Ptr to DTA containing file information
348; Returns:
349; Nothing
350; Corrupts registers:
351; AX, SI, DI
352;--------------------------------------------------------------------
353ALIGN JUMP_ALIGN
354.FormatDirectory:
355 push ax ; Push directory name offset
356 push ds ; Push directory name segment
357 mov ax, g_szSub
358 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
359 eCMOVE ax, g_szUp
360 push ax
361 mov si, g_szDirectoryFormat
362ALIGN JUMP_ALIGN
363.FormatStringInCSSIandReturn:
364 JMP_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
365
366
367;--------------------------------------------------------------------
368; SortDirectoryContentsStringFromESDIwithCountInCX
369; Parameters:
370; CX: Number of files and directories
371; ES:DI: Buffer containing directory contents string
372; SS:BP: Ptr to DIALOG
373; Returns:
374; ES:DI: Ptr to end of directory contents string
375; Corrupts registers:
376; AX, BX, CX, DX, SI, DS
377;--------------------------------------------------------------------
378ALIGN JUMP_ALIGN
379SortDirectoryContentsStringFromESDIwithCountInCX:
380 call Registers_CopyESDItoDSSI
381
382 ; Add directory contents string length to DI
383 mov ax, FILE_STRING_LENGTH
384 push ax
385 mul cx
386 add di, ax
387
388 mov dx, cx
389 pop cx
390 mov bx, .FileStringComparator
391 jmp Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
392
393;--------------------------------------------------------------------
394; .FileStringComparator
395; Parameters:
396; CX: Item size in bytes
397; DS:SI: Ptr to first item to compare
398; ES:DI: Ptr to second item to compare
399; Returns:
400; FLAGS: Signed comparison between first and second item
401; Corrupts registers:
402; Nothing
403;--------------------------------------------------------------------
404ALIGN JUMP_ALIGN
405.FileStringComparator:
406 push di
407 push si
408 push cx
409 push bx
410
411 mov bx, FILE_STRING_LENGTH-2 ; Zero BH
412 cmp WORD [si], UPDIR_CHARACTERS
413 je SHORT .ForceValueFromDSSItoBeLess
414 mov bl, [si+bx]
415 cmp bl, [es:di+FILE_STRING_LENGTH-2] ; 'B' for files, 'R' for directories
416 jne SHORT .ForceValueFromDSSItoBeMoreOrLess
417 repe cmpsb ; Two directories or two files
418
419ALIGN JUMP_ALIGN
420.ReturnFromComparison:
421 pop bx
422 pop cx
423 pop si
424 pop di
425 ret
426ALIGN JUMP_ALIGN
427.ForceValueFromDSSItoBeMoreOrLess:
428 ja SHORT .ForceValueFromDSSItoBeLess ; Directory in SI, file in DI
429 xchg bl, bh
430 ; Fall to ForceValueFromDSSItoBeLess
431ALIGN JUMP_ALIGN
432.ForceValueFromDSSItoBeLess:
433 cmp bh, bl
434 jmp SHORT .ReturnFromComparison
435
436
437;--------------------------------------------------------------------
438; RemoveLastLFandTerminateESDIwithNull
439; Parameters:
440; ES:DI: Ptr to end of buffer to terminate
441; Returns:
442; Nothing
443; Corrupts registers:
444; AX
445;--------------------------------------------------------------------
446ALIGN JUMP_ALIGN
447RemoveLastLFandTerminateESDIwithNull:
448 dec di
449 xor ax, ax
450 stosb
451 ret
452
453
454;--------------------------------------------------------------------
455; GetInfoLinesToCXandDialogFlagsToAX
456; Parameters:
457; SS:BP: Ptr to DIALOG
458; Returns:
459; AX: Dialog flags
460; CX: Number of info lines to be displayed
461; Corrupts registers:
462; SI, DS
463;--------------------------------------------------------------------
464ALIGN JUMP_ALIGN
465GetInfoLinesToCXandDialogFlagsToAX:
466 ePUSH_T ax, Bit_GetSetCountToCXfromAX
467 xor ah, ah
468 ; Fall to GetDialogFlagsToAL
469
470;--------------------------------------------------------------------
471; GetDialogFlagsToAL
472; Parameters:
473; SS:BP: Ptr to DIALOG
474; Returns:
475; AL: Dialog flags
476; Corrupts registers:
477; SI, DS
478;--------------------------------------------------------------------
479ALIGN JUMP_ALIGN
480GetDialogFlagsToAL:
481 lds si, [bp+DIALOG.fpDialogIO]
482 mov al, [si+FILE_DIALOG_IO.bDialogFlags]
483 ret
484
485
486;--------------------------------------------------------------------
487; ParseSelectionFromItemLineInDSSI
488; Parameters:
489; DS:SI: Ptr to char buffer containing file or directory to be selected
490; SS:BP: Ptr to DIALOG
491; Returns:
492; Nothing
493; Corrupts registers:
494; All, except BP
495;--------------------------------------------------------------------
496ALIGN JUMP_ALIGN
497ParseSelectionFromItemLineInDSSI:
498 mov ax, [si]
499 cmp ax, UPDIR_CHARACTERS
500 je SHORT .ChangeToUpdir
501 call Char_IsUpperCaseLetterInAL
502 jc SHORT .ParseAndChangeToSubdirInDSSI
503 call Char_IsDecimalDigitInAL
504 jc SHORT .ParseAndChangeToSubdirInDSSI ; Assume subdir and check for errors
505 ; Fall to .ParseAndSelectFileFromDSSI
506
507;--------------------------------------------------------------------
508; .ParseAndSelectFileFromDSSI
509; Parameters:
510; DS:SI: NULL terminated string selected from dialog
511; SS:BP: Ptr to DIALOG
512; Returns:
513; Nothing (exits dialog)
514; Corrupts registers:
515; All, except BP
516;--------------------------------------------------------------------
517.ParseAndSelectFileFromDSSI:
518 les di, [bp+DIALOG.fpDialogIO]
519 add di, BYTE FILE_DIALOG_IO.szFile
520 mov cx, FILENAME_BUFFER_SIZE-1
521 call Memory_CopyCXbytesFromDSSItoESDI
522 xor ax, ax
523 stosb ; Terminate with NULL
524 jmp SHORT CloseFileDialogAfterSuccessfulSelection
525
526;--------------------------------------------------------------------
527; .ChangeToUpdir
528; Parameters:
529; SS:BP: Ptr to DIALOG
530; Returns:
531; Nothing
532; Corrupts registers:
533; All, except BP
534;--------------------------------------------------------------------
535ALIGN JUMP_ALIGN
536.ChangeToUpdir:
537 push cs
538 pop ds
539 mov si, g_szUpdir
540 jmp SHORT .ChangeDirectoryToDSSI
541
542;--------------------------------------------------------------------
543; .ParseAndChangeToSubdirInDSSI
544; Parameters:
545; DS:SI: NULL terminated string selected from dialog
546; SS:BP: Ptr to DIALOG
547; Returns:
548; Nothing
549; Corrupts registers:
550; All, except BP
551;--------------------------------------------------------------------
552ALIGN JUMP_ALIGN
553.ParseAndChangeToSubdirInDSSI:
554 mov BYTE [si+12], NULL ; Terminate with NULL (unnecessary spaces do not matter)
555.ChangeDirectoryToDSSI:
556 call Directory_ChangeToPathFromDSSI
557 jc SHORT .ParseAndSelectFileFromDSSI ; Must have been a file starting with number
558 ; Fall to RefreshFilesToDisplay
559
560;--------------------------------------------------------------------
561; RefreshFilesToDisplay
562; Parameters:
563; SS:BP: Ptr to DIALOG
564; Returns:
565; Nothing
566; Corrupts registers:
567; All, except BP
568;--------------------------------------------------------------------
569ALIGN JUMP_ALIGN
570RefreshFilesToDisplay:
571 call ReInitializeMenuinitFromSSBP
572 jmp MenuInit_RefreshMenuWindow
573
574
575;--------------------------------------------------------------------
576; HandleFunctionKeyFromAH
577; Parameters:
578; AH: Scancode for function key
579; SS:BP: Ptr to DIALOG
580; Returns:
581; Nothing
582; Corrupts registers:
583; AX, SI, DI, BP
584;--------------------------------------------------------------------
585ALIGN JUMP_ALIGN
586HandleFunctionKeyFromAH:
587 call GetDialogFlagsToAL
588 cmp ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
589 je SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
590 cmp ah, KEY_FILEDIALOG_SELECT_DIRECTORY
591 je SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
592 cmp ah, KEY_FILEDIALOG_CHANGE_DRIVE
593 je SHORT HandleFunctionKeyForDriveChange
594ReturnWithoutHandlingKeystroke:
595 clc ; Event not processed
596 ret
597
598
599;--------------------------------------------------------------------
600; HandleFunctionKeyForCreatingNewFileOrDirectory
601; Parameters:
602; AL: File dialog flags
603; SS:BP: Ptr to DIALOG
604; Returns:
605; Closes file dialog
606; Corrupts registers:
607; All, except BP
608;--------------------------------------------------------------------
609ALIGN JUMP_ALIGN
610HandleFunctionKeyForCreatingNewFileOrDirectory:
611 test al, FLG_FILEDIALOG_NEW
612 jz SHORT ReturnWithoutHandlingKeystroke
613
614 mov cx, STRING_DIALOG_IO_size
615 call Memory_ReserveCXbytesFromStackToDSSI
616
617;;; InitializeStringDialogIoInDSSIforInputtingFileName
618 call InitializeNullStringsToDialogInputInDSSI
619 mov WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
620 mov WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
621 mov WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
622 les ax, [bp+DIALOG.fpDialogIO]
623 add ax, BYTE FILE_DIALOG_IO.szFile
624 mov [si+STRING_DIALOG_IO.fpReturnBuffer], ax
625 mov [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
626;;;
627
628 CALL_MENU_LIBRARY GetStringWithIoInDSSI
629 mov al, [si+STRING_DIALOG_IO.bUserCancellation]
630 add sp, BYTE STRING_DIALOG_IO_size
631 test al, al ; User cancellation?
632 jnz SHORT ReturnWithoutHandlingKeystroke
633 jmp CloseFileDialogAfterSuccessfulSelection
634
635
636;--------------------------------------------------------------------
637; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
638; Parameters:
639; AL: File dialog flags
640; SS:BP: Ptr to DIALOG
641; Returns:
642; Closes file dialog
643; Corrupts registers:
644; All, except BP
645;--------------------------------------------------------------------
646ALIGN JUMP_ALIGN
647HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
648 test al, FLG_FILEDIALOG_DIRECTORY
649 jz SHORT ReturnWithoutHandlingKeystroke
650 ; Fall to CloseFileDialogAfterSuccessfulSelection
651
652;--------------------------------------------------------------------
653; CloseFileDialogAfterSuccessfulSelection
654; Parameters:
655; SS:BP: Ptr to DIALOG
656; Returns:
657; Nothing (exits dialog)
658; Corrupts registers:
659; All, except BP
660;--------------------------------------------------------------------
661ALIGN JUMP_ALIGN
662CloseFileDialogAfterSuccessfulSelection:
663 lds di, [bp+DIALOG.fpDialogIO]
664 mov BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
665 jmp MenuInit_CloseMenuWindow
666
667
668;--------------------------------------------------------------------
669; HandleFunctionKeyForDriveChange
670; Parameters:
671; AL: File dialog flags
672; SS:BP: Ptr to DIALOG
673; Returns:
674; Nothing
675; Corrupts registers:
676; All, except BP
677;--------------------------------------------------------------------
678ALIGN JUMP_ALIGN
679HandleFunctionKeyForDriveChange:
680 test al, FLG_FILEDIALOG_DRIVES
681 jz SHORT ReturnWithoutHandlingKeystroke
682
683 call DisplayLoadingMessageInInformationArea
684 mov cx, DRIVE_DIALOG_IO_size
685 call Memory_ReserveCXbytesFromStackToDSSI
686 call .DisplayDriveSelectionDialogWithIoInDSSI
687 call .ChangeDriveToUserSelectionFromIoInDSSI
688 add sp, BYTE DRIVE_DIALOG_IO_size
689.UserCancelledDriveChange:
690 ret
691
692;--------------------------------------------------------------------
693; .DisplayDriveSelectionDialogWithIoInDSSI
694; Parameters:
695; DS:SI: Ptr to uninitialized DRIVE_DIALOG_IO
696; SS:BP: Ptr to DIALOG
697; Returns:
698; DS:SI: Ptr to DRIVE_DIALOG_IO
699; Corrupts registers:
700; AX, DI
701;--------------------------------------------------------------------
702ALIGN JUMP_ALIGN
703.DisplayDriveSelectionDialogWithIoInDSSI:
704 call InitializeNullStringsToDialogInputInDSSI
705 mov WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
706 JMP_MENU_LIBRARY GetDriveWithIoInDSSI
707
708;--------------------------------------------------------------------
709; .ChangeDriveToUserSelectionFromIoInDSSI
710; Parameters:
711; DS:SI: Ptr to DRIVE_DIALOG_IO
712; SS:BP: Ptr to DIALOG
713; Returns:
714; Nothing
715; Corrupts registers:
716; All, except BP
717;--------------------------------------------------------------------
718ALIGN JUMP_ALIGN
719.ChangeDriveToUserSelectionFromIoInDSSI:
720 cmp BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
721 jne SHORT .UserCancelledDriveChange
722
723 ; Install our Custom Critical Error Handler to catch "Drive Not Ready" errors. This handler only works on DOS 3.0+ systems
724 ; but that should be OK because only DOS 3.1+ will trigger it. Under older DOS versions drives are enumerated using
725 ; GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE which will access the drive so we know it is available at this point.
726 mov dx, DosCritical_CustomHandler
727 call DosCritical_InstallNewHandlerFromCSDX
728
729 ; Save the current drive on stack in case the selected drive is not ready and the user decides to cancel the change.
730 call Drive_GetDefaultToAL
731 xchg dx, ax
732
733.RetryDrive:
734 push dx ; Save the previous current drive to stack
735
736 mov dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
737 call Drive_SetDefaultFromDL
738
739 ; Now we must try to force a media access to catch "Drive Not Ready".
740 push ds
741 push ss
742 pop ds
743 ePUSH_T ax, CURRENTDIR_CHARACTERS
744 mov cx, FLG_FILEATTR_DIRECTORY
745 mov dx, sp
746 mov ax, FIND_FIRST_MATCHING_FILE<<8
747 int DOS_INTERRUPT_21h
748 pop ax
749 pop ds
750
751 pop dx ; Restore the previous current drive from stack
752
753 xchg ah, [cs:bLastCriticalError] ; Zero bLastCriticalError and fetch error code to AH
754 cmp ah, ERR_DOS_DRIVE_NOT_READY
755 jne SHORT .DriveIsReady
756
757 mov bx, g_szDlgDriveNotReady
758 call Dialogs_DisplayYesNoResponseDialogWithTitleStringInBX
759 jz SHORT .RetryDrive
760 ; The user cancelled the drive change. Restore current drive to what it was previously.
761 call Drive_SetDefaultFromDL
762 jmp DosCritical_RestoreDosHandler
763
764.DriveIsReady:
765 call DosCritical_RestoreDosHandler
766 jmp RefreshFilesToDisplay
767
768
769;--------------------------------------------------------------------
770; DisplayLoadingMessageInInformationArea
771; Parameters:
772; SS:BP: Ptr to DIALOG
773; Returns:
774; Nothing
775; Corrupts registers:
776; AX, BX, CX, DX, SI, DI
777;--------------------------------------------------------------------
778ALIGN JUMP_ALIGN
779DisplayLoadingMessageInInformationArea:
780 call MenuText_ClearInformationArea
781 call MenuText_PrepareToDrawInformationArea
782 mov si, g_szLoadingPleaseWait
783 JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
784
785
786;--------------------------------------------------------------------
787; InitializeNullStringsToDialogInputInDSSI
788; Parameters:
789; DS:SI: Ptr to DIALOG_INPUT
790; SS:BP: Ptr to DIALOG
791; Returns:
792; Nothing
793; Corrupts registers:
794; AX
795;--------------------------------------------------------------------
796ALIGN JUMP_ALIGN
797InitializeNullStringsToDialogInputInDSSI:
798 mov ax, g_szNull
799 mov [si+DIALOG_INPUT.fszTitle], ax
800 mov [si+DIALOG_INPUT.fszTitle+2], cs
801 mov [si+DIALOG_INPUT.fszItems], ax
802 mov [si+DIALOG_INPUT.fszItems+2], cs
803 mov [si+DIALOG_INPUT.fszInfo], ax
804 mov [si+DIALOG_INPUT.fszInfo+2], cs
805 ret
Note: See TracBrowser for help on using the repository browser.