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

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

Changes:

  • XTIDECFG: Fixed a bug from r459 where the menu option for selection of default boot drive would be missing if the BIOS had been built without MODULE_HOTKEYS. The menu option is now visible if either or both of MODULE_HOTKEYS and MODULE_BOOT_MENU is available.
  • BIOS: Disabled ATA-ID validation by adding a new define (NO_ATAID_VALIDATION) and making it the default for all builds since at least two WD Caviar drive models are incompatible with it.
  • Fixed the "No Fixed Disk Present in FDISK"-bug introduced in r551 which means the Tiny build now works without including MODULE_DRIVEXLATE.
  • Fixed a bug from r528 where pressing hotkey F6 would not initiate detection of serial drives.
  • Fixed a bug from r186 in DisplayFormatCompressed.asm where the boot menu would print the IRQ in hexadecimal format when it should be in decimal format.
  • Optimizations and fixes.
File size: 12.9 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for drawing menu borders.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
21; Struct containing border characters for different types of menu window lines
22struc BORDER_CHARS
23    .cLeft      resb    1
24    .cMiddle    resb    1
25    .cRight     resb    1
26endstruc
27
28
29; Section containing code
30SECTION .text
31
32;--------------------------------------------------------------------
33; MenuBorders_RefreshAll
34;   Parameters
35;       SS:BP:  Ptr to MENU
36;   Returns:
37;       Nothing
38;   Corrupts registers:
39;       AX, BX, CX, DX, SI, DI
40;--------------------------------------------------------------------
41ALIGN MENU_JUMP_ALIGN
42MenuBorders_RefreshAll:
43%ifndef USE_186
44    call    MenuBorders_AdjustDisplayContextForDrawingBorders
45    call    MenuBorders_GetNumberOfMiddleCharactersToDX
46    call    RefreshTitleBorders
47    call    RefreshItemBorders
48    call    RefreshInformationBorders
49    call    DrawBottomBorderLine
50    jmp     DrawBottomShadowLine
51%else
52    push    DrawBottomShadowLine
53    push    DrawBottomBorderLine
54    push    RefreshInformationBorders
55    push    RefreshItemBorders
56    push    RefreshTitleBorders
57    push    MenuBorders_GetNumberOfMiddleCharactersToDX
58    jmp     SHORT MenuBorders_AdjustDisplayContextForDrawingBorders
59%endif
60
61
62;--------------------------------------------------------------------
63; MenuBorders_RedrawBottomBorderLine
64;   Parameters
65;       SS:BP:  Ptr to MENU
66;   Returns:
67;       Nothing
68;   Corrupts registers:
69;       AX, BX, DX, SI, DI
70;--------------------------------------------------------------------
71ALIGN MENU_JUMP_ALIGN
72MenuBorders_RedrawBottomBorderLine:
73    call    MenuBorders_AdjustDisplayContextForDrawingBorders
74    call    MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
75    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
76    call    MenuBorders_GetNumberOfMiddleCharactersToDX
77    jmp     SHORT DrawBottomBorderLine
78
79
80;--------------------------------------------------------------------
81; MenuBorders_RefreshItemBorders
82;   Parameters
83;       SS:BP:  Ptr to MENU
84;   Returns:
85;       Nothing
86;   Corrupts registers:
87;       AX, BX, CX, DX, SI, DI
88;--------------------------------------------------------------------
89%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
90ALIGN MENU_JUMP_ALIGN
91MenuBorders_RefreshItemBorders:
92    call    MenuBorders_AdjustDisplayContextForDrawingBorders
93    call    MenuLocation_GetItemBordersTopLeftCoordinatesToAX
94    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
95
96    call    MenuBorders_GetNumberOfMiddleCharactersToDX
97    jmp     SHORT RefreshItemBorders
98%endif
99
100
101;--------------------------------------------------------------------
102; MenuBorders_AdjustDisplayContextForDrawingBorders
103;   Parameters
104;       SS:BP:  Ptr to MENU
105;   Returns:
106;       Nothing
107;   Corrupts registers:
108;       AX, BX, SI, DI
109;--------------------------------------------------------------------
110ALIGN MENU_JUMP_ALIGN
111MenuBorders_AdjustDisplayContextForDrawingBorders:
112    mov     bl, ATTRIBUTES_ARE_USED
113    mov     ax, MenuCharOut_MenuTeletypeOutput
114    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
115
116    call    CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
117    CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
118
119    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
120    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
121
122    xor     si, si      ; SI = ATTRIBUTE_CHARS.cBordersAndBackground
123    jmp     MenuAttribute_SetToDisplayContextFromTypeInSI
124
125
126;--------------------------------------------------------------------
127; MenuBorders_GetNumberOfMiddleCharactersToDX
128;   Parameters
129;       SS:BP:  Ptr to MENU
130;   Returns:
131;       DX:     Number of middle border characters when drawing border lines
132;   Corrupts registers:
133;       Nothing
134;--------------------------------------------------------------------
135ALIGN MENU_JUMP_ALIGN
136MenuBorders_GetNumberOfMiddleCharactersToDX:
137    eMOVZX  dx, [bp+MENUINIT.bWidth]
138    sub     dx, BYTE MENU_HORIZONTAL_BORDER_LINES
139    ret
140
141
142;--------------------------------------------------------------------
143; RefreshItemBorders
144; RefreshTitleBorders
145; RefreshInformationBorders
146;   Parameters
147;       DX:     Number of times to repeat middle character
148;       SS:BP:  Ptr to MENU
149;   Returns:
150;       Nothing
151;   Corrupts registers:
152;       AX, BX, CX, SI, DI
153;--------------------------------------------------------------------
154ALIGN MENU_JUMP_ALIGN
155RefreshItemBorders:
156    call    DrawSeparationBorderLine
157    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
158    jmp     SHORT DrawTextBorderLinesByCXtimes
159
160ALIGN MENU_JUMP_ALIGN
161RefreshTitleBorders:
162    call    DrawTopBorderLine
163    mov     cl, [bp+MENUINIT.bTitleLines]
164    jmp     SHORT DrawTextBorderLinesByCLtimes
165
166ALIGN MENU_JUMP_ALIGN
167RefreshInformationBorders:
168    call    DrawSeparationBorderLine
169    mov     cl, [bp+MENUINIT.bInfoLines]
170    ; Fall to DrawTextBorderLinesByCLtimes
171
172;--------------------------------------------------------------------
173; DrawTextBorderLinesByCLtimes
174; DrawTextBorderLinesByCXtimes
175;   Parameters
176;       CL/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;--------------------------------------------------------------------
184DrawTextBorderLinesByCLtimes:
185    xor     ch, ch
186DrawTextBorderLinesByCXtimes:
187    jcxz    .NoBorderLinesToDraw
188ALIGN MENU_JUMP_ALIGN
189.DrawBordersWithFunctionInBX:
190    call    DrawTextBorderLine
191    loop    .DrawBordersWithFunctionInBX
192.NoBorderLinesToDraw:
193    ret
194
195
196;--------------------------------------------------------------------
197; DrawTopBorderLine
198; DrawSeparationBorderLine
199; DrawBottomBorderLine
200; DrawBottomShadowLine
201; DrawTextBorderLine
202;   Parameters
203;       DX:     Number of times to repeat middle character
204;       SS:BP:  Ptr to MENU
205;   Returns:
206;       Nothing
207;   Corrupts registers:
208;       AX, SI, DI
209;--------------------------------------------------------------------
210ALIGN MENU_JUMP_ALIGN
211DrawTopBorderLine:
212    mov     si, g_rgbTopBorderCharacters
213    call    PrintBorderCharactersFromCSSI
214    jmp     SHORT PrintNewlineToEndBorderLine
215
216ALIGN MENU_JUMP_ALIGN
217DrawSeparationBorderLine:
218    mov     si, g_rgbSeparationBorderCharacters
219    jmp     SHORT PrintBorderCharactersFromCSSIandShadowCharacter
220
221ALIGN MENU_JUMP_ALIGN
222DrawBottomBorderLine:
223    mov     si, g_rgbBottomBorderCharacters
224    test    BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
225    jz      SHORT PrintBorderCharactersFromCSSIandShadowCharacter
226
227    call    DrawTimeoutCounterString
228    push    dx
229    sub     dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
230    mov     si, g_BottomBorderWithTimeoutCharacters
231    call    PrintBorderCharactersFromCSSIandShadowCharacter
232    pop     dx
233    ret
234
235ALIGN MENU_JUMP_ALIGN
236DrawBottomShadowLine:
237    CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
238    inc     ax          ; Move one column left
239    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
240    inc     dx          ; Increment repeat count...
241    inc     dx          ; ...for both corner characters
242    call    PrintShadowCharactersByDXtimes
243    dec     dx          ; Restore...
244    dec     dx          ; ...DX
245    ret
246
247ALIGN MENU_JUMP_ALIGN
248DrawTextBorderLine:
249    mov     si, g_rgbTextBorderCharacters
250    ; Fall to PrintBorderCharactersFromCSSIandShadowCharacter
251
252;--------------------------------------------------------------------
253; PrintBorderCharactersFromCSSIandShadowCharacter
254;   Parameters
255;       DX:     Number of times to repeat middle character
256;       CS:SI:  Ptr to BORDER_CHARS
257;       SS:BP:  Ptr to MENU
258;   Returns:
259;       Nothing
260;   Corrupts registers:
261;       AX, SI, DI
262;--------------------------------------------------------------------
263ALIGN MENU_JUMP_ALIGN
264PrintBorderCharactersFromCSSIandShadowCharacter:
265    call    PrintBorderCharactersFromCSSI
266    push    dx
267    mov     dx, 1
268    call    PrintShadowCharactersByDXtimes
269    pop     dx
270    ; Fall to PrintNewlineToEndBorderLine
271
272;--------------------------------------------------------------------
273; PrintNewlineToEndBorderLine
274;   Parameters
275;       SS:BP:  Ptr to MENU
276;   Returns:
277;       Nothing
278;   Corrupts registers:
279;       AX, DI
280;--------------------------------------------------------------------
281ALIGN MENU_JUMP_ALIGN
282PrintNewlineToEndBorderLine:
283    JMP_DISPLAY_LIBRARY PrintNewlineCharacters
284
285
286;--------------------------------------------------------------------
287; PrintShadowCharactersByDXtimes
288;   Parameters
289;       DX:     Number of shadow characters to print
290;       SS:BP:  Ptr to MENU
291;   Returns:
292;       Nothing
293;   Corrupts registers:
294;       AX, SI, DI
295;--------------------------------------------------------------------
296ALIGN MENU_JUMP_ALIGN
297PrintShadowCharactersByDXtimes:
298    CALL_DISPLAY_LIBRARY PushDisplayContext
299
300    mov     si, ATTRIBUTE_CHARS.cShadow
301    call    MenuAttribute_SetToDisplayContextFromTypeInSI
302
303    push    bx
304    mov     bl, ATTRIBUTES_ARE_USED
305    mov     ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
306    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
307    pop     bx
308
309    call    MenuBorders_PrintMultipleBorderCharactersFromAL ; AL does not matter
310
311    JMP_DISPLAY_LIBRARY PopDisplayContext
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 MENU_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 MENU_JUMP_ALIGN
349MenuBorders_PrintSingleBorderCharacterFromAL:
350    JMP_DISPLAY_LIBRARY PrintCharacterFromAL
351
352ALIGN MENU_JUMP_ALIGN
353MenuBorders_PrintMultipleBorderCharactersFromAL:
354    push    cx
355    mov     cx, dx
356    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
357    pop     cx
358    ret
359
360
361;--------------------------------------------------------------------
362; DrawTimeoutCounterString
363;   Parameters
364;       SS:BP:  Ptr to MENU
365;   Returns:
366;       Nothing
367;   Corrupts registers:
368;       AX, SI, DI
369;--------------------------------------------------------------------
370ALIGN MENU_JUMP_ALIGN
371DrawTimeoutCounterString:
372    call    MenuTime_GetTimeoutSecondsLeftToAX
373    ; Fall to .PrintTimeoutStringWithSecondsInAX
374
375;--------------------------------------------------------------------
376; .PrintTimeoutStringWithSecondsInAX
377;   Parameters
378;       AX:     Seconds to print
379;       SS:BP:  Ptr to MENU
380;   Returns:
381;       Nothing
382;   Corrupts registers:
383;       AX, SI, DI
384;--------------------------------------------------------------------
385.PrintTimeoutStringWithSecondsInAX:
386    ; Get attribute to AX
387    xchg    di, ax
388    mov     si, ATTRIBUTE_CHARS.cNormalTimeout
389    cmp     di, BYTE MENU_TIMEOUT_SECONDS_FOR_HURRY
390    sbb     si, 0       ; SI = ATTRIBUTE_CHARS.cHurryTimeout (if CF was set)
391    call    MenuAttribute_GetToAXfromTypeInSI
392
393    push    bp
394    mov     bp, sp
395    mov     si, g_szSelectionTimeout
396    push    ax          ; Push attribute
397    push    di          ; Push seconds
398    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
399    pop     bp
400    ret
401
402; Lookup tables for border characters
403g_rgbTopBorderCharacters:
404istruc BORDER_CHARS
405    at  BORDER_CHARS.cLeft,     db  DOUBLE_TOP_LEFT_CORNER
406    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
407    at  BORDER_CHARS.cRight,    db  DOUBLE_TOP_RIGHT_CORNER
408iend
409
410g_rgbSeparationBorderCharacters:
411istruc BORDER_CHARS
412    at  BORDER_CHARS.cLeft,     db  DOUBLE_VERTICAL_TO_RIGHT_SINGLE
413    at  BORDER_CHARS.cMiddle,   db  SINGLE_HORIZONTAL
414    at  BORDER_CHARS.cRight,    db  DOUBLE_VERTICAL_TO_LEFT_SINGLE
415iend
416
417g_rgbBottomBorderCharacters:
418istruc BORDER_CHARS
419    at  BORDER_CHARS.cLeft,     db  DOUBLE_BOTTOM_LEFT_CORNER
420    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
421    at  BORDER_CHARS.cRight,    db  DOUBLE_BOTTOM_RIGHT_CORNER
422iend
423
424g_BottomBorderWithTimeoutCharacters:
425istruc BORDER_CHARS
426    at  BORDER_CHARS.cLeft,     db  DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
427    at  BORDER_CHARS.cMiddle,   db  DOUBLE_HORIZONTAL
428    at  BORDER_CHARS.cRight,    db  DOUBLE_BOTTOM_RIGHT_CORNER
429iend
430
431g_rgbTextBorderCharacters:
432istruc BORDER_CHARS
433    at  BORDER_CHARS.cLeft,     db  DOUBLE_VERTICAL
434    at  BORDER_CHARS.cMiddle,   db  ' '
435    at  BORDER_CHARS.cRight,    db  DOUBLE_VERTICAL
436iend
Note: See TracBrowser for help on using the repository browser.