source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuText.asm@ 52

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

Changes to Assembly Library:
Completely rewritten line splitting (slower but no need to modify string).
Some changes to string processing functions.
Saved few bytes from CGA detection.

File size: 7.8 KB
Line 
1; File name : MenuText.asm
2; Project name : Assembly Library
3; Created date : 21.7.2010
4; Last update : 12.10.2010
5; Author : Tomi Tilli
6; Description : Functions for drawing menu texts by the user.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; MenuText_ClearTitleArea
13; MenuText_ClearInformationArea
14; Parameters
15; SS:BP: Ptr to MENU
16; Returns:
17; Nothing
18; Corrupts registers:
19; AX, BX, CX, DX, SI, DI
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22MenuText_ClearTitleArea:
23 call PrepareToDrawTitleArea
24 mov cl, [bp+MENUINIT.bTitleLines]
25 jmp SHORT ClearCLlinesOfText
26
27ALIGN JUMP_ALIGN
28MenuText_ClearInformationArea:
29 call PrepareToDrawInformationArea
30 mov cl, [bp+MENUINIT.bInfoLines]
31ClearCLlinesOfText:
32 mov al, [bp+MENUINIT.bWidth]
33 sub al, MENU_HORIZONTAL_BORDER_LINES+MENU_TEXT_COLUMN_OFFSET
34 mul cl
35 xchg cx, ax
36 mov al, ' '
37 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
38 ret
39
40
41;--------------------------------------------------------------------
42; MenuText_RefreshTitle
43; MenuText_RefreshInformation
44; Parameters
45; SS:BP: Ptr to MENU
46; Returns:
47; Nothing
48; Corrupts registers:
49; AX, BX, CX, DX, SI, DI
50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
52MenuText_RefreshTitle:
53 cmp BYTE [bp+MENUINIT.bTitleLines], 0
54 jz SHORT NothingToRefresh
55 call PrepareToDrawTitleArea
56 jmp MenuEvent_RefreshTitle
57
58ALIGN JUMP_ALIGN
59MenuText_RefreshInformation:
60 cmp BYTE [bp+MENUINIT.bInfoLines], 0
61 jz SHORT NothingToRefresh
62 call PrepareToDrawInformationArea
63 jmp MenuEvent_RefreshInformation
64
65;--------------------------------------------------------------------
66; PrepareToDrawTitleArea
67; PrepareToDrawInformationArea
68; Parameters
69; SS:BP: Ptr to MENU
70; Returns:
71; Nothing
72; Corrupts registers:
73; AX, BX, DX, SI, DI
74;--------------------------------------------------------------------
75ALIGN JUMP_ALIGN
76PrepareToDrawTitleArea:
77 mov si, ATTRIBUTE_CHARS.cTitle
78 call MenuLocation_GetTitleTextTopLeftCoordinatesToAX
79 jmp SHORT FinishPreparationsToDrawTitleOrInformationArea
80
81ALIGN JUMP_ALIGN
82PrepareToDrawInformationArea:
83 mov si, ATTRIBUTE_CHARS.cInformation
84 call MenuLocation_GetInformationTextTopLeftCoordinatesToAX
85FinishPreparationsToDrawTitleOrInformationArea:
86 mov dx, MenuCharOut_MenuTeletypeOutputWithAutomaticLineChange
87 jmp SHORT AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX
88
89
90;--------------------------------------------------------------------
91; MenuText_RefreshAllItems
92; Parameters
93; SS:BP: Ptr to MENU
94; Returns:
95; Nothing
96; Corrupts registers:
97; AX, BX, DX, SI, DI
98;--------------------------------------------------------------------
99ALIGN JUMP_ALIGN
100MenuText_RefreshAllItems:
101 push cx
102
103 call MenuScrollbars_GetActualVisibleItemsOnPageToCX
104 mov ax, [bp+MENU.wFirstVisibleItem]
105ALIGN JUMP_ALIGN
106.ItemRefreshLoop:
107 call MenuText_RefreshItemFromAX
108 inc ax
109 loop .ItemRefreshLoop
110
111 pop cx
112NothingToRefresh:
113 ret
114
115;--------------------------------------------------------------------
116; MenuText_RefreshItemFromAX
117; Parameters
118; AX: Item to refresh
119; SS:BP: Ptr to MENU
120; Returns:
121; Nothing
122; Corrupts registers:
123; BX, DX, SI, DI
124;--------------------------------------------------------------------
125ALIGN JUMP_ALIGN
126MenuText_RefreshItemFromAX:
127 push cx
128 mov cx, ax ; Backup item to CX
129
130 call MenuScrollbars_IsItemInCXonVisiblePage
131 jnc SHORT .InvalidItem
132 call MenuText_AdjustDisplayContextForDrawingItemFromCX
133 call MenuEvent_RefreshItemFromCX
134 call DrawScrollbarIfNecessary
135.InvalidItem:
136 xchg ax, cx ; Restore AX
137 pop cx
138 ret
139
140;--------------------------------------------------------------------
141; MenuText_AdjustDisplayContextForDrawingItemFromCX
142; Parameters
143; CX: Item to refresh
144; SS:BP: Ptr to MENU
145; Returns:
146; Nothing
147; Corrupts registers:
148; AX, BX, DX, SI, DI
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151MenuText_AdjustDisplayContextForDrawingItemFromCX:
152 mov ax, cx
153 call GetItemTextAttributeTypeToSIforItemInCX
154 call MenuLocation_GetTextCoordinatesToAXforItemInAX
155 mov dx, MenuCharOut_MenuTeletypeOutput
156 ; Fall to AdjustDisplayContextForDrawingTextsAtCoordinatesInAXwithAttributeTypeInSI
157
158;--------------------------------------------------------------------
159; AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX
160; Parameters
161; AX: Cursor coordinates to set
162; DX: Character output function
163; SI: Attribute type (from ATTRIBUTE_CHARS)
164; SS:BP: Ptr to MENU
165; Returns:
166; Nothing
167; Corrupts registers:
168; AX, BX, DX, SI, DI
169;--------------------------------------------------------------------
170ALIGN JUMP_ALIGN
171AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX:
172 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
173
174 xchg ax, dx
175 mov bl, ATTRIBUTES_ARE_USED
176 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
177
178 call CharOutLineSplitter_PrepareForPrintingTextLines
179 jmp MenuAttribute_SetToDisplayContextFromTypeInSI
180
181
182;--------------------------------------------------------------------
183; GetItemTextAttributeTypeToSIforItemInCX
184; Parameters
185; CX: Item to refresh
186; SS:BP: Ptr to MENU
187; Returns:
188; SI: Text attribute type (ATTRIBUTE_CHARS)
189; Corrupts registers:
190; Nothing
191;--------------------------------------------------------------------
192ALIGN JUMP_ALIGN
193GetItemTextAttributeTypeToSIforItemInCX:
194 mov si, ATTRIBUTE_CHARS.cItem
195 test BYTE [bp+MENU.bFlags], FLG_MENU_NOHIGHLIGHT
196 jnz SHORT .ReturnAttributeTypeInSI
197
198 cmp cx, [bp+MENUINIT.wHighlightedItem]
199 jne SHORT .ReturnAttributeTypeInSI
200 sub si, BYTE ATTRIBUTE_CHARS.cItem - ATTRIBUTE_CHARS.cHighlightedItem
201ALIGN JUMP_ALIGN, ret
202.ReturnAttributeTypeInSI:
203 ret
204
205
206;--------------------------------------------------------------------
207; DrawScrollbarIfNecessary
208; Parameters
209; CX: Item to refresh
210; SS:BP: Ptr to MENU
211; Returns:
212; Nothing
213; Corrupts registers:
214; AX, BX, DX, SI, DI
215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
217DrawScrollbarIfNecessary:
218 push cx
219 call .DrawSpacesBeforeScrollbarCharacter
220 call MenuScrollbars_AreScrollbarsNeeded
221 pop cx
222 jc SHORT .DrawScrollbarCharacter
223 ret
224
225;--------------------------------------------------------------------
226; .DrawSpacesBeforeScrollbarCharacter
227; Parameters
228; CX: Item to refresh
229; SS:BP: Ptr to MENU
230; Returns:
231; Nothing
232; Corrupts registers:
233; AX, CX, DX, DI
234;--------------------------------------------------------------------
235ALIGN JUMP_ALIGN
236.DrawSpacesBeforeScrollbarCharacter:
237 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
238 xchg dx, ax ; Current coordinates to DX
239 mov ax, cx
240 call MenuLocation_GetScrollbarCoordinatesToAXforItemInAX
241 sub al, dl
242 sub al, MENU_TEXT_COLUMN_OFFSET/2
243
244 eMOVZX cx, al
245 jcxz .NoSpacesNeeded
246 mov al, ' '
247 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
248ALIGN JUMP_ALIGN, ret
249.NoSpacesNeeded:
250 ret
251
252;--------------------------------------------------------------------
253; .DrawScrollbarCharacter
254; Parameters
255; CX: Item to refresh
256; SS:BP: Ptr to MENU
257; Returns:
258; Nothing
259; Corrupts registers:
260; AX, BX, DX, SI, DI
261;--------------------------------------------------------------------
262ALIGN JUMP_ALIGN
263.DrawScrollbarCharacter:
264 push cx
265
266 call MenuBorders_AdjustDisplayContextForDrawingBorders
267
268 mov ax, cx
269 call MenuLocation_GetScrollbarCoordinatesToAXforItemInAX
270 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
271
272 mov di, cx
273 sub di, [bp+MENU.wFirstVisibleItem] ; Item to line
274 call MenuScrollbars_GetScrollCharacterToALForLineInDI
275 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
276
277 pop cx
278 ret
Note: See TracBrowser for help on using the repository browser.