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

Last change on this file since 571 was 568, checked in by krille_n_@…, 10 years ago

Changes:

  • SerDrive: Using named pipe mode (serdrive -p) now works under Windows XP/2000/Server 2003.
  • checksum.pl: Added a compatibility fix for 3Com 3C503 cards.
  • XTIDECFG will now scan every possible segment address to find and load the BIOS and/or its settings from EEPROM. This should simplify things for people using combined option ROMs.
  • Fixed a bug from r521 in BootSector.asm where the BIOS would not display a timeout error if it failed to load the boot sector from harddrive.
  • Fixed a bug from r541 in CompatibleDPT.asm where CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI would generate an invalid checksum in the DPTE.
  • Optimizations and other fixes.
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;--------------------------------------------------------------------
[194]89%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[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:
[293]137 eMOVZX dx, [bp+MENUINIT.bWidth]
[41]138 sub dx, BYTE MENU_HORIZONTAL_BORDER_LINES
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
[568]390 jnb SHORT .NormalTimeout
391 dec si ; SI = ATTRIBUTE_CHARS.cHurryTimeout
392.NormalTimeout:
[104]393 call MenuAttribute_GetToAXfromTypeInSI
394
[60]395 push bp
396 mov bp, sp
[182]397 mov si, g_szSelectionTimeout
[60]398 push ax ; Push attribute
399 push di ; Push seconds
400 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
401 pop bp
[62]402 ret
[60]403
[41]404; Lookup tables for border characters
405g_rgbTopBorderCharacters:
406istruc BORDER_CHARS
407 at BORDER_CHARS.cLeft, db DOUBLE_TOP_LEFT_CORNER
408 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
409 at BORDER_CHARS.cRight, db DOUBLE_TOP_RIGHT_CORNER
410iend
411
412g_rgbSeparationBorderCharacters:
413istruc BORDER_CHARS
414 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL_TO_RIGHT_SINGLE
415 at BORDER_CHARS.cMiddle, db SINGLE_HORIZONTAL
416 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL_TO_LEFT_SINGLE
417iend
418
419g_rgbBottomBorderCharacters:
420istruc BORDER_CHARS
421 at BORDER_CHARS.cLeft, db DOUBLE_BOTTOM_LEFT_CORNER
422 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
423 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
424iend
425
[62]426g_BottomBorderWithTimeoutCharacters:
427istruc BORDER_CHARS
428 at BORDER_CHARS.cLeft, db DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
429 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
430 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
431iend
432
[41]433g_rgbTextBorderCharacters:
434istruc BORDER_CHARS
435 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL
436 at BORDER_CHARS.cMiddle, db ' '
437 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL
438iend
Note: See TracBrowser for help on using the repository browser.