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

Last change on this file since 372 was 369, checked in by gregli@…, 13 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 12.8 KB
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for drawing menu borders.
3
4; Struct containing border characters for different types of menu window lines
5struc BORDER_CHARS
6 .cLeft resb 1
7 .cMiddle resb 1
8 .cRight resb 1
9endstruc
10
11
12; Section containing code
13SECTION .text
14
15;--------------------------------------------------------------------
16; MenuBorders_RefreshAll
17; Parameters
18; SS:BP: Ptr to MENU
19; Returns:
20; Nothing
21; Corrupts registers:
22; AX, BX, CX, DX, SI, DI
23;--------------------------------------------------------------------
[369]24ALIGN MENU_JUMP_ALIGN
[41]25MenuBorders_RefreshAll:
[223]26%ifndef USE_186
[41]27 call MenuBorders_AdjustDisplayContextForDrawingBorders
[67]28 call MenuBorders_GetNumberOfMiddleCharactersToDX
[41]29 call RefreshTitleBorders
30 call RefreshItemBorders
31 call RefreshInformationBorders
32 call DrawBottomBorderLine
[60]33 jmp DrawBottomShadowLine
[223]34%else
35 push DrawBottomShadowLine
36 push DrawBottomBorderLine
37 push RefreshInformationBorders
38 push RefreshItemBorders
39 push RefreshTitleBorders
40 push MenuBorders_GetNumberOfMiddleCharactersToDX
41 jmp MenuBorders_AdjustDisplayContextForDrawingBorders
42%endif
[41]43
44
45;--------------------------------------------------------------------
[60]46; MenuBorders_RedrawBottomBorderLine
47; Parameters
48; SS:BP: Ptr to MENU
49; Returns:
50; Nothing
51; Corrupts registers:
52; AX, BX, DX, SI, DI
53;--------------------------------------------------------------------
[369]54ALIGN MENU_JUMP_ALIGN
[60]55MenuBorders_RedrawBottomBorderLine:
56 call MenuBorders_AdjustDisplayContextForDrawingBorders
57 call MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
58 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[67]59 call MenuBorders_GetNumberOfMiddleCharactersToDX
[62]60 jmp SHORT DrawBottomBorderLine
[60]61
62
63;--------------------------------------------------------------------
[104]64; MenuBorders_RefreshItemBorders
65; Parameters
66; SS:BP: Ptr to MENU
67; Returns:
68; Nothing
69; Corrupts registers:
70; AX, BX, CX, DX, SI, DI
71;--------------------------------------------------------------------
[194]72%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]73ALIGN MENU_JUMP_ALIGN
[104]74MenuBorders_RefreshItemBorders:
75 call MenuBorders_AdjustDisplayContextForDrawingBorders
76 call MenuLocation_GetItemBordersTopLeftCoordinatesToAX
77 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
78
79 call MenuBorders_GetNumberOfMiddleCharactersToDX
80 jmp SHORT RefreshItemBorders
[194]81%endif
[104]82
[223]83
[104]84;--------------------------------------------------------------------
[41]85; MenuBorders_AdjustDisplayContextForDrawingBorders
86; Parameters
87; SS:BP: Ptr to MENU
88; Returns:
89; Nothing
90; Corrupts registers:
[45]91; AX, BX, SI, DI
[41]92;--------------------------------------------------------------------
[369]93ALIGN MENU_JUMP_ALIGN
[41]94MenuBorders_AdjustDisplayContextForDrawingBorders:
[45]95 mov bl, ATTRIBUTES_ARE_USED
[52]96 mov ax, MenuCharOut_MenuTeletypeOutput
[45]97 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
[41]98
[52]99 call CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
[41]100 CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
101
102 call MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
103 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
104
105 mov si, ATTRIBUTE_CHARS.cBordersAndBackground
106 jmp MenuAttribute_SetToDisplayContextFromTypeInSI
107
108
109;--------------------------------------------------------------------
[67]110; MenuBorders_GetNumberOfMiddleCharactersToDX
[41]111; Parameters
112; SS:BP: Ptr to MENU
113; Returns:
114; DX: Number of middle border characters when drawing border lines
115; Corrupts registers:
116; Nothing
117;--------------------------------------------------------------------
[369]118ALIGN MENU_JUMP_ALIGN
[67]119MenuBorders_GetNumberOfMiddleCharactersToDX:
[293]120 eMOVZX dx, [bp+MENUINIT.bWidth]
[41]121 sub dx, BYTE MENU_HORIZONTAL_BORDER_LINES
122 ret
123
124
125;--------------------------------------------------------------------
126; RefreshTitleBorders
127; Parameters
128; DX: Number of times to repeat middle character
129; SS:BP: Ptr to MENU
130; Returns:
131; Nothing
132; Corrupts registers:
133; AX, BX, CX, SI, DI
134;--------------------------------------------------------------------
[369]135ALIGN MENU_JUMP_ALIGN
[41]136RefreshTitleBorders:
137 call DrawTopBorderLine
[293]138 eMOVZX cx, [bp+MENUINIT.bTitleLines]
[41]139 jmp SHORT DrawTextBorderLinesByCXtimes
140
141;--------------------------------------------------------------------
142; RefreshInformationBorders
143; Parameters
144; DX: Number of times to repeat middle character
145; SS:BP: Ptr to MENU
146; Returns:
147; Nothing
148; Corrupts registers:
149; AX, BX, CX, SI, DI
150;--------------------------------------------------------------------
[369]151ALIGN MENU_JUMP_ALIGN
[41]152RefreshInformationBorders:
153 call DrawSeparationBorderLine
[293]154 eMOVZX cx, [bp+MENUINIT.bInfoLines]
[41]155 jmp SHORT DrawTextBorderLinesByCXtimes
156
157;--------------------------------------------------------------------
158; RefreshItemBorders
159; Parameters
160; DX: Number of times to repeat middle character
161; SS:BP: Ptr to MENU
162; Returns:
163; Nothing
164; Corrupts registers:
165; AX, BX, CX, SI, DI
166;--------------------------------------------------------------------
[369]167ALIGN MENU_JUMP_ALIGN
[41]168RefreshItemBorders:
169 call DrawSeparationBorderLine
170 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[104]171 ; Fall to DrawTextBorderLinesByCXtimes
[41]172
173;--------------------------------------------------------------------
[104]174; DrawTextBorderLinesByCXtimes
[41]175; Parameters
176; 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;--------------------------------------------------------------------
[104]184DrawTextBorderLinesByCXtimes:
185 jcxz .NoBorderLinesToDraw
[369]186ALIGN MENU_JUMP_ALIGN
[41]187.DrawBordersWithFunctionInBX:
[104]188 call DrawTextBorderLine
[41]189 loop .DrawBordersWithFunctionInBX
[104]190.NoBorderLinesToDraw:
[41]191 ret
192
193
194;--------------------------------------------------------------------
195; DrawTopBorderLine
196; DrawSeparationBorderLine
197; DrawBottomBorderLine
[60]198; DrawTimeoutCounterOverBottomBorderLine
[41]199; DrawBottomShadowLine
200; DrawTextBorderLine
201; Parameters
202; DX: Number of times to repeat middle character
203; SS:BP: Ptr to MENU
204; Returns:
205; Nothing
206; Corrupts registers:
207; AX, SI, DI
208;--------------------------------------------------------------------
[369]209ALIGN MENU_JUMP_ALIGN
[41]210DrawTopBorderLine:
211 mov si, g_rgbTopBorderCharacters
212 call PrintBorderCharactersFromCSSI
213 jmp SHORT PrintNewlineToEndBorderLine
214
[369]215ALIGN MENU_JUMP_ALIGN
[41]216DrawSeparationBorderLine:
217 mov si, g_rgbSeparationBorderCharacters
218 jmp SHORT PrintBorderCharactersFromCSSIandShadowCharacter
219
[369]220ALIGN MENU_JUMP_ALIGN
[41]221DrawBottomBorderLine:
222 mov si, g_rgbBottomBorderCharacters
[62]223 test BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
224 jz SHORT PrintBorderCharactersFromCSSIandShadowCharacter
[41]225
[62]226 call DrawTimeoutCounterString
227 sub dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
228 mov si, g_BottomBorderWithTimeoutCharacters
229 call PrintBorderCharactersFromCSSIandShadowCharacter
230 add dx, BYTE MENU_TIMEOUT_STRING_CHARACTERS
[60]231 ret
232
[369]233ALIGN MENU_JUMP_ALIGN
[41]234DrawBottomShadowLine:
[104]235 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
236 inc ax ; Move one column left
237 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[41]238 inc dx ; Increment repeat count...
239 inc dx ; ...for both corner characters
240 call PrintShadowCharactersByDXtimes
241 dec dx ; Restore...
242 dec dx ; ...DX
243 ret
244
[369]245ALIGN MENU_JUMP_ALIGN
[41]246DrawTextBorderLine:
247 mov si, g_rgbTextBorderCharacters
248 ; Fall to PrintBorderCharactersFromCSSIandShadowCharacter
249
250;--------------------------------------------------------------------
251; PrintBorderCharactersFromCSSIandShadowCharacter
252; Parameters
253; DX: Number of times to repeat middle character
254; CS:SI: Ptr to BORDER_CHARS
255; SS:BP: Ptr to MENU
256; Returns:
257; Nothing
258; Corrupts registers:
259; AX, SI, DI
260;--------------------------------------------------------------------
[369]261ALIGN MENU_JUMP_ALIGN
[41]262PrintBorderCharactersFromCSSIandShadowCharacter:
263 call PrintBorderCharactersFromCSSI
264 push dx
265 mov dx, 1
266 call PrintShadowCharactersByDXtimes
267 pop dx
268 ; Fall to PrintNewlineToEndBorderLine
269
270;--------------------------------------------------------------------
271; PrintNewlineToEndBorderLine
272; Parameters
273; SS:BP: Ptr to MENU
274; Returns:
275; Nothing
276; Corrupts registers:
277; AX, DI
278;--------------------------------------------------------------------
[369]279ALIGN MENU_JUMP_ALIGN
[41]280PrintNewlineToEndBorderLine:
281 CALL_DISPLAY_LIBRARY PrintNewlineCharacters
282 ret
283
284
285;--------------------------------------------------------------------
286; PrintShadowCharactersByDXtimes
287; Parameters
288; DX: Number of shadow characters to print
289; SS:BP: Ptr to MENU
290; Returns:
291; Nothing
292; Corrupts registers:
293; AX, SI, DI
294;--------------------------------------------------------------------
[369]295ALIGN MENU_JUMP_ALIGN
[41]296PrintShadowCharactersByDXtimes:
297 CALL_DISPLAY_LIBRARY PushDisplayContext
298
299 mov si, ATTRIBUTE_CHARS.cShadow
300 call MenuAttribute_SetToDisplayContextFromTypeInSI
301
[45]302 push bx
303 mov bl, ATTRIBUTES_ARE_USED
[41]304 mov ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
[45]305 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
306 pop bx
[41]307
[67]308 call MenuBorders_PrintMultipleBorderCharactersFromAL ; AL does not matter
[41]309
310 CALL_DISPLAY_LIBRARY PopDisplayContext
311 ret
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:
350 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
351 ret
352
[369]353ALIGN MENU_JUMP_ALIGN
[67]354MenuBorders_PrintMultipleBorderCharactersFromAL:
[41]355 push cx
356 mov cx, dx
357 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
358 pop cx
359 ret
360
361
[60]362;--------------------------------------------------------------------
[62]363; DrawTimeoutCounterString
[60]364; Parameters
[62]365; SS:BP: Ptr to MENU
366; Returns:
367; Nothing
368; Corrupts registers:
369; AX, SI, DI
370;--------------------------------------------------------------------
[369]371ALIGN MENU_JUMP_ALIGN
[62]372DrawTimeoutCounterString:
373 call MenuTime_GetTimeoutSecondsLeftToAX
374 ; Fall to .PrintTimeoutStringWithSecondsInAX
375
376;--------------------------------------------------------------------
377; .PrintTimeoutStringWithSecondsInAX
378; Parameters
[60]379; AX: Seconds to print
380; SS:BP: Ptr to MENU
381; Returns:
382; Nothing
383; Corrupts registers:
384; AX, SI, DI
385;--------------------------------------------------------------------
[62]386.PrintTimeoutStringWithSecondsInAX:
[104]387 ; Get attribute to AX
388 xchg di, ax
389 mov si, ATTRIBUTE_CHARS.cNormalTimeout
390 cmp di, BYTE MENU_TIMEOUT_SECONDS_FOR_HURRY
391 eCMOVB si, ATTRIBUTE_CHARS.cHurryTimeout
392 call MenuAttribute_GetToAXfromTypeInSI
393
[60]394 push bp
395 mov bp, sp
[182]396 mov si, g_szSelectionTimeout
[60]397 push ax ; Push attribute
398 push di ; Push seconds
399 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
400 pop bp
[62]401 ret
[60]402
[41]403; Lookup tables for border characters
404g_rgbTopBorderCharacters:
405istruc BORDER_CHARS
406 at BORDER_CHARS.cLeft, db DOUBLE_TOP_LEFT_CORNER
407 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
408 at BORDER_CHARS.cRight, db DOUBLE_TOP_RIGHT_CORNER
409iend
410
411g_rgbSeparationBorderCharacters:
412istruc BORDER_CHARS
413 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL_TO_RIGHT_SINGLE
414 at BORDER_CHARS.cMiddle, db SINGLE_HORIZONTAL
415 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL_TO_LEFT_SINGLE
416iend
417
418g_rgbBottomBorderCharacters:
419istruc BORDER_CHARS
420 at BORDER_CHARS.cLeft, db DOUBLE_BOTTOM_LEFT_CORNER
421 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
422 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
423iend
424
[62]425g_BottomBorderWithTimeoutCharacters:
426istruc BORDER_CHARS
427 at BORDER_CHARS.cLeft, db DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
428 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
429 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
430iend
431
[41]432g_rgbTextBorderCharacters:
433istruc BORDER_CHARS
434 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL
435 at BORDER_CHARS.cMiddle, db ' '
436 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL
437iend
Note: See TracBrowser for help on using the repository browser.