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

Last change on this file since 147 was 105, checked in by Tomi Tilli, 14 years ago

Changes to Assembly Library:

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