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

Last change on this file since 133 was 133, checked in by krille_n_@…, 13 years ago

Size optimizations in various files in the Assembly Library. Also a very small change to a string in XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm

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