source: xtideuniversalbios/tags/v2.0.0_beta_3/Assembly_Library/Src/Menu/Dialog/DialogFile.asm@ 514

Last change on this file since 514 was 505, checked in by krille_n_@…, 11 years ago

Changes:

  • Reverted the changes to MenuEvents.inc done in r492 since they broke the F1 key function in XTIDECFG.
  • Added a tail-call optimized variant of the CALL_DISPLAY_LIBRARY macro (JMP_DISPLAY_LIBRARY).
  • Put a block size limit in AH1Eh_ChangeXTCFmodeBasedOnControlRegisterInAL. I think it's needed but if not, it's easy to remove.
  • Other optimizations and fixes.
File size: 22.9 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-2012 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, SI, DI
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37DialogFile_GetFileNameWithIoInDSSI:
38 mov bx, FileEventHandler
39 mov BYTE [si+FILE_DIALOG_IO.bUserCancellation], TRUE
40 jmp Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
41
42
43;--------------------------------------------------------------------
44; FileEventHandler
45; Common parameters for all events:
46; BX: Menu event (anything from MENUEVENT struct)
47; SS:BP: Ptr to DIALOG
48; Common return values for all events:
49; CF: Set if event processed
50; Cleared if event not processed
51; Corrupts registers:
52; All
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
55FileEventHandler:
56 jmp [cs:bx+.rgfnEventHandlers]
57
58
59ALIGN JUMP_ALIGN
60.ItemSelectedFromCX:
61 call LoadItemStringBufferToESDI
62 call Registers_CopyESDItoDSSI
63 call ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
64 jmp ParseSelectionFromItemLineInDSSI
65
66
67ALIGN JUMP_ALIGN
68.RefreshInformation:
69 call GetInfoLinesToCXandDialogFlagsToAX
70 mov si, [cs:.rgszInfoStringLookup]
71 xor bx, bx
72 xchg dx, ax
73ALIGN JUMP_ALIGN
74.InfoLineLoop:
75 shr dl, 1
76 jnc SHORT .CheckNextFlag
77 mov si, [cs:bx+.rgszInfoStringLookup]
78 push bx
79 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
80 pop bx
81ALIGN JUMP_ALIGN
82.CheckNextFlag:
83 inc bx
84 inc bx
85 loop .InfoLineLoop
86 stc ; Event processed
87 ret
88
89
90ALIGN JUMP_ALIGN
91.RefreshItemFromCX:
92 call LoadItemStringBufferToESDI
93 mov ax, FILE_STRING_LENGTH
94 xchg ax, cx
95 mul cx
96 add di, ax
97 mov si, di
98 mov bx, es
99 dec cx ; Do not print LF at the end of file string
100 CALL_DISPLAY_LIBRARY PrintCharBufferFromBXSIwithLengthInCX
101 stc
102 ret
103
104
105ALIGN WORD_ALIGN
106.rgszInfoStringLookup:
107 dw g_szChangeDrive
108 dw g_szSelectDirectory
109 dw g_szCreateNew
110
111.rgfnEventHandlers:
112istruc MENUEVENT
113 at MENUEVENT.InitializeMenuinitFromDSSI, dw InitializeMenuinitFromSSBP
114 at MENUEVENT.ExitMenu, dw Dialog_EventExitMenu
115 at MENUEVENT.IdleProcessing, dw Dialog_EventNotHandled
116 at MENUEVENT.ItemHighlightedFromCX, dw Dialog_EventNotHandled
117 at MENUEVENT.ItemSelectedFromCX, dw .ItemSelectedFromCX
118 at MENUEVENT.KeyStrokeInAX, dw HandleFunctionKeyFromAH
119 at MENUEVENT.RefreshTitle, dw Dialog_EventRefreshTitle
120 at MENUEVENT.RefreshInformation, dw .RefreshInformation
121 at MENUEVENT.RefreshItemFromCX, dw .RefreshItemFromCX
122iend
123
124
125;--------------------------------------------------------------------
126; ReInitializeMenuinitFromSSBP
127; InitializeMenuinitFromSSBP
128; Parameters:
129; SS:BP: Ptr to DIALOG
130; Returns:
131; Nothing
132; Corrupts registers:
133; All, except BP
134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
136ReInitializeMenuinitFromSSBP:
137 call DisplayLoadingMessageInInformationArea
138InitializeMenuinitFromSSBP:
139 call LoadItemStringBufferToESDI
140 call CreateStringFromCurrentDirectoryContentsToESDI
141 call LoadItemStringBufferToESDI
142 call SortDirectoryContentsStringFromESDIwithCountInCX
143 call RemoveLastLFandTerminateESDIwithNull
144
145 call Registers_CopySSBPtoDSSI
146 xor ax, ax
147 call Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
148 call GetInfoLinesToCXandDialogFlagsToAX
149 mov [bp+MENUINIT.bInfoLines], cl
150 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
151 mov [bp+MENUINIT.bHeight], ah ; Always max height
152 mov WORD [bp+MENU.wFirstVisibleItem], 0
153 ret
154
155
156;--------------------------------------------------------------------
157; LoadItemStringBufferToESDI
158; Parameters:
159; SS:BP: Ptr to DIALOG
160; Returns:
161; ES:DI: Ptr to item string buffer
162; Corrupts registers:
163; Nothing
164;--------------------------------------------------------------------
165ALIGN JUMP_ALIGN
166LoadItemStringBufferToESDI:
167 les di, [bp+DIALOG.fpDialogIO]
168 les di, [es:di+FILE_DIALOG_IO.fszItemBuffer]
169 ret
170
171
172;--------------------------------------------------------------------
173; CreateStringFromCurrentDirectoryContentsToESDI
174; Parameters:
175; ES:DI: Buffer where to create item string
176; SS:BP: Ptr to DIALOG
177; Returns:
178; CX: Number of files or directories found
179; Corrupts registers:
180; AX, BX, DX, SI, DI, DS
181;--------------------------------------------------------------------
182ALIGN JUMP_ALIGN
183CreateStringFromCurrentDirectoryContentsToESDI:
184 mov bx, di
185 CALL_DISPLAY_LIBRARY PushDisplayContext
186 mov cx, -1
187 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX ; ES:DI now points to buffer
188
189 lds si, [bp+DIALOG.fpDialogIO]
190 eMOVZX cx, [si+FILE_DIALOG_IO.bFileAttributes]
191 lds si, [si+FILE_DIALOG_IO.fpFileFilterString]
192 call Directory_UpdateDTAForFirstMatchForDSSIwithAttributesInCX
193
194 call .ClearDLifInRootDirectory
195 call Directory_GetDiskTransferAreaAddressToDSSI
196 xor cx, cx ; Clear file/directory count
197 call .FindMatchingFilesAndPrintThemToOffScreenBuffer
198
199 JMP_DISPLAY_LIBRARY PopDisplayContext
200
201;--------------------------------------------------------------------
202; .ClearDLifInRootDirectory
203; Parameters:
204; SS:BP: Ptr to DIALOG
205; ES:DI: Ptr to destination string buffer
206; Returns:
207; DL: Cleared if in root directory
208; Set if in any other directory
209; Corrupts registers:
210; AX, SI, DS
211;--------------------------------------------------------------------
212ALIGN JUMP_ALIGN
213.ClearDLifInRootDirectory:
214 call Registers_CopyESDItoDSSI
215 call Directory_WriteCurrentPathToDSSI
216 mov dl, [si]
217 ret
218
219;--------------------------------------------------------------------
220; .FindMatchingFilesAndPrintThemToOffScreenBuffer
221; Parameters:
222; CX: Initial directory count
223; DL: Zero if root directory selected
224; DS:SI: Ptr to DTA with first matching file
225; Returns:
226; CX: Incremented by number of files/directories found
227; Corrupts registers:
228; AX, BX, DX, DI, DS
229;--------------------------------------------------------------------
230ALIGN JUMP_ALIGN
231.FindMatchingFilesAndPrintThemToOffScreenBuffer:
232 call AppendFileFromDTAinDSSItoOffScreenBuffer
233 call Directory_UpdateDTAForNextMatchUsingPreviousParameters
234 jnc SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
235 ret
236
237
238;--------------------------------------------------------------------
239; AppendFileFromDTAinDSSItoOffScreenBuffer
240; Parameters:
241; CX: Files/directores found
242; DL: Zero if root directory selected
243; DS:SI: Ptr to DTA containing file information
244; Returns:
245; CX: Incremented by number of files/directories found
246; Corrupts registers:
247; AX, BX
248;--------------------------------------------------------------------
249ALIGN JUMP_ALIGN
250AppendFileFromDTAinDSSItoOffScreenBuffer:
251 call .FilterCurrentDirectory ; We never want "."
252 call .FilterUpDirectoryWhenInRoot ; No ".." when in root directory
253 inc cx ; Nothing filtered so increment files/directories
254
255 push bp
256 push si
257 push dx
258 push cx
259 call .FormatFileOrDirectoryToBufferFromDTAinDSSI
260 pop cx
261 pop dx
262 pop si
263 pop bp
264 ret
265
266;--------------------------------------------------------------------
267; .FilterCurrentDirectory
268; .FilterUpDirectoryWhenInRoot
269; Parameters:
270; DL: Zero if root directory selected
271; DS:SI: Ptr to DTA containing file information
272; Returns:
273; Nothing
274; Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
275; Corrupts registers:
276; AX
277;--------------------------------------------------------------------
278ALIGN JUMP_ALIGN
279.FilterCurrentDirectory:
280 cmp WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
281 je SHORT .DoFilter
282 ret
283
284ALIGN JUMP_ALIGN
285.FilterUpDirectoryWhenInRoot:
286 test dl, dl ; Set ZF if root directory selected
287 jnz SHORT .ReturnWithoutFiltering
288 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
289 jne SHORT .ReturnWithoutFiltering
290.DoFilter:
291 add sp, BYTE 2 ; Remove return address from stack
292ALIGN JUMP_ALIGN, ret
293.ReturnWithoutFiltering:
294 ret
295
296;--------------------------------------------------------------------
297; .FormatFileOrDirectoryToBufferFromDTAinDSSI
298; Parameters:
299; DS:SI: Ptr to DTA containing file information
300; Returns:
301; Nothing
302; Corrupts registers:
303; AX, BX, CX, DX, SI, DI, BP
304;--------------------------------------------------------------------
305ALIGN JUMP_ALIGN
306.FormatFileOrDirectoryToBufferFromDTAinDSSI:
307 mov bp, sp
308 lea ax, [si+DTA.szFile]
309
310 test BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
311 jnz SHORT .FormatDirectory
312 ; Fall to .FormatFile
313
314;--------------------------------------------------------------------
315; .FormatFile
316; Parameters:
317; BP: SP before pushing formatting parameters
318; DS:AX: Far pointer to file name
319; DS:SI: Ptr to DTA containing file information
320; Returns:
321; Nothing
322; Corrupts registers:
323; AX, BX, CX, DX, SI, DI
324;--------------------------------------------------------------------
325.FormatFile:
326 xchg si, ax
327 call String_ConvertDSSItoLowerCase
328 xchg ax, si
329
330 ; Push parameters for file name
331 push ax ; Push file name offset
332 push ds ; Push file name segment
333
334 ; Push parameters for file size
335 mov ax, [si+DTA.dwFileSize]
336 mov dx, [si+DTA.dwFileSize+2]
337 xor bx, bx
338 xor cx, cx
339 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
340 mov cl, 'i'
341 cmp dl, ' '
342 eCMOVE cl, dl
343 push ax
344 push dx
345 push cx
346
347 ; Format to buffer
348 mov si, g_szFileFormat
349 jmp SHORT .FormatStringInCSSIandReturn
350
351;--------------------------------------------------------------------
352; .FormatDirectory
353; Parameters:
354; BP: SP before pushing formatting parameters
355; DS:AX: Far pointer to directory name
356; DS:SI: Ptr to DTA containing file information
357; Returns:
358; Nothing
359; Corrupts registers:
360; AX, SI, DI
361;--------------------------------------------------------------------
362ALIGN JUMP_ALIGN
363.FormatDirectory:
364 push ax ; Push directory name offset
365 push ds ; Push directory name segment
366 mov ax, g_szSub
367 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS
368 eCMOVE ax, g_szUp
369 push ax
370 mov si, g_szDirectoryFormat
371ALIGN JUMP_ALIGN
372.FormatStringInCSSIandReturn:
373 JMP_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
374
375
376;--------------------------------------------------------------------
377; SortDirectoryContentsStringFromESDIwithCountInCX
378; Parameters:
379; CX: Number of files and directories
380; ES:DI: Buffer containing directory contents string
381; SS:BP: Ptr to DIALOG
382; Returns:
383; ES:DI: Ptr to end of directory contents string
384; Corrupts registers:
385; AX, BX, CX, DX, SI, DS
386;--------------------------------------------------------------------
387ALIGN JUMP_ALIGN
388SortDirectoryContentsStringFromESDIwithCountInCX:
389 call Registers_CopyESDItoDSSI
390
391 ; Add directory contents string length to DI
392 mov ax, FILE_STRING_LENGTH
393 push ax
394 mul cx
395 add di, ax
396
397 mov dx, cx
398 pop cx
399 mov bx, .FileStringComparator
400 jmp Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
401
402;--------------------------------------------------------------------
403; .FileStringComparator
404; Parameters:
405; CX: Item size in bytes
406; DS:SI: Ptr to first item to compare
407; ES:DI: Ptr to second item to compare
408; Returns:
409; FLAGS: Signed comparison between first and second item
410; Corrupts registers:
411; Nothing
412;--------------------------------------------------------------------
413ALIGN JUMP_ALIGN
414.FileStringComparator:
415 push di
416 push si
417 push cx
418 push bx
419
420 mov bx, FILE_STRING_LENGTH-2 ; Zero BH
421 cmp WORD [si], UPDIR_CHARACTERS
422 je SHORT .ForceValueFromDSSItoBeLess
423 mov bl, [si+bx]
424 cmp bl, [es:di+FILE_STRING_LENGTH-2] ; 'B' for files, 'R' for directories
425 jne SHORT .ForceValueFromDSSItoBeMoreOrLess
426 repe cmpsb ; Two directories or two files
427
428ALIGN JUMP_ALIGN
429.ReturnFromComparison:
430 pop bx
431 pop cx
432 pop si
433 pop di
434 ret
435ALIGN JUMP_ALIGN
436.ForceValueFromDSSItoBeMoreOrLess:
437 ja SHORT .ForceValueFromDSSItoBeLess ; Directory in SI, file in DI
438 xchg bl, bh
439 ; Fall to ForceValueFromDSSItoBeLess
440ALIGN JUMP_ALIGN
441.ForceValueFromDSSItoBeLess:
442 cmp bh, bl
443 jmp SHORT .ReturnFromComparison
444
445
446;--------------------------------------------------------------------
447; RemoveLastLFandTerminateESDIwithNull
448; Parameters:
449; ES:DI: Ptr to end of buffer to terminate
450; Returns:
451; Nothing
452; Corrupts registers:
453; AX
454;--------------------------------------------------------------------
455ALIGN JUMP_ALIGN
456RemoveLastLFandTerminateESDIwithNull:
457 dec di
458 xor ax, ax
459 stosb
460 ret
461
462
463;--------------------------------------------------------------------
464; GetInfoLinesToCXandDialogFlagsToAX
465; Parameters:
466; SS:BP: Ptr to DIALOG
467; Returns:
468; AX: Dialog flags
469; CX: Number of info lines to be displayed
470; Corrupts registers:
471; SI, DS
472;--------------------------------------------------------------------
473ALIGN JUMP_ALIGN
474GetInfoLinesToCXandDialogFlagsToAX:
475 xor ax, ax
476 call GetDialogFlagsToAL
477 jmp Bit_GetSetCountToCXfromAX
478
479;--------------------------------------------------------------------
480; GetDialogFlagsToAL
481; Parameters:
482; SS:BP: Ptr to DIALOG
483; Returns:
484; AL: Dialog flags
485; Corrupts registers:
486; SI, DS
487;--------------------------------------------------------------------
488ALIGN JUMP_ALIGN
489GetDialogFlagsToAL:
490 lds si, [bp+DIALOG.fpDialogIO]
491 mov al, [si+FILE_DIALOG_IO.bDialogFlags]
492 ret
493
494
495;--------------------------------------------------------------------
496; ParseSelectionFromItemLineInDSSI
497; Parameters:
498; DS:SI: Ptr to char buffer containing file or directory to be selected
499; SS:BP: Ptr to DIALOG
500; Returns:
501; Nothing
502; Corrupts registers:
503; All, except BP
504;--------------------------------------------------------------------
505ALIGN JUMP_ALIGN
506ParseSelectionFromItemLineInDSSI:
507 mov ax, [si]
508 cmp ax, UPDIR_CHARACTERS
509 je SHORT .ChangeToUpdir
510 call Char_IsUpperCaseLetterInAL
511 jc SHORT .ParseAndChangeToSubdirInDSSI
512 call Char_IsDecimalDigitInAL
513 jc SHORT .ParseAndChangeToSubdirInDSSI ; Assume subdir and check for errors
514 ; Fall to .ParseAndSelectFileFromDSSI
515
516;--------------------------------------------------------------------
517; .ParseAndSelectFileFromDSSI
518; Parameters:
519; DS:SI: NULL terminated string selected from dialog
520; SS:BP: Ptr to DIALOG
521; Returns:
522; Nothing (exits dialog)
523; Corrupts registers:
524; All, except BP
525;--------------------------------------------------------------------
526.ParseAndSelectFileFromDSSI:
527 les di, [bp+DIALOG.fpDialogIO]
528 add di, BYTE FILE_DIALOG_IO.szFile
529 mov cx, FILENAME_BUFFER_SIZE-1
530 call Memory_CopyCXbytesFromDSSItoESDI
531 xor ax, ax
532 stosb ; Terminate with NULL
533 jmp SHORT CloseFileDialogAfterSuccessfulSelection
534
535;--------------------------------------------------------------------
536; .ChangeToUpdir
537; Parameters:
538; SS:BP: Ptr to DIALOG
539; Returns:
540; Nothing
541; Corrupts registers:
542; All, except BP
543;--------------------------------------------------------------------
544ALIGN JUMP_ALIGN
545.ChangeToUpdir:
546 push cs
547 pop ds
548 mov si, g_szUpdir
549 jmp SHORT .ChangeDirectoryToDSSI
550
551;--------------------------------------------------------------------
552; .ParseAndChangeToSubdirInDSSI
553; Parameters:
554; DS:SI: NULL terminated string selected from dialog
555; SS:BP: Ptr to DIALOG
556; Returns:
557; Nothing
558; Corrupts registers:
559; All, except BP
560;--------------------------------------------------------------------
561ALIGN JUMP_ALIGN
562.ParseAndChangeToSubdirInDSSI:
563 mov BYTE [si+12], NULL ; Terminate with NULL (unnecessary spaces do not matter)
564.ChangeDirectoryToDSSI:
565 call Directory_ChangeToPathFromDSSI
566 jc SHORT .ParseAndSelectFileFromDSSI ; Must have been a file starting with number
567 ; Fall to RefreshFilesToDisplay
568
569;--------------------------------------------------------------------
570; RefreshFilesToDisplay
571; Parameters:
572; SS:BP: Ptr to DIALOG
573; Returns:
574; Nothing
575; Corrupts registers:
576; All, except BP
577;--------------------------------------------------------------------
578ALIGN JUMP_ALIGN
579RefreshFilesToDisplay:
580 call ReInitializeMenuinitFromSSBP
581 jmp MenuInit_RefreshMenuWindow
582
583
584;--------------------------------------------------------------------
585; HandleFunctionKeyFromAH
586; Parameters:
587; AH: Scancode for function key
588; SS:BP: Ptr to DIALOG
589; Returns:
590; Nothing
591; Corrupts registers:
592; AX, SI, DI, BP
593;--------------------------------------------------------------------
594ALIGN JUMP_ALIGN
595HandleFunctionKeyFromAH:
596 call GetDialogFlagsToAL
597 cmp ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
598 je SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
599 cmp ah, KEY_FILEDIALOG_SELECT_DIRECTORY
600 je SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
601 cmp ah, KEY_FILEDIALOG_CHANGE_DRIVE
602 je SHORT HandleFunctionKeyForDriveChange
603ReturnWithoutHandlingKeystroke:
604 clc ; Event not processed
605 ret
606
607
608;--------------------------------------------------------------------
609; HandleFunctionKeyForCreatingNewFileOrDirectory
610; Parameters:
611; AL: File dialog flags
612; SS:BP: Ptr to DIALOG
613; Returns:
614; Closes file dialog
615; Corrupts registers:
616; All, except BP
617;--------------------------------------------------------------------
618ALIGN JUMP_ALIGN
619HandleFunctionKeyForCreatingNewFileOrDirectory:
620 test al, FLG_FILEDIALOG_NEW
621 jz SHORT ReturnWithoutHandlingKeystroke
622
623 mov cx, STRING_DIALOG_IO_size
624 call Memory_ReserveCXbytesFromStackToDSSI
625 call .InitializeStringDialogIoInDSSIforInputtingFileName
626
627 CALL_MENU_LIBRARY GetStringWithIoInDSSI
628 mov al, [si+STRING_DIALOG_IO.bUserCancellation]
629 add sp, BYTE STRING_DIALOG_IO_size
630 test al, al ; User cancellation?
631 jnz SHORT ReturnWithoutHandlingKeystroke
632 jmp CloseFileDialogAfterSuccessfulSelection
633
634ALIGN JUMP_ALIGN
635.InitializeStringDialogIoInDSSIforInputtingFileName:
636 call InitializeNullStringsToDialogInputInDSSI
637 mov WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
638 mov WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
639 mov WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
640 les ax, [bp+DIALOG.fpDialogIO]
641 add ax, BYTE FILE_DIALOG_IO.szFile
642 mov [si+STRING_DIALOG_IO.fpReturnBuffer], ax
643 mov [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
644 ret
645
646
647;--------------------------------------------------------------------
648; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
649; Parameters:
650; AL: File dialog flags
651; SS:BP: Ptr to DIALOG
652; Returns:
653; Closes file dialog
654; Corrupts registers:
655; All, except BP
656;--------------------------------------------------------------------
657ALIGN JUMP_ALIGN
658HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
659 test al, FLG_FILEDIALOG_DIRECTORY
660 jz SHORT ReturnWithoutHandlingKeystroke
661 ; Fall to CloseFileDialogAfterSuccessfulSelection
662
663;--------------------------------------------------------------------
664; CloseFileDialogAfterSuccessfulSelection
665; Parameters:
666; SS:BP: Ptr to DIALOG
667; Returns:
668; Nothing (exits dialog)
669; Corrupts registers:
670; All, except BP
671;--------------------------------------------------------------------
672ALIGN JUMP_ALIGN
673CloseFileDialogAfterSuccessfulSelection:
674 lds di, [bp+DIALOG.fpDialogIO]
675 mov BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
676 jmp MenuInit_CloseMenuWindow
677
678
679;--------------------------------------------------------------------
680; HandleFunctionKeyForDriveChange
681; Parameters:
682; AL: File dialog flags
683; SS:BP: Ptr to DIALOG
684; Returns:
685; Nothing
686; Corrupts registers:
687; All, except BP
688;--------------------------------------------------------------------
689ALIGN JUMP_ALIGN
690HandleFunctionKeyForDriveChange:
691 test al, FLG_FILEDIALOG_DRIVES
692 jz SHORT ReturnWithoutHandlingKeystroke
693
694 call DisplayLoadingMessageInInformationArea
695 mov cx, DRIVE_DIALOG_IO_size
696 call Memory_ReserveCXbytesFromStackToDSSI
697 call .DisplayDriveSelectionDialogWithIoInDSSI
698 call .ChangeDriveToUserSelectionFromIoInDSSI
699 add sp, BYTE DRIVE_DIALOG_IO_size
700 ret
701
702;--------------------------------------------------------------------
703; .DisplayDriveSelectionDialogWithIoInDSSI
704; Parameters:
705; DS:SI: Ptr to uninitialized DRIVE_DIALOG_IO
706; SS:BP: Ptr to DIALOG
707; Returns:
708; DS:SI: Ptr to DRIVE_DIALOG_IO
709; Corrupts registers:
710; AX, DI
711;--------------------------------------------------------------------
712ALIGN JUMP_ALIGN
713.DisplayDriveSelectionDialogWithIoInDSSI:
714 call InitializeNullStringsToDialogInputInDSSI
715 mov WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
716 CALL_MENU_LIBRARY GetDriveWithIoInDSSI
717 ret
718
719;--------------------------------------------------------------------
720; .ChangeDriveToUserSelectionFromIoInDSSI
721; Parameters:
722; DS:SI: Ptr to DRIVE_DIALOG_IO
723; SS:BP: Ptr to DIALOG
724; Returns:
725; Nothing
726; Corrupts registers:
727; All, except BP
728;--------------------------------------------------------------------
729ALIGN JUMP_ALIGN
730.ChangeDriveToUserSelectionFromIoInDSSI:
731 cmp BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
732 jne SHORT .UserCancelledDriveChange
733
734 mov dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
735 call Drive_SetDefaultFromDL
736 jmp RefreshFilesToDisplay
737.UserCancelledDriveChange:
738 ret
739
740
741;--------------------------------------------------------------------
742; DisplayLoadingMessageInInformationArea
743; Parameters:
744; SS:BP: Ptr to DIALOG
745; Returns:
746; Nothing
747; Corrupts registers:
748; AX, BX, CX, DX, SI, DI
749;--------------------------------------------------------------------
750ALIGN JUMP_ALIGN
751DisplayLoadingMessageInInformationArea:
752 call MenuText_ClearInformationArea
753 call MenuText_PrepareToDrawInformationArea
754 mov si, g_szLoadingPleaseWait
755 JMP_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
756
757
758;--------------------------------------------------------------------
759; InitializeNullStringsToDialogInputInDSSI
760; Parameters:
761; DS:SI: Ptr to DIALOG_INPUT
762; SS:BP: Ptr to DIALOG
763; Returns:
764; Nothing
765; Corrupts registers:
766; AX
767;--------------------------------------------------------------------
768ALIGN JUMP_ALIGN
769InitializeNullStringsToDialogInputInDSSI:
770 mov ax, g_szNull
771 mov [si+DIALOG_INPUT.fszTitle], ax
772 mov [si+DIALOG_INPUT.fszTitle+2], cs
773 mov [si+DIALOG_INPUT.fszItems], ax
774 mov [si+DIALOG_INPUT.fszItems+2], cs
775 mov [si+DIALOG_INPUT.fszInfo], ax
776 mov [si+DIALOG_INPUT.fszInfo+2], cs
777 ret
Note: See TracBrowser for help on using the repository browser.