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

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

General code size optimizations, preparing for string compression, consolidating all strings into strings.asm. Note that some changes resulted in slightly larger size now uncompressed, but will be net win when compressed.

File size: 12.4 KB
Line 
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
27 call MenuBorders_GetNumberOfMiddleCharactersToDX
28 call RefreshTitleBorders
29 call RefreshItemBorders
30 call RefreshInformationBorders
31 call DrawBottomBorderLine
32 jmp DrawBottomShadowLine
33
34
35;--------------------------------------------------------------------
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
49 call MenuBorders_GetNumberOfMiddleCharactersToDX
50 jmp SHORT DrawBottomBorderLine
51
52
53;--------------------------------------------------------------------
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;--------------------------------------------------------------------
73; MenuBorders_AdjustDisplayContextForDrawingBorders
74; Parameters
75; SS:BP: Ptr to MENU
76; Returns:
77; Nothing
78; Corrupts registers:
79; AX, BX, SI, DI
80;--------------------------------------------------------------------
81ALIGN JUMP_ALIGN
82MenuBorders_AdjustDisplayContextForDrawingBorders:
83 mov bl, ATTRIBUTES_ARE_USED
84 mov ax, MenuCharOut_MenuTeletypeOutput
85 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
86
87 call CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
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;--------------------------------------------------------------------
98; MenuBorders_GetNumberOfMiddleCharactersToDX
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
107MenuBorders_GetNumberOfMiddleCharactersToDX:
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
159 ; Fall to DrawTextBorderLinesByCXtimes
160
161;--------------------------------------------------------------------
162; DrawTextBorderLinesByCXtimes
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;--------------------------------------------------------------------
172DrawTextBorderLinesByCXtimes:
173 jcxz .NoBorderLinesToDraw
174ALIGN JUMP_ALIGN
175.DrawBordersWithFunctionInBX:
176 call DrawTextBorderLine
177 loop .DrawBordersWithFunctionInBX
178.NoBorderLinesToDraw:
179 ret
180
181
182;--------------------------------------------------------------------
183; DrawTopBorderLine
184; DrawSeparationBorderLine
185; DrawBottomBorderLine
186; DrawTimeoutCounterOverBottomBorderLine
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
211 test BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
212 jz SHORT PrintBorderCharactersFromCSSIandShadowCharacter
213
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
219 ret
220
221ALIGN JUMP_ALIGN
222DrawBottomShadowLine:
223 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
224 inc ax ; Move one column left
225 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
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
290 push bx
291 mov bl, ATTRIBUTES_ARE_USED
292 mov ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
293 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
294 pop bx
295
296 call MenuBorders_PrintMultipleBorderCharactersFromAL ; AL does not matter
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
316 lodsb ; Load from [cs:si+BORDER_CHARS.cLeft] to AL
317 call MenuBorders_PrintSingleBorderCharacterFromAL
318
319 eSEG cs
320 lodsb ; Load from [cs:si+BORDER_CHARS.cMiddle] to AL
321 call MenuBorders_PrintMultipleBorderCharactersFromAL
322
323 eSEG cs
324 lodsb ; Load from [cs:si+BORDER_CHARS.cRight] to AL
325 ; Fall to MenuBorders_PrintSingleBorderCharacterFromAL
326
327;--------------------------------------------------------------------
328; MenuBorders_PrintSingleBorderCharacterFromAL
329; MenuBorders_PrintMultipleBorderCharactersFromAL
330; Parameters
331; AL: Character to print
332; DX: Repeat count (MenuBorders_PrintMultipleBorderCharactersFromAL)
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
345MenuBorders_PrintMultipleBorderCharactersFromAL:
346 push cx
347 mov cx, dx
348 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
349 pop cx
350 ret
351
352
353;--------------------------------------------------------------------
354; DrawTimeoutCounterString
355; Parameters
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
370; AX: Seconds to print
371; SS:BP: Ptr to MENU
372; Returns:
373; Nothing
374; Corrupts registers:
375; AX, SI, DI
376;--------------------------------------------------------------------
377.PrintTimeoutStringWithSecondsInAX:
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
385 push bp
386 mov bp, sp
387 mov si, g_szSelectionTimeout
388 push ax ; Push attribute
389 push di ; Push seconds
390 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
391 pop bp
392 ret
393
394; Lookup tables for border characters
395g_rgbTopBorderCharacters:
396istruc BORDER_CHARS
397 at BORDER_CHARS.cLeft, db DOUBLE_TOP_LEFT_CORNER
398 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
399 at BORDER_CHARS.cRight, db DOUBLE_TOP_RIGHT_CORNER
400iend
401
402g_rgbSeparationBorderCharacters:
403istruc BORDER_CHARS
404 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL_TO_RIGHT_SINGLE
405 at BORDER_CHARS.cMiddle, db SINGLE_HORIZONTAL
406 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL_TO_LEFT_SINGLE
407iend
408
409g_rgbBottomBorderCharacters:
410istruc BORDER_CHARS
411 at BORDER_CHARS.cLeft, db DOUBLE_BOTTOM_LEFT_CORNER
412 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
413 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
414iend
415
416g_BottomBorderWithTimeoutCharacters:
417istruc BORDER_CHARS
418 at BORDER_CHARS.cLeft, db DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
419 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
420 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
421iend
422
423g_rgbTextBorderCharacters:
424istruc BORDER_CHARS
425 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL
426 at BORDER_CHARS.cMiddle, db ' '
427 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL
428iend
Note: See TracBrowser for help on using the repository browser.