source: xtideuniversalbios/trunk/Configurator/Src/Libraries/menu/menufile.asm@ 569

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

Commit 1/2 (Library, Configurators and Serial Server):

  • Changed Emulate.inc so that making 286 and 386 versions now works. Additionally, only one processor type define is needed in the makefile.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 9.7 KB
RevLine 
[2]1; Project name : Menu library
[293]2; Description : ASM library for menu system.
[2]3; Contains functions for displaying file dialog.
4
5;--------------- Equates -----------------------------
6
7; Dialog init and return variables.
8; This is an expanded MSGVARS struct.
9struc FDLGVARS
10 .msgVars resb MSGVARS_size
11
12 ; Dialog parameters
13 .fpFileSrch resb 4 ; Far pointer to file search string
14 .wFileCnt resb 2 ; Number of directories and files to display
15 .wDrvCnt resb 2 ; Valid drive letter count
16
17 ; Return variables for different dialogs
18 .fpDTA resb 4 ; Ptr to DTA for selected file
19 .fSuccess resb 1 ; Was data inputted successfully by user
20 resb 1 ; Alignment
21endstruc
22
23
24;-------------- Private global variables -------------
25; Section containing initialized data
26;SECTION .data
27
28g_szDir: db "[%S]",STOP
29g_szDrv: db "[%c:]",STOP
30
31
32;-------------- Public functions ---------------------
33; Section containing code
34SECTION .text
35
36
37;--------------------------------------------------------------------
38; Displays file dialog.
39;
40; MenuFile_ShowDlg
41; Parameters:
42; BL: Dialog width with borders included
43; SS:BP: Ptr to MENUVARS
44; ES:DI: Ptr to STOP terminated string to display
45; DS:SI: Ptr to file search string (* and ? wildcards supported)
46; Returns:
47; DS:SI: Ptr to selected file name string
48; CF: Set if user data inputted successfully
49; Cleared is input cancelled
50; Corrupts registers:
51; BX, CX
52;--------------------------------------------------------------------
53ALIGN JUMP_ALIGN
54MenuFile_ShowDlg:
55 ; Create stack frame
56 eENTER FDLGVARS_size, 0
57 sub bp, FDLGVARS_size ; Point to FDLGVARS
58
59 ; Initialize menu variables
60 mov bh, CNT_SCRN_ROW ; Menu height
61 mov [bp+MENUVARS.wSize], bx ; Menu size
62 mov [bp+MSGVARS.wStrOff], di ; Store far ptr...
63 mov [bp+MSGVARS.wStrSeg], es ; ...to info string to display
64 mov [bp+FDLGVARS.fpFileSrch], si ; Store far pointer...
65 mov [bp+FDLGVARS.fpFileSrch+2], ds ; ...to file search string
66 ;call File_GetValidDrvCnt ; Get drive letter count to CX (drive support broken! Works on DOSBox, not on DOS 6.22)
67 xor cx, cx
68 mov [bp+FDLGVARS.wDrvCnt], cx
69 mov WORD [bp+MENUVARS.fnEvent], MenuFile_Event
[83]70 mov [bp+FDLGVARS.fSuccess], cl ; For user cancel
[2]71 call MenuMsg_GetLineCnt ; Get Info line count to CX
72 xchg cl, ch ; CH=Info lines, CL=Title lines
73 mov [bp+MENUVARS.wTopDwnH], cx
74
75 ; Enter menu
76 mov dx, si ; File search str ptr to DS:DX
77 call MenuFile_GetItemCnt ; Get menuitem count to CX
78 call MenuCrsr_GetCenter ; Get X and Y coordinates to DX
79 xor ax, ax ; Selection timeout (disable)
80 xor bx, bx ; Menu flags
81 call Menu_Init ; Returns only after dlg closed
82
83 ; Return
84 mov si, [bp+FDLGVARS.fpDTA] ; Load offset to return DTA
85 mov ds, [bp+FDLGVARS.fpDTA+2] ; Load segment to return DTA
86 mov bl, [bp+FDLGVARS.fSuccess] ; Load success flag
87 add bp, FDLGVARS_size ; Point to old BP
88 eLEAVE ; Destroy stack frame
89 rcr bl, 1 ; Move success flag to CF
90 ret
91
92
93;-------------- Private functions ---------------------
94
95;--------------------------------------------------------------------
96; File dialog event handler.
97;
98; MenuFile_Event
99; Parameters:
100; DS:DX: Ptr to file search string (for example *.* or C:\temp\*.txt)
101; SS:BP: Ptr to FDLGVARS
102; Returns:
103; CX: Number of menuitems to display files and drives
104; Corrupts registers:
105; AX
106;--------------------------------------------------------------------
107ALIGN JUMP_ALIGN
108MenuFile_GetItemCnt:
109 call File_FindAndCount ; Get message line count to CX
110 mov [bp+FDLGVARS.wFileCnt], cx ; Store file and dir count
111 add cx, [bp+FDLGVARS.wDrvCnt] ; Add drive letter count to CX
112 ret
113
114
115;--------------------------------------------------------------------
116; Directory, File and Drive rendering functions for menuitems.
117; Cursor is assumed to be on correct position when this function is called.
118;
119; MenuFile_DrawItem
120; Parameters:
121; CX: Index of menuitem to draw
122; SS:BP: Ptr to FDLGVARS
123; Returns:
124; Nothing
125; Corrupts registers:
126; AX, BX, CX, DX
127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
129MenuFile_DrawItem:
130 push ds
131 mov dx, [bp+FDLGVARS.fpFileSrch] ; Load ptr to file search str
132 mov ds, [bp+FDLGVARS.fpFileSrch+2]
133 call File_GetDTA ; Get DTA ptr to DS:BX
134 jc .DrawDrv ; No dir or file, draw drive
135 test BYTE [bx+DTA.bFileAttr], FLG_FATTR_DIR
136 jnz .DrawDir
137
138;--------------------------------------------------------------------
139; Directory, File and Drive rendering for menuitems.
140; Cursor is assumed to be on correct position.
141;
142; .DrawFile Draws file menuitem
143; .DrawDir Draws directory menuitem
144; .DrawDrv Draws drive menuitem
145; Parameters:
146; CX: Index of menuitem to draw
147; DS:BX: Ptr to DTA for menuitem (not for .DrawDrv)
148; SS:BP: Ptr to FDLGVARS
149; Returns:
150; Nothing
151; Corrupts registers:
152; AX, BX, CX, DX
153;--------------------------------------------------------------------
154.DrawFile:
155 lea dx, [bx+DTA.szFile] ; DS:DX now points to filename string
156 PRINT_STR
157 pop ds
158 ret
159ALIGN JUMP_ALIGN
160.DrawDir:
161 push si
162 lea ax, [bx+DTA.szFile] ; Dir string offset to AX
163 push ds ; Push dir string segment
164 push ax ; Push dir string offset
165 push cs ; Copy CS...
166 pop ds ; ...to DS for format string
167 mov si, g_szDir ; Format string now in DS:SI
168 call Print_Format
169 add sp, 4 ; Clean stack variables
170 pop si
171 pop ds
172 ret
173ALIGN JUMP_ALIGN
174.DrawDrv:
175 push si
176 sub cx, [bp+FDLGVARS.wFileCnt] ; Menuitem to valid drive index
177 call File_GetNthValidDrv ; Get letter to AX
178 push ax ; Push drive letter
179 push cs ; Copy CS...
180 pop ds ; ...to DS for format string
181 mov si, g_szDrv ; Format string now in DS:SI
182 call Print_Format
183 add sp, 2 ; Clean stack variables
184 pop si
185 pop ds
186 ret
187
188
189;--------------------------------------------------------------------
190; File dialog event handler.
191;
192; MenuFile_Event
193; Parameters:
194; BX: Callback event
195; CX: Selected menuitem index
196; DX: Event parameter (event specific)
197; SS:BP: Ptr to FDLGVARS
198; Returns:
199; AH: Event specific or unused
200; AL: 1=Event processed
201; 0=Event not processed (default action if any)
202; Corrupts registers:
203; BX, CX, DX
204;--------------------------------------------------------------------
205ALIGN JUMP_ALIGN
206MenuFile_Event:
207 cmp bx, EVNT_MNU_UPD ; Above last supported?
208 ja .EventNotHandled ; If so, return
209 shl bx, 1 ; Shift for word lookup
210 jmp [cs:bx+.rgwEventJump] ; Jumpt to handle event
211ALIGN WORD_ALIGN
212.rgwEventJump:
213 dw .EventExit ; 0, EVNT_MNU_EXIT
214 dw .EventSelChg ; 1, EVNT_MMU_SELCHG
215 dw .EventSelSet ; 2, EVNT_MNU_SELSET
216 dw .EventKey ; 3, EVNT_MNU_KEY
217 dw .EventUpd ; 4, EVNT_MNU_UPD
218
219; Events that do not require any handling
220ALIGN JUMP_ALIGN
221.EventSelChg:
222.EventKey:
223.EventNotHandled:
224 xor ax, ax ; Event not processed
225 ret
226ALIGN JUMP_ALIGN
227.EventExit:
228.EventHandled: ; Return point from all handled events
229 mov ax, 1
230 ret
231
232
233;--------------------------------------------------------------------
234; EVNT_MNU_SELSET event handler.
235;
236; .EventSelSet
237; Parameters:
238; CX: Index of menuitem that user selected
239; SS:BP: Ptr to FDLGVARS
240;--------------------------------------------------------------------
241ALIGN JUMP_ALIGN
242.EventSelSet:
243 push ds
244 cmp cx, [bp+FDLGVARS.wFileCnt] ; Selecting file or dir?
245 jae .ChgDrv ; If not, must be drive
246 mov dx, [bp+FDLGVARS.fpFileSrch] ; Load ptr to file search str
247 mov ds, [bp+FDLGVARS.fpFileSrch+2]
248 call File_GetDTA ; Get DTA ptr to DS:BX
249 rcl al, 1 ; CF to AL
250 test BYTE [bx+DTA.bFileAttr], FLG_FATTR_DIR
251 jnz .ChgDir ; If directory, go change
252
253 ; File selected, close dialog
254 not al ; Invert CF
255 mov [bp+FDLGVARS.fSuccess], al ; Store success flag
256 mov [bp+FDLGVARS.fpDTA], bx ; Store offset to DTA
257 mov [bp+FDLGVARS.fpDTA+2], ds ; Store segment to DTA
258 pop ds
259 jmp MenuDlg_ExitHandler ; Close dialog
260
261ALIGN JUMP_ALIGN
262.ChgDrv:
263 sub cx, [bp+FDLGVARS.wFileCnt] ; Menuitem to drive index
264 call File_GetNthValidDrv ; Drv device num to DX
265 call File_SetDrive ; Change drive
266 jmp .ChangeDone ; Update menu
267ALIGN JUMP_ALIGN
268.ChgDir:
269 lea dx, [bx+DTA.szFile] ; Offset to new path
270 call File_ChangeDir ; Change directory
271ALIGN JUMP_ALIGN
272.ChangeDone:
[293]273 lds dx, [bp+FDLGVARS.fpFileSrch] ; Load ptr to file search str
[2]274 call MenuFile_GetItemCnt ; Get file count from new dir
275 pop ds
276 xor dx, dx ; Redraw only necessary
277 call Menu_InvItemCnt ; Redraw with new items
278 jmp .EventHandled
279
280;--------------------------------------------------------------------
281; EVNT_MNU_UPD event handler.
282;
283; .EventUpd
284; Parameters:
285; CX: Index of menuitem to update (MFL_UPD_ITEM only)
286; DL: Update flag:
287; MFL_UPD_TITLE Set to update title string
288; MFL_UPD_NFO Set to update info string
289; MFL_UPD_ITEM Set to update menuitem string
290; SS:BP: Ptr to FDLGVARS
291;--------------------------------------------------------------------
292ALIGN JUMP_ALIGN
293.EventUpd:
294 test dl, MFL_UPD_TITLE ; Update title?
295 jnz .EventNotHandled ; If so, return without handling event
296 test dl, MFL_UPD_NFO ; Update info?
297 jnz .DrawInfo ; If so, jump to update
298
299 ; Update Menuitem
300 call MenuFile_DrawItem ; Draw menuitem
301 jmp .EventHandled
302
303 ; Update Info string
304ALIGN JUMP_ALIGN
305.DrawInfo:
306 push es
307 push di
308 mov di, [bp+MSGVARS.wStrOff] ; Load string offset
309 mov es, [bp+MSGVARS.wStrSeg] ; Load string segment
[293]310 eMOVZX cx, [bp+MENUVARS.bInfoH] ; Load info line count to CX
[2]311 call MenuDraw_MultilineStr ; Draw multiline str
312 pop di
313 pop es
314 jmp .EventHandled
Note: See TracBrowser for help on using the repository browser.