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

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

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

File size: 10.2 KB
Line 
1; File name : MenuBorders.asm
2; Project name : Assembly Library
3; Created date : 14.7.2010
4; Last update : 27.9.2010
5; Author : Tomi Tilli
6; Description : Functions for drawing menu borders.
7
8; Struct containing border characters for different types of menu window lines
9struc BORDER_CHARS
10 .cLeft resb 1
11 .cMiddle resb 1
12 .cRight resb 1
13endstruc
14
15
16; Section containing code
17SECTION .text
18
19;--------------------------------------------------------------------
20; MenuBorders_RefreshAll
21; Parameters
22; SS:BP: Ptr to MENU
23; Returns:
24; Nothing
25; Corrupts registers:
26; AX, BX, CX, DX, SI, DI
27;--------------------------------------------------------------------
28ALIGN JUMP_ALIGN
29MenuBorders_RefreshAll:
30 call MenuBorders_AdjustDisplayContextForDrawingBorders
31 call GetNumberOfMiddleCharactersToDX
32 call RefreshTitleBorders
33 call RefreshItemBorders
34 call RefreshInformationBorders
35 call DrawBottomBorderLine
36 call DrawBottomShadowLine
37 jmp MenuTime_DrawWithoutUpdating
38
39
40;--------------------------------------------------------------------
41; MenuBorders_AdjustDisplayContextForDrawingBorders
42; Parameters
43; SS:BP: Ptr to MENU
44; Returns:
45; Nothing
46; Corrupts registers:
47; AX, DX, SI, DI
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
50MenuBorders_AdjustDisplayContextForDrawingBorders:
51 mov dl, ATTRIBUTES_ARE_USED
52 mov ax, MenuCharOut_MenuBorderTeletypeOutputWithAttribute
53 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInDL
54
55 mov ax, bp
56 CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
57
58 call MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
59 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
60
61 mov si, ATTRIBUTE_CHARS.cBordersAndBackground
62 jmp MenuAttribute_SetToDisplayContextFromTypeInSI
63
64
65;--------------------------------------------------------------------
66; MenuBorders_RefreshItemBorders
67; Parameters
68; SS:BP: Ptr to MENU
69; Returns:
70; Nothing
71; Corrupts registers:
72; AX, BX, CX, DX, SI, DI
73;--------------------------------------------------------------------
74ALIGN JUMP_ALIGN
75MenuBorders_RefreshItemBorders:
76 call MenuBorders_AdjustDisplayContextForDrawingBorders
77 call MenuLocation_GetItemBordersTopLeftCoordinatesToAX
78 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
79
80 call GetNumberOfMiddleCharactersToDX
81 jmp SHORT RefreshItemBorders
82
83
84;--------------------------------------------------------------------
85; GetNumberOfMiddleCharactersToDX
86; Parameters
87; SS:BP: Ptr to MENU
88; Returns:
89; DX: Number of middle border characters when drawing border lines
90; Corrupts registers:
91; Nothing
92;--------------------------------------------------------------------
93ALIGN JUMP_ALIGN
94GetNumberOfMiddleCharactersToDX:
95 eMOVZX dx, BYTE [bp+MENUINIT.bWidth]
96 sub dx, BYTE MENU_HORIZONTAL_BORDER_LINES
97 ret
98
99
100;--------------------------------------------------------------------
101; RefreshTitleBorders
102; Parameters
103; DX: Number of times to repeat middle character
104; SS:BP: Ptr to MENU
105; Returns:
106; Nothing
107; Corrupts registers:
108; AX, BX, CX, SI, DI
109;--------------------------------------------------------------------
110ALIGN JUMP_ALIGN
111RefreshTitleBorders:
112 call DrawTopBorderLine
113 eMOVZX cx, BYTE [bp+MENUINIT.bTitleLines]
114 jmp SHORT DrawTextBorderLinesByCXtimes
115
116;--------------------------------------------------------------------
117; RefreshInformationBorders
118; Parameters
119; DX: Number of times to repeat middle character
120; SS:BP: Ptr to MENU
121; Returns:
122; Nothing
123; Corrupts registers:
124; AX, BX, CX, SI, DI
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
127RefreshInformationBorders:
128 call DrawSeparationBorderLine
129 eMOVZX cx, BYTE [bp+MENUINIT.bInfoLines]
130 jmp SHORT DrawTextBorderLinesByCXtimes
131
132;--------------------------------------------------------------------
133; RefreshItemBorders
134; Parameters
135; DX: Number of times to repeat middle character
136; SS:BP: Ptr to MENU
137; Returns:
138; Nothing
139; Corrupts registers:
140; AX, BX, CX, SI, DI
141;--------------------------------------------------------------------
142ALIGN JUMP_ALIGN
143RefreshItemBorders:
144 call DrawSeparationBorderLine
145 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
146DrawTextBorderLinesByCXtimes:
147 mov bx, DrawTextBorderLine
148 ; Fall to DrawBorderLinesByCXtimes
149
150;--------------------------------------------------------------------
151; DrawBorderLinesByCXtimes
152; Parameters
153; BX: Offset to border drawing function
154; CX: Number of border lines to draw
155; DX: Number of times to repeat middle character
156; SS:BP: Ptr to MENU
157; Returns:
158; Nothing
159; Corrupts registers:
160; AX, CX, SI, DI
161;--------------------------------------------------------------------
162DrawBorderLinesByCXtimes:
163 jcxz .Return
164ALIGN JUMP_ALIGN
165.DrawBordersWithFunctionInBX:
166 call bx
167 loop .DrawBordersWithFunctionInBX
168.Return:
169 ret
170
171
172;--------------------------------------------------------------------
173; DrawTopBorderLine
174; DrawSeparationBorderLine
175; DrawBottomBorderLine
176; DrawBottomShadowLine
177; DrawTextBorderLine
178; Parameters
179; DX: Number of times to repeat middle character
180; SS:BP: Ptr to MENU
181; Returns:
182; Nothing
183; Corrupts registers:
184; AX, SI, DI
185;--------------------------------------------------------------------
186ALIGN JUMP_ALIGN
187DrawTopBorderLine:
188 mov si, g_rgbTopBorderCharacters
189 call PrintBorderCharactersFromCSSI
190 jmp SHORT PrintNewlineToEndBorderLine
191
192ALIGN JUMP_ALIGN
193DrawSeparationBorderLine:
194 mov si, g_rgbSeparationBorderCharacters
195 jmp SHORT PrintBorderCharactersFromCSSIandShadowCharacter
196
197ALIGN JUMP_ALIGN
198DrawBottomBorderLine:
199 mov si, g_rgbBottomBorderCharacters
200 jmp SHORT PrintBorderCharactersFromCSSIandShadowCharacter
201
202ALIGN JUMP_ALIGN
203DrawBottomShadowLine:
204 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
205 inc ax ; Increment column
206 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
207 inc dx ; Increment repeat count...
208 inc dx ; ...for both corner characters
209 call PrintShadowCharactersByDXtimes
210 dec dx ; Restore...
211 dec dx ; ...DX
212 ret
213
214ALIGN JUMP_ALIGN
215DrawTextBorderLine:
216 mov si, g_rgbTextBorderCharacters
217 ; Fall to PrintBorderCharactersFromCSSIandShadowCharacter
218
219;--------------------------------------------------------------------
220; PrintBorderCharactersFromCSSIandShadowCharacter
221; Parameters
222; DX: Number of times to repeat middle character
223; CS:SI: Ptr to BORDER_CHARS
224; SS:BP: Ptr to MENU
225; Returns:
226; Nothing
227; Corrupts registers:
228; AX, SI, DI
229;--------------------------------------------------------------------
230ALIGN JUMP_ALIGN
231PrintBorderCharactersFromCSSIandShadowCharacter:
232 call PrintBorderCharactersFromCSSI
233 push dx
234 mov dx, 1
235 call PrintShadowCharactersByDXtimes
236 pop dx
237 ; Fall to PrintNewlineToEndBorderLine
238
239;--------------------------------------------------------------------
240; PrintNewlineToEndBorderLine
241; Parameters
242; SS:BP: Ptr to MENU
243; Returns:
244; Nothing
245; Corrupts registers:
246; AX, DI
247;--------------------------------------------------------------------
248ALIGN JUMP_ALIGN
249PrintNewlineToEndBorderLine:
250 CALL_DISPLAY_LIBRARY PrintNewlineCharacters
251 ret
252
253
254;--------------------------------------------------------------------
255; PrintShadowCharactersByDXtimes
256; Parameters
257; DX: Number of shadow characters to print
258; SS:BP: Ptr to MENU
259; Returns:
260; Nothing
261; Corrupts registers:
262; AX, SI, DI
263;--------------------------------------------------------------------
264ALIGN JUMP_ALIGN
265PrintShadowCharactersByDXtimes:
266 CALL_DISPLAY_LIBRARY PushDisplayContext
267
268 mov si, ATTRIBUTE_CHARS.cShadow
269 call MenuAttribute_SetToDisplayContextFromTypeInSI
270
271 push dx
272 mov dl, ATTRIBUTES_ARE_USED
273 mov ax, FAST_OUTPUT_WITH_ATTRIBUTE_ONLY
274 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInDL
275 pop dx
276
277 call PrintMultipleBorderCharactersFromAL ; AL does not matter
278
279 CALL_DISPLAY_LIBRARY PopDisplayContext
280 ret
281
282
283;--------------------------------------------------------------------
284; PrintBorderCharactersFromCSSI
285; Parameters
286; DX: Number of times to repeat middle character
287; CS:SI: Ptr to BORDER_CHARS
288; SS:BP: Ptr to MENU
289; Returns:
290; Nothing
291; Corrupts registers:
292; AX, SI, DI
293;--------------------------------------------------------------------
294ALIGN JUMP_ALIGN
295PrintBorderCharactersFromCSSI:
296 cld
297 eSEG cs
298 lodsb ; Load from [si+BORDER_CHARS.cLeft] to AL
299 call MenuBorders_PrintSingleBorderCharacterFromAL
300
301 eSEG cs
302 lodsb ; Load from [si+BORDER_CHARS.cMiddle] to AL
303 call PrintMultipleBorderCharactersFromAL
304
305 eSEG cs
306 lodsb ; Load from [si+BORDER_CHARS.cRight] to AL
307 ; Fall to MenuBorders_PrintSingleBorderCharacterFromAL
308
309;--------------------------------------------------------------------
310; MenuBorders_PrintSingleBorderCharacterFromAL
311; PrintMultipleBorderCharactersFromAL
312; Parameters
313; AL: Character to print
314; DX: Repeat count (PrintMultipleBorderCharactersFromAL)
315; SS:BP: Ptr to MENU
316; Returns:
317; Nothing
318; Corrupts registers:
319; AX, DI
320;--------------------------------------------------------------------
321ALIGN JUMP_ALIGN
322MenuBorders_PrintSingleBorderCharacterFromAL:
323 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
324 ret
325
326ALIGN JUMP_ALIGN
327PrintMultipleBorderCharactersFromAL:
328 push cx
329 mov cx, dx
330 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
331 pop cx
332 ret
333
334
335
336; Lookup tables for border characters
337g_rgbTopBorderCharacters:
338istruc BORDER_CHARS
339 at BORDER_CHARS.cLeft, db DOUBLE_TOP_LEFT_CORNER
340 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
341 at BORDER_CHARS.cRight, db DOUBLE_TOP_RIGHT_CORNER
342iend
343
344g_rgbSeparationBorderCharacters:
345istruc BORDER_CHARS
346 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL_TO_RIGHT_SINGLE
347 at BORDER_CHARS.cMiddle, db SINGLE_HORIZONTAL
348 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL_TO_LEFT_SINGLE
349iend
350
351g_rgbBottomBorderCharacters:
352istruc BORDER_CHARS
353 at BORDER_CHARS.cLeft, db DOUBLE_BOTTOM_LEFT_CORNER
354 at BORDER_CHARS.cMiddle, db DOUBLE_HORIZONTAL
355 at BORDER_CHARS.cRight, db DOUBLE_BOTTOM_RIGHT_CORNER
356iend
357
358g_rgbTextBorderCharacters:
359istruc BORDER_CHARS
360 at BORDER_CHARS.cLeft, db DOUBLE_VERTICAL
361 at BORDER_CHARS.cMiddle, db ' '
362 at BORDER_CHARS.cRight, db DOUBLE_VERTICAL
363iend
Note: See TracBrowser for help on using the repository browser.