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

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