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

Last change on this file since 592 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
RevLine 
[41]1; Project name  :   Assembly Library
2; Description   :   Functions for drawing menu borders.
3
[376]4;
[505]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[505]12;
[376]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
[505]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
[505]20
[41]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;--------------------------------------------------------------------
[369]41ALIGN MENU_JUMP_ALIGN
[41]42MenuBorders_RefreshAll:
[223]43%ifndef USE_186
[41]44    call    MenuBorders_AdjustDisplayContextForDrawingBorders
[67]45    call    MenuBorders_GetNumberOfMiddleCharactersToDX
[41]46    call    RefreshTitleBorders
47    call    RefreshItemBorders
48    call    RefreshInformationBorders
49    call    DrawBottomBorderLine
[60]50    jmp     DrawBottomShadowLine
[223]51%else
52    push    DrawBottomShadowLine
53    push    DrawBottomBorderLine
54    push    RefreshInformationBorders
55    push    RefreshItemBorders
56    push    RefreshTitleBorders
57    push    MenuBorders_GetNumberOfMiddleCharactersToDX
[568]58    jmp     SHORT MenuBorders_AdjustDisplayContextForDrawingBorders
[223]59%endif
[41]60
61
62;--------------------------------------------------------------------
[60]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;--------------------------------------------------------------------
[369]71ALIGN MENU_JUMP_ALIGN
[60]72MenuBorders_RedrawBottomBorderLine:
73    call    MenuBorders_AdjustDisplayContextForDrawingBorders
74    call    MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
75    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[67]76    call    MenuBorders_GetNumberOfMiddleCharactersToDX
[62]77    jmp     SHORT DrawBottomBorderLine
[60]78
79
80;--------------------------------------------------------------------
[104]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;--------------------------------------------------------------------
[592]89%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_XTIDECFG
[369]90ALIGN MENU_JUMP_ALIGN
[104]91MenuBorders_RefreshItemBorders:
92    call    MenuBorders_AdjustDisplayContextForDrawingBorders
93    call    MenuLocation_GetItemBordersTopLeftCoordinatesToAX
94    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
95
96    call    MenuBorders_GetNumberOfMiddleCharactersToDX
97    jmp     SHORT RefreshItemBorders
[194]98%endif
[104]99
[223]100
[104]101;--------------------------------------------------------------------
[41]102; MenuBorders_AdjustDisplayContextForDrawingBorders
103;   Parameters
104;       SS:BP:  Ptr to MENU
105;   Returns:
106;       Nothing
107;   Corrupts registers:
[45]108;       AX, BX, SI, DI
[41]109;--------------------------------------------------------------------
[369]110ALIGN MENU_JUMP_ALIGN
[41]111MenuBorders_AdjustDisplayContextForDrawingBorders:
[45]112    mov     bl, ATTRIBUTES_ARE_USED
[52]113    mov     ax, MenuCharOut_MenuTeletypeOutput
[45]114    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
[41]115
[52]116    call    CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
[41]117    CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
118
119    call    MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
120    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
121
[568]122    xor     si, si      ; SI = ATTRIBUTE_CHARS.cBordersAndBackground
[41]123    jmp     MenuAttribute_SetToDisplayContextFromTypeInSI
124
125
126;--------------------------------------------------------------------
[67]127; MenuBorders_GetNumberOfMiddleCharactersToDX
[41]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;--------------------------------------------------------------------
[369]135ALIGN MENU_JUMP_ALIGN
[67]136MenuBorders_GetNumberOfMiddleCharactersToDX:
[583]137    mov     dx, -MENU_HORIZONTAL_BORDER_LINES & 0FFh
138    add     dl, [bp+MENUINIT.bWidth]
[41]139    ret
140
141
142;--------------------------------------------------------------------
[568]143; RefreshItemBorders
[41]144; RefreshTitleBorders
[568]145; RefreshInformationBorders
[41]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;--------------------------------------------------------------------
[369]154ALIGN MENU_JUMP_ALIGN
[568]155RefreshItemBorders:
156    call    DrawSeparationBorderLine
157    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
158    jmp     SHORT DrawTextBorderLinesByCXtimes
159
160ALIGN MENU_JUMP_ALIGN
[41]161RefreshTitleBorders:
162    call    DrawTopBorderLine
[568]163    mov     cl, [bp+MENUINIT.bTitleLines]
164    jmp     SHORT DrawTextBorderLinesByCLtimes
[41]165
[369]166ALIGN MENU_JUMP_ALIGN
[41]167RefreshInformationBorders:
168    call    DrawSeparationBorderLine
[568]169    mov     cl, [bp+MENUINIT.bInfoLines]
170    ; Fall to DrawTextBorderLinesByCLtimes
[41]171
172;--------------------------------------------------------------------
[568]173; DrawTextBorderLinesByCLtimes
[104]174; DrawTextBorderLinesByCXtimes
[41]175;   Parameters
[568]176;       CL/CX:  Number of border lines to draw
[41]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;--------------------------------------------------------------------
[568]184DrawTextBorderLinesByCLtimes:
185    xor     ch, ch
[104]186DrawTextBorderLinesByCXtimes:
187    jcxz    .NoBorderLinesToDraw
[369]188ALIGN MENU_JUMP_ALIGN
[41]189.DrawBordersWithFunctionInBX:
[104]190    call    DrawTextBorderLine
[41]191    loop    .DrawBordersWithFunctionInBX
[104]192.NoBorderLinesToDraw:
[41]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;--------------------------------------------------------------------
[369]210ALIGN MENU_JUMP_ALIGN
[41]211DrawTopBorderLine:
212    mov     si, g_rgbTopBorderCharacters
213    call    PrintBorderCharactersFromCSSI
214    jmp     SHORT PrintNewlineToEndBorderLine
215
[369]216ALIGN MENU_JUMP_ALIGN
[41]217DrawSeparationBorderLine:
218    mov     si, g_rgbSeparationBorderCharacters
219    jmp     SHORT PrintBorderCharactersFromCSSIandShadowCharacter
220
[369]221ALIGN MENU_JUMP_ALIGN
[41]222DrawBottomBorderLine:
223    mov     si, g_rgbBottomBorderCharacters
[62]224    test    BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
225    jz      SHORT PrintBorderCharactersFromCSSIandShadowCharacter
[41]226
[62]227    call    DrawTimeoutCounterString
[568]228    push    dx
[62]229    sub     dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
230    mov     si, g_BottomBorderWithTimeoutCharacters
231    call    PrintBorderCharactersFromCSSIandShadowCharacter
[568]232    pop     dx
[60]233    ret
234
[369]235ALIGN MENU_JUMP_ALIGN
[41]236DrawBottomShadowLine:
[104]237    CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
238    inc     ax          ; Move one column left
239    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[41]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
[369]247ALIGN MENU_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[369]263ALIGN MENU_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[369]281ALIGN MENU_JUMP_ALIGN
[41]282PrintNewlineToEndBorderLine:
[505]283    JMP_DISPLAY_LIBRARY PrintNewlineCharacters
[41]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;--------------------------------------------------------------------
[369]296ALIGN MENU_JUMP_ALIGN
[41]297PrintShadowCharactersByDXtimes:
298    CALL_DISPLAY_LIBRARY PushDisplayContext
299
300    mov     si, ATTRIBUTE_CHARS.cShadow
301    call    MenuAttribute_SetToDisplayContextFromTypeInSI
302
[45]303    push    bx
304    mov     bl, ATTRIBUTES_ARE_USED
[41]305    mov     ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
[45]306    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
307    pop     bx
[41]308
[67]309    call    MenuBorders_PrintMultipleBorderCharactersFromAL ; AL does not matter
[41]310
[505]311    JMP_DISPLAY_LIBRARY PopDisplayContext
[41]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;--------------------------------------------------------------------
[369]325ALIGN MENU_JUMP_ALIGN
[41]326PrintBorderCharactersFromCSSI:
[223]327    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cLeft] to AL
[41]328    call    MenuBorders_PrintSingleBorderCharacterFromAL
329
[223]330    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cMiddle] to AL
[67]331    call    MenuBorders_PrintMultipleBorderCharactersFromAL
[41]332
[223]333    cs lodsb        ; Load from [cs:si+BORDER_CHARS.cRight] to AL
[41]334    ; Fall to MenuBorders_PrintSingleBorderCharacterFromAL
335
336;--------------------------------------------------------------------
337; MenuBorders_PrintSingleBorderCharacterFromAL
[67]338; MenuBorders_PrintMultipleBorderCharactersFromAL
[41]339;   Parameters
340;       AL:     Character to print
[67]341;       DX:     Repeat count (MenuBorders_PrintMultipleBorderCharactersFromAL)
[41]342;       SS:BP:  Ptr to MENU
343;   Returns:
344;       Nothing
345;   Corrupts registers:
346;       AX, DI
347;--------------------------------------------------------------------
[369]348ALIGN MENU_JUMP_ALIGN
[41]349MenuBorders_PrintSingleBorderCharacterFromAL:
[505]350    JMP_DISPLAY_LIBRARY PrintCharacterFromAL
[41]351
[369]352ALIGN MENU_JUMP_ALIGN
[67]353MenuBorders_PrintMultipleBorderCharactersFromAL:
[41]354    push    cx
355    mov     cx, dx
356    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
357    pop     cx
358    ret
359
360
[60]361;--------------------------------------------------------------------
[62]362; DrawTimeoutCounterString
[60]363;   Parameters
[62]364;       SS:BP:  Ptr to MENU
365;   Returns:
366;       Nothing
367;   Corrupts registers:
368;       AX, SI, DI
369;--------------------------------------------------------------------
[369]370ALIGN MENU_JUMP_ALIGN
[62]371DrawTimeoutCounterString:
372    call    MenuTime_GetTimeoutSecondsLeftToAX
373    ; Fall to .PrintTimeoutStringWithSecondsInAX
374
375;--------------------------------------------------------------------
376; .PrintTimeoutStringWithSecondsInAX
377;   Parameters
[60]378;       AX:     Seconds to print
379;       SS:BP:  Ptr to MENU
380;   Returns:
381;       Nothing
382;   Corrupts registers:
383;       AX, SI, DI
384;--------------------------------------------------------------------
[62]385.PrintTimeoutStringWithSecondsInAX:
[104]386    ; Get attribute to AX
387    xchg    di, ax
388    mov     si, ATTRIBUTE_CHARS.cNormalTimeout
389    cmp     di, BYTE MENU_TIMEOUT_SECONDS_FOR_HURRY
[580]390    sbb     si, 0       ; SI = ATTRIBUTE_CHARS.cHurryTimeout (if CF was set)
[104]391    call    MenuAttribute_GetToAXfromTypeInSI
392
[60]393    push    bp
394    mov     bp, sp
[182]395    mov     si, g_szSelectionTimeout
[60]396    push    ax          ; Push attribute
397    push    di          ; Push seconds
398    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
399    pop     bp
[62]400    ret
[60]401
[41]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
[62]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
[41]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.