source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuBorders.asm @ 223

Last change on this file since 223 was 223, checked in by krille_n_@…, 12 years ago

Changes:

  • Fixed what appears to be a mistake in EBIOS.inc
  • Added a 'release' option to the makefile of the Serial Server (invokes UPX)
  • Some very minor optimizations
  • Removed the eSEG macro and did some other cleanups (fixed typos etc)
File size: 12.7 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for drawing menu borders.
3
4; Struct containing border characters for different types of menu window lines
5struc BORDER_CHARS
6    .cLeft      resb    1
7    .cMiddle    resb    1
8    .cRight     resb    1
9endstruc
10
11
12; Section containing code
13SECTION .text
14
15;--------------------------------------------------------------------
16; MenuBorders_RefreshAll
17;   Parameters
18;       SS:BP:  Ptr to MENU
19;   Returns:
20;       Nothing
21;   Corrupts registers:
22;       AX, BX, CX, DX, SI, DI
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25MenuBorders_RefreshAll:
26%ifndef USE_186
27    call    MenuBorders_AdjustDisplayContextForDrawingBorders
28    call    MenuBorders_GetNumberOfMiddleCharactersToDX
29    call    RefreshTitleBorders
30    call    RefreshItemBorders
31    call    RefreshInformationBorders
32    call    DrawBottomBorderLine
33    jmp     DrawBottomShadowLine
34%else
35    push    DrawBottomShadowLine
36    push    DrawBottomBorderLine
37    push    RefreshInformationBorders
38    push    RefreshItemBorders
39    push    RefreshTitleBorders
40    push    MenuBorders_GetNumberOfMiddleCharactersToDX
41    jmp     MenuBorders_AdjustDisplayContextForDrawingBorders
42%endif
43
44
45;--------------------------------------------------------------------
46; MenuBorders_RedrawBottomBorderLine
47;   Parameters
48;       SS:BP:  Ptr to MENU
49;   Returns:
50;       Nothing
51;   Corrupts registers:
52;       AX, BX, DX, SI, DI
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
55MenuBorders_RedrawBottomBorderLine:
56    call    MenuBorders_AdjustDisplayContextForDrawingBorders
57    call    MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
58    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
59    call    MenuBorders_GetNumberOfMiddleCharactersToDX
60    jmp     SHORT DrawBottomBorderLine
61
62
63;--------------------------------------------------------------------
64; MenuBorders_RefreshItemBorders
65;   Parameters
66;       SS:BP:  Ptr to MENU
67;   Returns:
68;       Nothing
69;   Corrupts registers:
70;       AX, BX, CX, DX, SI, DI
71;--------------------------------------------------------------------
72%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
73ALIGN JUMP_ALIGN
74MenuBorders_RefreshItemBorders:
75    call    MenuBorders_AdjustDisplayContextForDrawingBorders
76    call    MenuLocation_GetItemBordersTopLeftCoordinatesToAX
77    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
78
79    call    MenuBorders_GetNumberOfMiddleCharactersToDX
80    jmp     SHORT RefreshItemBorders
81%endif
82
83
84;--------------------------------------------------------------------
85; MenuBorders_AdjustDisplayContextForDrawingBorders
86;   Parameters
87;       SS:BP:  Ptr to MENU
88;   Returns:
89;       Nothing
90;   Corrupts registers:
91;       AX, BX, SI, DI
92;--------------------------------------------------------------------
93ALIGN JUMP_ALIGN
94MenuBorders_AdjustDisplayContextForDrawingBorders:
95    mov     bl, ATTRIBUTES_ARE_USED
96    mov     ax, MenuCharOut_MenuTeletypeOutput
97    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
98
99    call    CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
100    CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
101
102    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
103    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
104
105    mov     si, ATTRIBUTE_CHARS.cBordersAndBackground
106    jmp     MenuAttribute_SetToDisplayContextFromTypeInSI
107
108
109;--------------------------------------------------------------------
110; MenuBorders_GetNumberOfMiddleCharactersToDX
111;   Parameters
112;       SS:BP:  Ptr to MENU
113;   Returns:
114;       DX:     Number of middle border characters when drawing border lines
115;   Corrupts registers:
116;       Nothing
117;--------------------------------------------------------------------
118ALIGN JUMP_ALIGN
119MenuBorders_GetNumberOfMiddleCharactersToDX:
120    eMOVZX  dx, BYTE [bp+MENUINIT.bWidth]
121    sub     dx, BYTE MENU_HORIZONTAL_BORDER_LINES
122    ret
123
124
125;--------------------------------------------------------------------
126; RefreshTitleBorders
127;   Parameters
128;       DX:     Number of times to repeat middle character
129;       SS:BP:  Ptr to MENU
130;   Returns:
131;       Nothing
132;   Corrupts registers:
133;       AX, BX, CX, SI, DI
134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
136RefreshTitleBorders:
137    call    DrawTopBorderLine
138    eMOVZX  cx, BYTE [bp+MENUINIT.bTitleLines]
139    jmp     SHORT DrawTextBorderLinesByCXtimes
140
141;--------------------------------------------------------------------
142; RefreshInformationBorders
143;   Parameters
144;       DX:     Number of times to repeat middle character
145;       SS:BP:  Ptr to MENU
146;   Returns:
147;       Nothing
148;   Corrupts registers:
149;       AX, BX, CX, SI, DI
150;--------------------------------------------------------------------
151ALIGN JUMP_ALIGN
152RefreshInformationBorders:
153    call    DrawSeparationBorderLine
154    eMOVZX  cx, BYTE [bp+MENUINIT.bInfoLines]
155    jmp     SHORT DrawTextBorderLinesByCXtimes
156
157;--------------------------------------------------------------------
158; RefreshItemBorders
159;   Parameters
160;       DX:     Number of times to repeat middle character
161;       SS:BP:  Ptr to MENU
162;   Returns:
163;       Nothing
164;   Corrupts registers:
165;       AX, BX, CX, SI, DI
166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168RefreshItemBorders:
169    call    DrawSeparationBorderLine
170    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
171    ; Fall to DrawTextBorderLinesByCXtimes
172
173;--------------------------------------------------------------------
174; DrawTextBorderLinesByCXtimes
175;   Parameters
176;       CX:     Number of border lines to draw
177;       DX:     Number of times to repeat middle character
178;       SS:BP:  Ptr to MENU
179;   Returns:
180;       Nothing
181;   Corrupts registers:
182;       AX, CX, SI, DI
183;--------------------------------------------------------------------
184DrawTextBorderLinesByCXtimes:
185    jcxz    .NoBorderLinesToDraw
186ALIGN JUMP_ALIGN
187.DrawBordersWithFunctionInBX:
188    call    DrawTextBorderLine
189    loop    .DrawBordersWithFunctionInBX
190.NoBorderLinesToDraw:
191    ret
192
193
194;--------------------------------------------------------------------
195; DrawTopBorderLine
196; DrawSeparationBorderLine
197; DrawBottomBorderLine
198; DrawTimeoutCounterOverBottomBorderLine
199; DrawBottomShadowLine
200; DrawTextBorderLine
201;   Parameters
202;       DX:     Number of times to repeat middle character
203;       SS:BP:  Ptr to MENU
204;   Returns:
205;       Nothing
206;   Corrupts registers:
207;       AX, SI, DI
208;--------------------------------------------------------------------
209ALIGN JUMP_ALIGN
210DrawTopBorderLine:
211    mov     si, g_rgbTopBorderCharacters
212    call    PrintBorderCharactersFromCSSI
213    jmp     SHORT PrintNewlineToEndBorderLine
214
215ALIGN JUMP_ALIGN
216DrawSeparationBorderLine:
217    mov     si, g_rgbSeparationBorderCharacters
218    jmp     SHORT PrintBorderCharactersFromCSSIandShadowCharacter
219
220ALIGN JUMP_ALIGN
221DrawBottomBorderLine:
222    mov     si, g_rgbBottomBorderCharacters
223    test    BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
224    jz      SHORT PrintBorderCharactersFromCSSIandShadowCharacter
225
226    call    DrawTimeoutCounterString
227    sub     dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
228    mov     si, g_BottomBorderWithTimeoutCharacters
229    call    PrintBorderCharactersFromCSSIandShadowCharacter
230    add     dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
231    ret
232
233ALIGN JUMP_ALIGN
234DrawBottomShadowLine:
235    CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
236    inc     ax          ; Move one column left
237    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
238    inc     dx          ; Increment repeat count...
239    inc     dx          ; ...for both corner characters
240    call    PrintShadowCharactersByDXtimes
241    dec     dx          ; Restore...
242    dec     dx          ; ...DX
243    ret
244
245ALIGN JUMP_ALIGN
246DrawTextBorderLine:
247    mov     si, g_rgbTextBorderCharacters
248    ; Fall to PrintBorderCharactersFromCSSIandShadowCharacter
249
250;--------------------------------------------------------------------
251; PrintBorderCharactersFromCSSIandShadowCharacter
252;   Parameters
253;       DX:     Number of times to repeat middle character
254;       CS:SI:  Ptr to BORDER_CHARS
255;       SS:BP:  Ptr to MENU
256;   Returns:
257;       Nothing
258;   Corrupts registers:
259;       AX, SI, DI
260;--------------------------------------------------------------------
261ALIGN JUMP_ALIGN
262PrintBorderCharactersFromCSSIandShadowCharacter:
263    call    PrintBorderCharactersFromCSSI
264    push    dx
265    mov     dx, 1
266    call    PrintShadowCharactersByDXtimes
267    pop     dx
268    ; Fall to PrintNewlineToEndBorderLine
269
270;--------------------------------------------------------------------
271; PrintNewlineToEndBorderLine
272;   Parameters
273;       SS:BP:  Ptr to MENU
274;   Returns:
275;       Nothing
276;   Corrupts registers:
277;       AX, DI
278;--------------------------------------------------------------------
279ALIGN JUMP_ALIGN
280PrintNewlineToEndBorderLine:
281    CALL_DISPLAY_LIBRARY PrintNewlineCharacters
282    ret
283
284
285;--------------------------------------------------------------------
286; PrintShadowCharactersByDXtimes
287;   Parameters
288;       DX:     Number of shadow characters to print
289;       SS:BP:  Ptr to MENU
290;   Returns:
291;       Nothing
292;   Corrupts registers:
293;       AX, SI, DI
294;--------------------------------------------------------------------
295ALIGN JUMP_ALIGN
296PrintShadowCharactersByDXtimes:
297    CALL_DISPLAY_LIBRARY PushDisplayContext
298
299    mov     si, ATTRIBUTE_CHARS.cShadow
300    call    MenuAttribute_SetToDisplayContextFromTypeInSI
301
302    push    bx
303    mov     bl, ATTRIBUTES_ARE_USED
304    mov     ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
305    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
306    pop     bx
307
308    call    MenuBorders_PrintMultipleBorderCharactersFromAL ; AL does not matter
309
310    CALL_DISPLAY_LIBRARY PopDisplayContext
311    ret
312
313
314;--------------------------------------------------------------------
315; PrintBorderCharactersFromCSSI
316;   Parameters
317;       DX:     Number of times to repeat middle character
318;       CS:SI:  Ptr to BORDER_CHARS
319;       SS:BP:  Ptr to MENU
320;   Returns:
321;       Nothing
322;   Corrupts registers:
323;       AX, SI, DI
324;--------------------------------------------------------------------
325ALIGN JUMP_ALIGN
326PrintBorderCharactersFromCSSI:
327    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cLeft] to AL
328    call    MenuBorders_PrintSingleBorderCharacterFromAL
329
330    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cMiddle] to AL
331    call    MenuBorders_PrintMultipleBorderCharactersFromAL
332
333    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cRight] to AL
334    ; Fall to MenuBorders_PrintSingleBorderCharacterFromAL
335
336;--------------------------------------------------------------------
337; MenuBorders_PrintSingleBorderCharacterFromAL
338; MenuBorders_PrintMultipleBorderCharactersFromAL
339;   Parameters
340;       AL:     Character to print
341;       DX:     Repeat count (MenuBorders_PrintMultipleBorderCharactersFromAL)
342;       SS:BP:  Ptr to MENU
343;   Returns:
344;       Nothing
345;   Corrupts registers:
346;       AX, DI
347;--------------------------------------------------------------------
348ALIGN JUMP_ALIGN
349MenuBorders_PrintSingleBorderCharacterFromAL:
350    CALL_DISPLAY_LIBRARY PrintCharacterFromAL
351    ret
352
353ALIGN JUMP_ALIGN
354MenuBorders_PrintMultipleBorderCharactersFromAL:
355    push    cx
356    mov     cx, dx
357    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
358    pop     cx
359    ret
360
361
362;--------------------------------------------------------------------
363; DrawTimeoutCounterString
364;   Parameters
365;       SS:BP:  Ptr to MENU
366;   Returns:
367;       Nothing
368;   Corrupts registers:
369;       AX, SI, DI
370;--------------------------------------------------------------------
371ALIGN JUMP_ALIGN
372DrawTimeoutCounterString:
373    call    MenuTime_GetTimeoutSecondsLeftToAX
374    ; Fall to .PrintTimeoutStringWithSecondsInAX
375
376;--------------------------------------------------------------------
377; .PrintTimeoutStringWithSecondsInAX
378;   Parameters
379;       AX:     Seconds to print
380;       SS:BP:  Ptr to MENU
381;   Returns:
382;       Nothing
383;   Corrupts registers:
384;       AX, SI, DI
385;--------------------------------------------------------------------
386.PrintTimeoutStringWithSecondsInAX:
387    ; Get attribute to AX
388    xchg    di, ax
389    mov     si, ATTRIBUTE_CHARS.cNormalTimeout
390    cmp     di, BYTE MENU_TIMEOUT_SECONDS_FOR_HURRY
391    eCMOVB  si, ATTRIBUTE_CHARS.cHurryTimeout
392    call    MenuAttribute_GetToAXfromTypeInSI
393
394    push    bp
395    mov     bp, sp
396    mov     si, g_szSelectionTimeout
397    push    ax          ; Push attribute
398    push    di          ; Push seconds
399    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
400    pop     bp
401    ret
402
403; Lookup tables for border characters
404g_rgbTopBorderCharacters:
405istruc BORDER_CHARS
406    at  BORDER_CHARS.cLeft,     db  DOUBLE_TOP_LEFT_CORNER
407    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
408    at  BORDER_CHARS.cRight,    db  DOUBLE_TOP_RIGHT_CORNER
409iend
410
411g_rgbSeparationBorderCharacters:
412istruc BORDER_CHARS
413    at  BORDER_CHARS.cLeft,     db  DOUBLE_VERTICAL_TO_RIGHT_SINGLE
414    at  BORDER_CHARS.cMiddle,   db  SINGLE_HORIZONTAL
415    at  BORDER_CHARS.cRight,    db  DOUBLE_VERTICAL_TO_LEFT_SINGLE
416iend
417
418g_rgbBottomBorderCharacters:
419istruc BORDER_CHARS
420    at  BORDER_CHARS.cLeft,     db  DOUBLE_BOTTOM_LEFT_CORNER
421    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
422    at  BORDER_CHARS.cRight,    db  DOUBLE_BOTTOM_RIGHT_CORNER
423iend
424
425g_BottomBorderWithTimeoutCharacters:
426istruc BORDER_CHARS
427    at  BORDER_CHARS.cLeft,     db  DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
428    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
429    at  BORDER_CHARS.cRight,    db  DOUBLE_BOTTOM_RIGHT_CORNER
430iend
431
432g_rgbTextBorderCharacters:
433istruc BORDER_CHARS
434    at  BORDER_CHARS.cLeft,     db  DOUBLE_VERTICAL
435    at  BORDER_CHARS.cMiddle,   db  ' '
436    at  BORDER_CHARS.cRight,    db  DOUBLE_VERTICAL
437iend
Note: See TracBrowser for help on using the repository browser.