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

Last change on this file since 596 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
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.