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

Last change on this file since 44 was 44, checked in by aitotat, 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: 6.4 KB
Line 
1; File name     :   MenuText.asm
2; Project name  :   Assembly Library
3; Created date  :   21.7.2010
4; Last update   :   27.9.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_RefreshTitle
13; MenuText_RefreshInformation
14;   Parameters
15;       SS:BP:  Ptr to MENU
16;   Returns:
17;       Nothing
18;   Corrupts registers:
19;       AX, BX, DX, SI, DI
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22MenuText_RefreshTitle:
23    cmp     BYTE [bp+MENUINIT.bTitleLines], 0
24    jz      SHORT NothingToRefresh
25
26    mov     si, ATTRIBUTE_CHARS.cTitle
27    call    AdjustDisplayContextForDrawingTexts
28    call    MenuLocation_GetTitleTextTopLeftCoordinatesToAX
29    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
30    jmp     MenuEvent_RefreshTitle
31
32ALIGN JUMP_ALIGN
33MenuText_RefreshInformation:
34    cmp     BYTE [bp+MENUINIT.bInfoLines], 0
35    jz      SHORT NothingToRefresh
36
37    mov     si, ATTRIBUTE_CHARS.cInformation
38    call    AdjustDisplayContextForDrawingTexts
39    call    MenuLocation_GetInformationTextTopLeftCoordinatesToAX
40    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
41    jmp     MenuEvent_RefreshInformation
42
43
44;--------------------------------------------------------------------
45; MenuText_RefreshAllItems
46;   Parameters
47;       SS:BP:  Ptr to MENU
48;   Returns:
49;       Nothing
50;   Corrupts registers:
51;       AX, BX, DX, SI, DI
52;--------------------------------------------------------------------
53ALIGN JUMP_ALIGN
54MenuText_RefreshAllItems:
55    push    cx
56
57    call    MenuScrollbars_GetActualVisibleItemsOnPageToCX
58    mov     ax, [bp+MENU.wFirstVisibleItem]
59ALIGN JUMP_ALIGN
60.ItemRefreshLoop:
61    call    MenuText_RefreshItemFromAX
62    inc     ax
63    loop    .ItemRefreshLoop
64
65    pop     cx
66NothingToRefresh:
67    ret
68
69;--------------------------------------------------------------------
70; MenuText_RefreshItemFromAX
71;   Parameters
72;       AX:     Item to refresh
73;       SS:BP:  Ptr to MENU
74;   Returns:
75;       Nothing
76;   Corrupts registers:
77;       BX, DX, SI, DI
78;--------------------------------------------------------------------
79ALIGN JUMP_ALIGN
80MenuText_RefreshItemFromAX:
81    push    cx
82    mov     cx, ax                  ; Backup item to CX
83
84    call    MenuScrollbars_IsItemInCXonVisiblePage
85    jnc     SHORT .InvalidItem
86    mov     ax, cx
87    call    MenuText_AdjustDisplayContextForDrawingItemFromAX
88    call    MenuEvent_RefreshItemFromCX
89    call    DrawScrollbarIfNecessary
90.InvalidItem:
91    xchg    ax, cx                  ; Restore AX
92    pop     cx
93    ret
94
95;--------------------------------------------------------------------
96; MenuText_AdjustDisplayContextForDrawingItemFromAX
97;   Parameters
98;       AX:     Item to refresh
99;       SS:BP:  Ptr to MENU
100;   Returns:
101;       CX:     Item to refresh
102;   Corrupts registers:
103;       AX, SI, DI
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106MenuText_AdjustDisplayContextForDrawingItemFromAX:
107    mov     cx, ax
108    call    MenuLocation_GetTextCoordinatesToAXforItemInAX
109    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
110    call    .GetItemTextAttributeTypeToSIforItemInCX
111    jmp     SHORT AdjustDisplayContextForDrawingTexts
112
113;--------------------------------------------------------------------
114; .GetItemTextAttributeTypeToSIforItemInCX
115;   Parameters
116;       CX:     Item to refresh
117;       SS:BP:  Ptr to MENU
118;   Returns:
119;       SI:     Text attribute type (ATTRIBUTE_CHARS)
120;   Corrupts registers:
121;       Nothing
122;--------------------------------------------------------------------
123ALIGN JUMP_ALIGN
124.GetItemTextAttributeTypeToSIforItemInCX:
125    mov     si, ATTRIBUTE_CHARS.cItem
126    test    BYTE [bp+MENU.bFlags], FLG_MENU_NOHIGHLIGHT
127    jnz     SHORT .ReturnAttributeTypeInSI
128    cmp     cx, [bp+MENU.wHighlightedItem]
129    jne     SHORT .ReturnAttributeTypeInSI
130    sub     si, BYTE ATTRIBUTE_CHARS.cItem - ATTRIBUTE_CHARS.cHighlightedItem
131ALIGN JUMP_ALIGN, ret
132.ReturnAttributeTypeInSI:
133    ret
134
135
136;--------------------------------------------------------------------
137; DrawScrollbarIfNecessary
138;   Parameters
139;       CX:     Item to refresh
140;       SS:BP:  Ptr to MENU
141;   Returns:
142;       Nothing
143;   Corrupts registers:
144;       AX, DX, SI, DI
145;--------------------------------------------------------------------
146ALIGN JUMP_ALIGN
147DrawScrollbarIfNecessary:
148    push    cx
149    call    .DrawSpacesBeforeScrollbarCharacter
150    call    MenuScrollbars_AreScrollbarsNeeded
151    pop     cx
152    jc      SHORT .DrawScrollbarCharacter
153    ret
154
155;--------------------------------------------------------------------
156; .DrawSpacesBeforeScrollbarCharacter
157;   Parameters
158;       CX:     Item to refresh
159;       SS:BP:  Ptr to MENU
160;   Returns:
161;       Nothing
162;   Corrupts registers:
163;       AX, CX, DX, DI
164;--------------------------------------------------------------------
165ALIGN JUMP_ALIGN
166.DrawSpacesBeforeScrollbarCharacter:
167    CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
168    xchg    dx, ax                  ; Current coordinates to DX
169    mov     ax, cx
170    call    MenuLocation_GetScrollbarCoordinatesToAXforItemInAX
171    sub     al, dl
172    sub     al, MENU_TEXT_COLUMN_OFFSET/2
173
174    eMOVZX  cx, al
175    jcxz    .NoSpacesNeeded
176    mov     al, ' '
177    CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
178ALIGN JUMP_ALIGN, ret
179.NoSpacesNeeded:
180    ret
181
182;--------------------------------------------------------------------
183; .DrawScrollbarCharacter
184;   Parameters
185;       CX:     Item to refresh
186;       SS:BP:  Ptr to MENU
187;   Returns:
188;       Nothing
189;   Corrupts registers:
190;       AX, DX, SI, DI
191;--------------------------------------------------------------------
192ALIGN JUMP_ALIGN
193.DrawScrollbarCharacter:
194    push    cx
195
196    mov     si, ATTRIBUTE_CHARS.cBordersAndBackground
197    call    MenuAttribute_SetToDisplayContextFromTypeInSI
198
199    mov     ax, cx
200    call    MenuLocation_GetScrollbarCoordinatesToAXforItemInAX
201    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
202
203    mov     di, cx
204    sub     di, [bp+MENU.wFirstVisibleItem]     ; Item to line
205    call    MenuScrollbars_GetScrollCharacterToALForLineInDI
206    CALL_DISPLAY_LIBRARY PrintCharacterFromAL
207
208    pop     cx
209    ret
210
211
212;--------------------------------------------------------------------
213; AdjustDisplayContextForDrawingTexts
214;   Parameters
215;       SI:     Attribute type (from ATTRIBUTE_CHARS)
216;       SS:BP:  Ptr to MENU
217;   Returns:
218;       Nothing
219;   Corrupts registers:
220;       AX, DX, SI, DI
221;--------------------------------------------------------------------
222ALIGN JUMP_ALIGN
223AdjustDisplayContextForDrawingTexts:
224    mov     dl, ATTRIBUTES_ARE_USED
225    mov     ax, MenuCharOut_MenuTextTeletypeOutputWithAttribute
226    CALL_DISPLAY_LIBRARY SetCharOutputFunctionFromAXwithAttribFlagInDL
227
228    mov     ax, bp
229    CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
230
231    jmp     MenuAttribute_SetToDisplayContextFromTypeInSI
Note: See TracBrowser for help on using the repository browser.