source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Libraries/menu/menudraw.asm @ 3

Last change on this file since 3 was 3, checked in by aitotat, 14 years ago
File size: 14.2 KB
Line 
1; File name     :   menudraw.asm
2; Project name  :   Menu library
3; Created date  :   9.11.2009
4; Last update   :   21.1.2010
5; Author        :   Tomi Tilli
6; Description   :   ASM library to menu system.
7;                   Contains menu drawing functions.
8
9;--------------- Equates -----------------------------
10
11
12
13;-------------- Private global variables -------------
14; Section containing initialized data
15;SECTION .data
16
17g_strTimeout:   db  B_LL,BHL_TVR,"Selection Timeout %us",TVL_BHR,STOP
18
19
20;-------------- Public functions ---------------------
21; Section containing code
22SECTION .text
23
24
25;--------------------------------------------------------------------
26; Clears screen.
27;
28;   Parameters:
29;       Nothing
30;   Returns:
31;       Nothing
32;   Corrupts registers:
33;       AX, BX, CX, DX
34;--------------------------------------------------------------------
35ALIGN JUMP_ALIGN
36MenuDraw_ClrScr:
37    xor     dx, dx                      ; Cursor to (0,0)
38    call    MenuCrsr_SetCursor
39    mov     ah, 0Fh                     ; Get Current Video Mode
40    int     10h
41    mov     al, CNT_SCRN_ROW            ; Load row count
42    mul     ah                          ; AX=Column count * row count
43    mov     cx, ax                      ; Copy char count to CX
44    mov     bx, ATTR_MDA_NORMAL         ; Page zero, normal attribute
45    mov     ax, 0920h                   ; Write Char and attr, space char
46    int     10h
47    ret
48
49
50;--------------------------------------------------------------------
51; Changes line. When printing menu strings, this function must be
52; called instead of normal Print_Newline.
53;
54; MenuDraw_NewlineStrClrLn  Clear current line from cursor pos before newline
55; MenuDraw_NewlineStr
56;   Parameters:
57;       SS:BP:  Ptr to MENUVARS
58;   Returns:
59;       Nothing
60;   Corrupts registers:
61;       AX, BX, DX
62;--------------------------------------------------------------------
63ALIGN JUMP_ALIGN
64MenuDraw_NewlineStrClrLn:
65    push    cx
66    call    MenuCrsr_GetCursor              ; Get current cursor to DX
67    eMOVZX  cx, BYTE [bp+MENUVARS.bWidth]   ; Load menu width
68    add     cl, [bp+MENUVARS.bInitX]        ; Add menu start X coord
69    sub     cl, W_OFF_CRSR_STR & 0FFh       ; Subtract right borders
70    sub     cl, dl                          ; Subtract current X coord
71    mov     dl, ' '                         ; Clear with space
72    call    Print_Repeat                    ; Clear line to the end
73    pop     cx
74ALIGN JUMP_ALIGN
75MenuDraw_NewlineStr:
76    push    cx
77    call    MenuCrsr_GetCursor              ; Get current cursor to DX
78    mov     dl, [bp+MENUVARS.bInitX]        ; Load X offset to border
79    add     dx, W_OFF_CRSR_STR              ; Inc X and Y
80    call    MenuCrsr_SetCursor              ; Set new cursor
81    pop     cx
82    ret
83
84
85;--------------------------------------------------------------------
86; Draws multiline Title or Info string.
87;
88; MenuDraw_MultilineStr
89;   Parameters:
90;       CX:     Max Title or Info line count (menu initialization params)
91;       ES:DI:  Ptr to STOP terminated string to display
92;       SS:BP:  Ptr to MENUVARS
93;   Returns:
94;       Nothing
95;   Corrupts registers:
96;       AX, BX, CX, DX
97;--------------------------------------------------------------------
98%ifdef USE_MENU_DIALOGS
99ALIGN JUMP_ALIGN
100MenuDraw_MultilineStr:
101    push    si
102    xor     si, si
103ALIGN JUMP_ALIGN
104.LineLoop:
105    xchg    cx, si                          ; Idx to CX, count to SI
106    push    cx
107    call    MenuMsg_WriteLine               ; Write line
108    pop     cx
109    jc      .Return                         ;  Return if last token written
110    call    MenuDraw_NewlineStr             ; Cursor to next line
111    inc     cx                              ; Increment line index
112    xchg    cx, si                          ; Count to CX, idx to SI
113    loop    .LineLoop                       ; Loop while lines left
114ALIGN JUMP_ALIGN
115.Return:
116    pop     si
117    ret
118%endif ; USE_MENU_DIALOGS
119
120
121;--------------------------------------------------------------------
122; Draws menu component.
123;
124; MenuDraw_Title            Draws Title borders and user string
125; MenuDraw_Info             Draws Info borders and user string
126; MenuDraw_AllItems         Draws Item borders and all user menuitems
127; MenuDraw_TitleNoBord      MenuDraw_Title without clearing old chars
128; MenuDraw_InfoNoBord       MenuDraw_Info without clearing old chars
129; MenuDraw_AllItemsNoBord   MenuDraw_AllItems without clearing old chars
130;   Parameters:
131;       SS:BP:  Ptr to MENUVARS
132;   Returns:
133;       Nothing
134;   Corrupts registers:
135;       AX, BX, CX, DX
136;--------------------------------------------------------------------
137;ALIGN JUMP_ALIGN
138;MenuDraw_Title:
139;   call    MenuDraw_TitleBorders           ; Draw borders to clear old strings
140ALIGN JUMP_ALIGN
141MenuDraw_TitleNoBord:
142    cmp     BYTE [bp+MENUVARS.bTitleH], 0   ; Any title strings?
143    jz      MenuDraw_NothingToDraw          ;  If not, return
144    call    MenuCrsr_PointTitle             ; Set cursor position
145    mov     dl, MFL_UPD_TITLE               ; Update title string
146    jmp     MenuDraw_SendEvent
147
148;ALIGN JUMP_ALIGN
149;MenuDraw_Info:
150;   call    MenuDraw_InfoBorders            ; Draw borders to clear old strings
151ALIGN JUMP_ALIGN
152MenuDraw_InfoNoBord:
153    cmp     BYTE [bp+MENUVARS.bInfoH], 0    ; Any info strings?
154    jz      MenuDraw_NothingToDraw          ;  If not, return
155    test    BYTE [bp+MENUVARS.bFlags], FLG_MNU_HIDENFO
156    jnz     MenuDraw_NothingToDraw          ; Return if info is hidden
157    call    MenuCrsr_PointInfo              ; Set cursor position
158    mov     dl, MFL_UPD_NFO                 ; Update title string
159    jmp     MenuDraw_SendEvent
160
161;ALIGN JUMP_ALIGN
162;MenuDraw_AllItems:
163;   call    MenuDraw_ItemBorders            ; Draw borders to clear old strings
164ALIGN JUMP_ALIGN
165MenuDraw_AllItemsNoBord:   
166    cmp     WORD [bp+MENUVARS.wItemCnt], 0  ; Any items to draw?
167    jz      MenuDraw_NothingToDraw          ;  If not, return
168    call    MenuCrsr_Point1stItem           ; Set cursor position
169    mov     cx, [bp+MENUVARS.wItemTop]      ; Load idx of first menuitem to draw
170    eMOVZX  dx, BYTE [bp+MENUVARS.bVisCnt]  ; Load number of visible menuitems
171    MIN_U   dx, [bp+MENUVARS.wItemCnt]      ; Limit to item count
172    add     dx, cx                          ; One past last menuitem to draw
173ALIGN JUMP_ALIGN
174.DrawLoop:
175    push    dx
176    call    MenuDraw_Item                   ; Draw menuitem
177    pop     dx
178    inc     cx                              ; Increment menuitem index
179    cmp     cx, dx                          ; More items left?
180    jb      .DrawLoop                       ;  If so, loop
181    jmp     MenuDraw_NothingToDraw
182
183ALIGN JUMP_ALIGN
184MenuDraw_SendEvent:
185    mov     bx, EVNT_MNU_UPD                ; Update string
186    call    MenuLoop_SendEvent
187ALIGN JUMP_ALIGN
188MenuDraw_NothingToDraw:
189    call    MenuCrsr_PointBelowBrdr         ; Cursor to safe location
190    ret
191
192
193;--------------------------------------------------------------------
194; Draws Menuitem without borders.
195; This function does not set initial cursor position but does
196; change line for next menuitem!
197;
198; MenuDraw_Item
199;   Parameters:
200;       CX:     Index of menuitem to draw
201;       SS:BP:  Ptr to MENUVARS
202;   Returns:
203;       AL:     1=Menuitem drawed by user event handler
204;               0=Menuitem not drawed by user event handler
205;   Corrupts registers:
206;       AH, BX, DX
207;--------------------------------------------------------------------
208ALIGN JUMP_ALIGN
209MenuDraw_Item:
210    push    cx
211    test    BYTE [bp+MENUVARS.bFlags], FLG_MNU_NOARRW
212    jnz     .DrawString                 ; Don't draw arrow unless wanted
213    mov     dl, RARROW                  ; Prepare to draw selection arrow
214    cmp     cx, [bp+MENUVARS.wItemSel]  ; Drawing selected item?
215    je      .DrawArrow                  ;  If so, jump to draw arrow
216    mov     dl, ' '                     ; Load space instead of arrow
217ALIGN JUMP_ALIGN
218.DrawArrow:
219    PRINT_CHAR
220    mov     dl, ' '                     ; Draw space before user str
221    PRINT_CHAR
222ALIGN JUMP_ALIGN
223.DrawString:
224    mov     dl, MFL_UPD_ITEM            ; Draw item string
225    mov     bx, EVNT_MNU_UPD            ; Update string
226    call    [bp+MENUVARS.fnEvent]       ; Send event
227    call    MenuDraw_NewlineStr         ; Move cursor to next menuitem
228    pop     cx
229    ret
230
231
232;-------------- Private functions --------------------
233
234;--------------------------------------------------------------------
235; Changes line. When printing menu borders, this function must be
236; called instead of normal Print_Newline.
237;   Parameters:
238;       SS:BP:  Ptr to MENUVARS
239;   Returns:
240;       Nothing
241;   Corrupts registers:
242;       AX, BX, CX, DX
243;--------------------------------------------------------------------
244ALIGN JUMP_ALIGN
245MenuDraw_NewlineBrdr:
246    call    MenuCrsr_GetCursor          ; Get current cursor to DX
247    mov     dl, [bp+MENUVARS.bInitX]    ; Load X offset to border
248    inc     dh                          ; Increment Y coordinate
249    jmp     MenuCrsr_SetCursor          ; Set new cursor
250
251
252;--------------------------------------------------------------------
253; Draws menu borders. User strings will be cleared.
254;
255; MenuDraw_TitleBorders     Draws Title borders
256; MenuDraw_InfoBorders      Draws Info borders
257; MenuDraw_ItemBorders      Draws Item borders
258; MenuDraw_Timeout          Draw timeout border (not whole InfoBorders)
259;   Parameters:
260;       SS:BP:  Ptr to MENUVARS
261;   Returns:
262;       Nothing
263;   Corrupts registers:
264;       AX, BX, CX, DX
265;--------------------------------------------------------------------
266ALIGN JUMP_ALIGN
267MenuDraw_TitleBorders:
268    xor     dx, dx                          ; Zero DX
269    call    MenuCrsr_PointTitleBrdr         ; Set cursor
270    call    MenuDraw_TopBorder              ; Draw top border
271    call    MenuDraw_NewlineBrdr            ; Change line
272    eMOVZX  cx, BYTE [bp+MENUVARS.bTitleH]  ; Load number of title strings
273    jcxz    .Return                         ; Return if no title strings
274ALIGN JUMP_ALIGN
275.LineLoop:
276    push    cx
277    call    MenuDraw_StringBorder
278    call    MenuDraw_NewlineBrdr
279    pop     cx
280    loop    .LineLoop
281    jmp     MenuDraw_MiddleBorder           ; Thin border before menuitems
282ALIGN JUMP_ALIGN
283.Return:
284    ret
285
286ALIGN JUMP_ALIGN
287MenuDraw_InfoBorders:
288    xor     dx, dx                          ; Zero DX
289    call    MenuCrsr_PointNfoBrdr           ; Set cursor
290    cmp     BYTE [bp+MENUVARS.bInfoH], 0    ; Any info strings?
291    jz      MenuDraw_BottomBorder           ;  If not, draw bottom border
292    test    BYTE [bp+MENUVARS.bFlags], FLG_MNU_HIDENFO
293    jnz     MenuDraw_BottomBorder           ; Draw bottom border if info is hidden
294    call    MenuDraw_MiddleBorder           ; Draw middle border
295    call    MenuDraw_NewlineBrdr            ; Change line
296    eMOVZX  cx, BYTE [bp+MENUVARS.bInfoH]   ; Load number of info strings
297ALIGN JUMP_ALIGN
298.LineLoop:
299    push    cx
300    call    MenuDraw_StringBorder
301    call    MenuDraw_NewlineBrdr
302    pop     cx
303    loop    .LineLoop
304    jmp     MenuDraw_BottomBorder
305   
306ALIGN JUMP_ALIGN
307MenuDraw_Timeout:
308    xor     dx, dx                          ; Zero DX
309    call    MenuCrsr_PointNfoBrdr           ; Set cursor
310    mov     ch, [bp+MENUVARS.bInfoH]        ; Load info str count to CH
311    test    ch, ch                          ; Any info strings?
312    jz      MenuDraw_BottomBorder           ;  If not, draw bottom border
313    inc     ch                              ; Increment for info top border
314    xor     cl, cl                          ; Zero X coordinate
315    call    MenuCrsr_Move                   ; Move cursor
316    jmp     MenuDraw_BottomBorder
317
318ALIGN JUMP_ALIGN
319MenuDraw_ItemBorders:
320    cmp     WORD [bp+MENUVARS.wItemCnt], 0  ; Any items?
321    jz      .Return                         ;  If not, return
322    xor     dx, dx                          ; Zero DX
323    call    MenuCrsr_PointItemBrdr          ; Set cursor
324    eMOVZX  cx, BYTE [bp+MENUVARS.bVisCnt]  ; Load max number of item strings
325ALIGN JUMP_ALIGN
326.LineLoop:
327    push    cx
328    call    MenuDraw_ScrollBorder
329    call    MenuDraw_NewlineBrdr
330    pop     cx
331    loop    .LineLoop
332.Return:
333    ret
334
335
336;--------------------------------------------------------------------
337; Draw horizontal border line to current cursor location.
338; MenuDraw_TopBorder    Draw thick top menu border
339; MenuDraw_StringBorder Draw thick user string border
340; MenuDraw_ScrollBorder Draw scrolling border for menuitems
341; MenuDraw_MiddleBorder Draw thin middle menu border
342; MenuDraw_BottomBorder Draw thick bottom menu border with timeout if set
343;   Parameters:
344;       CX:     Loop counter (Items left, MenuDraw_ScrollBorder only)
345;       SS:BP:  Ptr to MENUVARS
346;   Returns:
347;       Nothing
348;   Corrupts registers:
349;       AX, BX, CX, DX
350;--------------------------------------------------------------------
351ALIGN JUMP_ALIGN
352MenuDraw_TopBorder:
353    mov     bh, B_TL
354    mov     bl, B_H
355    mov     dh, B_TR
356    jmp     MenuDraw_BorderChars
357   
358ALIGN JUMP_ALIGN
359MenuDraw_StringBorder:
360    mov     bh, B_V
361    mov     bl, ' '
362    mov     dh, B_V
363    jmp     MenuDraw_BorderChars
364
365ALIGN JUMP_ALIGN
366MenuDraw_ScrollBorder:
367    call    MenuDraw_GetScrollChar          ; Load scroll char to DH
368    mov     bh, B_V
369    mov     bl, ' '
370    jmp     MenuDraw_BorderChars
371
372ALIGN JUMP_ALIGN
373MenuDraw_MiddleBorder:
374    mov     bh, BVL_THR
375    mov     bl, T_H
376    mov     dh, THL_BVR
377
378ALIGN JUMP_ALIGN
379MenuDraw_BorderChars:
380    mov     dl, bh                          ; Leftmost
381    PRINT_CHAR
382    eMOVZX  cx, BYTE [bp+MENUVARS.bWidth]
383    times 2 dec cx                          ; Subtract borders
384    mov     dl, bl                          ; Middle
385    call    Print_Repeat
386    mov     dl, dh                          ; Rightmost
387    PRINT_CHAR
388    ret
389
390ALIGN JUMP_ALIGN
391MenuDraw_BottomBorder:
392    mov     bh, B_LL
393    mov     bl, B_H
394    mov     dh, B_LR
395    cmp     WORD [bp+MENUVARS.wTimeInit], 0 ; Timeout enabled?
396    jz      MenuDraw_BorderChars            ;  If not, draw normal
397
398    ; Print timeout value
399    push    ds
400    push    si
401    push    cs
402    pop     ds                              ; Copy CS to DS
403    mov     si, g_strTimeout                ; Load ptr to timeout str (DS:SI)
404    mov     ax, 55                          ; 1 timer tick = 54.945ms
405    mul     WORD [bp+MENUVARS.wTimeout]     ; DX:AX = millisecs
406    eSHR_IM ax, 10                          ; ms to s (close enough to 1000)
407    push    ax                              ; Push seconds
408    call    Print_Format                    ; Print timeout
409    add     sp, 2                           ; Clean stack
410    pop     si
411    pop     ds
412
413    ; Print remaining border chars
414    call    MenuCrsr_GetCursor              ; Get cursor location to DX
415    sub     dl, [bp+MENUVARS.bInitX]        ; Compensate for start X...
416    inc     dx                              ; ...and lower right corner
417    mov     dh, [bp+MENUVARS.bWidth]        ; Load menu width to DH
418    sub     dh, dl                          ; Subtract current X coordinate
419    eMOVZX  cx, dh                          ; Number of border chars needed
420    mov     dl, B_H
421    call    Print_Repeat
422    mov     dl, B_LR
423    PRINT_CHAR
424    ret
425
426
427;--------------------------------------------------------------------
428; Returns character for scroll bars if needed.
429; If scroll bars are not needed, normal border character will be returned.
430;
431; Note! Current implementation doesn't always return thumb character
432;       if there are a lot of pages. Checking last char only is not enough.
433;
434; MenuDraw_GetScrollChar
435;   Parameters:
436;       CX:     Loop counter (Items left, MenuDraw_ScrollBorder only)
437;       SS:BP:  Ptr to MENUVARS
438;   Returns:
439;       DH:     Scroll bar character
440;   Corrupts registers:
441;       AX, BX, CX, DL
442;--------------------------------------------------------------------
443ALIGN JUMP_ALIGN
444MenuDraw_GetScrollChar:
445    mov     dh, B_V                     ; Assume no scroll bars needed
446    mov     ax, [bp+MENUVARS.wItemCnt]  ; Load menuitem count to AX
447    eMOVZX  bx, BYTE [bp+MENUVARS.bVisCnt]  ; Load visible menuitems to BX
448    cmp     ax, bx                      ; Need scroll bars?
449    jbe     .Return                     ;  If not, return
450   
451    ; Calculate last menuitem index for thumb char on this line
452    push    bx                          ; Store number of visible menuitems
453    sub     bx, cx                      ; Calculate Line index
454    inc     bx                          ; Increment for next line index
455    mul     bx                          ; DX:AX=Total item count * Next line idx
456    pop     bx                          ; Pop number of visible menuitems
457    div     bx                          ; AX=First Menuitem for next string line
458    dec     ax                          ; AX=Last Menuitem for this string line
459
460    ; Draw thumb or track
461    mov     dh, FULL_BLCK               ; Assume thumb line
462    call    Menu_IsItemVisible          ; Is thumb menuitem visible?
463    jc      .Return                     ;  If so, draw thumb
464    mov     dh, T_V                     ; Load track character
465ALIGN JUMP_ALIGN
466.Return:
467    ret
Note: See TracBrowser for help on using the repository browser.