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

Last change on this file since 238 was 181, checked in by krille_n_@…, 13 years ago

Changes to all parts of the project:

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