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

Last change on this file was 592, checked in by krille_n_, 6 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
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_XUB OR EXCLUDE_FROM_XTIDECFG
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    mov     dx, -MENU_HORIZONTAL_BORDER_LINES & 0FFh
138    add     dl, [bp+MENUINIT.bWidth]
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.