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

Last change on this file since 618 was 592, checked in by Krister Nordvall, 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.