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

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

Changes to Assembly Library:

  • Some more optimizations.
  • Moved macros.inc from XTIDE Universal BIOS to Assembly Library.
File size: 7.5 KB
RevLine 
[41]1; File name : MenuText.asm
2; Project name : Assembly Library
3; Created date : 21.7.2010
[67]4; Last update : 9.12.2010
[41]5; Author : Tomi Tilli
6; Description : Functions for drawing menu texts by the user.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
[48]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:
[54]29 call MenuText_PrepareToDrawInformationArea
[48]30 mov cl, [bp+MENUINIT.bInfoLines]
31ClearCLlinesOfText:
32 mov al, [bp+MENUINIT.bWidth]
[54]33 sub al, MENU_HORIZONTAL_BORDER_LINES+(MENU_TEXT_COLUMN_OFFSET/2)
[48]34 mul cl
35 xchg cx, ax
36 mov al, ' '
37 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
38 ret
39
40
41;--------------------------------------------------------------------
[41]42; MenuText_RefreshTitle
43; MenuText_RefreshInformation
44; Parameters
45; SS:BP: Ptr to MENU
46; Returns:
47; Nothing
48; Corrupts registers:
[48]49; AX, BX, CX, DX, SI, DI
[41]50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
52MenuText_RefreshTitle:
53 cmp BYTE [bp+MENUINIT.bTitleLines], 0
54 jz SHORT NothingToRefresh
[48]55 call PrepareToDrawTitleArea
[41]56 jmp MenuEvent_RefreshTitle
57
58ALIGN JUMP_ALIGN
59MenuText_RefreshInformation:
60 cmp BYTE [bp+MENUINIT.bInfoLines], 0
61 jz SHORT NothingToRefresh
[54]62 call MenuText_PrepareToDrawInformationArea
[48]63 jmp MenuEvent_RefreshInformation
[41]64
[48]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
[52]79 jmp SHORT FinishPreparationsToDrawTitleOrInformationArea
[48]80
81ALIGN JUMP_ALIGN
[54]82MenuText_PrepareToDrawInformationArea:
[41]83 mov si, ATTRIBUTE_CHARS.cInformation
84 call MenuLocation_GetInformationTextTopLeftCoordinatesToAX
[52]85FinishPreparationsToDrawTitleOrInformationArea:
86 mov dx, MenuCharOut_MenuTeletypeOutputWithAutomaticLineChange
87 jmp SHORT AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX
[41]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
[67]128 push ax
[41]129
[67]130 xchg cx, ax
[41]131 call MenuScrollbars_IsItemInCXonVisiblePage
132 jnc SHORT .InvalidItem
[52]133 call MenuText_AdjustDisplayContextForDrawingItemFromCX
[67]134 call ClearPreviousItem
[41]135 call MenuEvent_RefreshItemFromCX
[67]136 call DrawScrollbarCharacterForItemInCXifNecessary
[41]137.InvalidItem:
[67]138 pop ax
[41]139 pop cx
140 ret
141
142;--------------------------------------------------------------------
[52]143; MenuText_AdjustDisplayContextForDrawingItemFromCX
[41]144; Parameters
[52]145; CX: Item to refresh
[41]146; SS:BP: Ptr to MENU
147; Returns:
[52]148; Nothing
[41]149; Corrupts registers:
[52]150; AX, BX, DX, SI, DI
[41]151;--------------------------------------------------------------------
152ALIGN JUMP_ALIGN
[52]153MenuText_AdjustDisplayContextForDrawingItemFromCX:
154 mov ax, cx
155 call GetItemTextAttributeTypeToSIforItemInCX
[41]156 call MenuLocation_GetTextCoordinatesToAXforItemInAX
[52]157 mov dx, MenuCharOut_MenuTeletypeOutput
158 ; Fall to AdjustDisplayContextForDrawingTextsAtCoordinatesInAXwithAttributeTypeInSI
159
160;--------------------------------------------------------------------
161; AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX
162; Parameters
163; AX: Cursor coordinates to set
164; DX: Character output function
165; SI: Attribute type (from ATTRIBUTE_CHARS)
166; SS:BP: Ptr to MENU
167; Returns:
168; Nothing
169; Corrupts registers:
170; AX, BX, DX, SI, DI
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173AdjustDisplayContextForDrawingTextsAtCoordsInAXwithAttrTypeInSIandCharOutFunctionInDX:
[41]174 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
175
[52]176 xchg ax, dx
177 mov bl, ATTRIBUTES_ARE_USED
178 CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInBL
179
180 call CharOutLineSplitter_PrepareForPrintingTextLines
181 jmp MenuAttribute_SetToDisplayContextFromTypeInSI
182
183
[41]184;--------------------------------------------------------------------
[67]185; ClearPreviousItem
186; Parameters
187; SS:BP: Ptr to MENU
188; Returns:
189; Nothing
190; Corrupts registers:
191; AX, BX, DX, DI
192;--------------------------------------------------------------------
193ALIGN JUMP_ALIGN
194ClearPreviousItem:
195 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
196 xchg bx, ax
197
198 call MenuBorders_GetNumberOfMiddleCharactersToDX
199 sub dx, BYTE MENU_TEXT_COLUMN_OFFSET
200 mov al, [cs:g_rgbTextBorderCharacters+BORDER_CHARS.cMiddle]
201 call MenuBorders_PrintMultipleBorderCharactersFromAL
202
203 xchg ax, bx
204 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
205 ret
206
207
208;--------------------------------------------------------------------
[52]209; GetItemTextAttributeTypeToSIforItemInCX
[41]210; Parameters
211; CX: Item to refresh
212; SS:BP: Ptr to MENU
213; Returns:
214; SI: Text attribute type (ATTRIBUTE_CHARS)
215; Corrupts registers:
216; Nothing
217;--------------------------------------------------------------------
218ALIGN JUMP_ALIGN
[52]219GetItemTextAttributeTypeToSIforItemInCX:
[41]220 mov si, ATTRIBUTE_CHARS.cItem
221 test BYTE [bp+MENU.bFlags], FLG_MENU_NOHIGHLIGHT
222 jnz SHORT .ReturnAttributeTypeInSI
[52]223
224 cmp cx, [bp+MENUINIT.wHighlightedItem]
[41]225 jne SHORT .ReturnAttributeTypeInSI
226 sub si, BYTE ATTRIBUTE_CHARS.cItem - ATTRIBUTE_CHARS.cHighlightedItem
227ALIGN JUMP_ALIGN, ret
228.ReturnAttributeTypeInSI:
229 ret
230
231
232;--------------------------------------------------------------------
[67]233; DrawScrollbarCharacterForItemInCXifNecessary
[41]234; Parameters
235; CX: Item to refresh
236; SS:BP: Ptr to MENU
237; Returns:
238; Nothing
239; Corrupts registers:
[67]240; AX, CX, BX, DX, SI, DI
[41]241;--------------------------------------------------------------------
242ALIGN JUMP_ALIGN
[67]243DrawScrollbarCharacterForItemInCXifNecessary:
[41]244 call MenuScrollbars_AreScrollbarsNeeded
245 jc SHORT .DrawScrollbarCharacter
246 ret
247
248ALIGN JUMP_ALIGN
249.DrawScrollbarCharacter:
[48]250 call MenuBorders_AdjustDisplayContextForDrawingBorders
[41]251 mov ax, cx
[104]252
253 call MenuLocation_GetTextCoordinatesToAXforItemInAX
254 add al, [bp+MENUINIT.bWidth]
255 sub al, MENU_TEXT_COLUMN_OFFSET*2
[41]256 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
257
258 mov di, cx
259 sub di, [bp+MENU.wFirstVisibleItem] ; Item to line
260 call MenuScrollbars_GetScrollCharacterToALForLineInDI
[67]261 jmp MenuBorders_PrintSingleBorderCharacterFromAL
Note: See TracBrowser for help on using the repository browser.