source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuScrollbars.asm @ 293

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

Commit 1/2 (Library, Configurators and Serial Server):

  • Changed Emulate.inc so that making 286 and 386 versions now works. Additionally, only one processor type define is needed in the makefile.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 6.9 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for drawing scroll bars over menu borders.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; MenuScrollbars_AreScrollbarsNeeded
9;   Parameters
10;       SS:BP:  Ptr to MENU
11;   Returns:
12;       CF:     Set if scroll bars are needed
13;               Cleared if no scroll bars needed
14;   Corrupts registers:
15;       AX
16;--------------------------------------------------------------------
17ALIGN JUMP_ALIGN
18MenuScrollbars_AreScrollbarsNeeded:
19    xchg    ax, cx
20    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
21    cmp     cx, [bp+MENUINIT.wItems]        ; Set CF if max visible < total items
22    xchg    cx, ax
23    ret
24
25
26;--------------------------------------------------------------------
27; MenuScrollbars_GetScrollCharacterToALForLineInDI
28;   Parameters
29;       DI:     Index of item line to draw
30;       SS:BP:  Ptr to MENU
31;   Returns:
32;       AL:     Scroll track or thumb character
33;   Corrupts registers:
34;       AH, CX, DX
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37MenuScrollbars_GetScrollCharacterToALForLineInDI:
38    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
39    ; Get first thumb line to AX
40    mov     ax, [bp+MENU.wFirstVisibleItem]
41    call    .CalculateFirstOrLastThumbLineToAX
42
43    cmp     di, ax              ; Before first thumb line?
44    jb      SHORT .ReturnTrackCharacter
45    call    .GetLastThumbLineToAX
46    cmp     ax, di              ; After last thumb line?
47ALIGN JUMP_ALIGN
48.ReturnTrackCharacter:
49    mov     al, SCROLL_TRACK_CHARACTER
50    jb      SHORT .Return
51    mov     al, SCROLL_THUMB_CHARACTER
52ALIGN JUMP_ALIGN, ret
53.Return:
54    ret
55
56;--------------------------------------------------------------------
57; .GetLastThumbLineToAX
58;   Parameters
59;       CX:     Max visible items on page
60;       SS:BP:  Ptr to MENU
61;   Returns:
62;       AX:     Item line for last thumb character
63;   Corrupts registers:
64;       CX, DX
65;--------------------------------------------------------------------
66ALIGN JUMP_ALIGN
67.GetLastThumbLineToAX:
68    call    MenuScrollbars_GetLastVisibleItemOnPageToAX
69    ; Fall to .CalculateFirstOrLastThumbLineToAX
70
71;--------------------------------------------------------------------
72; .CalculateFirstOrLastThumbLineToAX
73;   Parameters
74;       AX:     Index of first or last visible item on page
75;       CX:     Max visible items on page
76;       SS:BP:  Ptr to MENU
77;   Returns:
78;       AX:     Item line for first thumb character
79;   Corrupts registers:
80;       CX, DX
81;--------------------------------------------------------------------
82ALIGN JUMP_ALIGN
83.CalculateFirstOrLastThumbLineToAX:
84    mul     cx
85    div     WORD [bp+MENUINIT.wItems]
86    ret     ; (Visible items on page * First visible item on page) / total items
87
88
89;--------------------------------------------------------------------
90; MenuScrollbars_MoveHighlightedItemByAX
91;   Parameters
92;       AX:     Signed offset to new item to be highlighted
93;       SS:BP:  Ptr to MENU
94;   Returns:
95;       Nothing
96;   Corrupts registers:
97;       AX, BX, CX, DX, SI, DI
98;--------------------------------------------------------------------
99ALIGN JUMP_ALIGN
100MenuScrollbars_MoveHighlightedItemByAX:
101    mov     cx, [bp+MENUINIT.wHighlightedItem]
102    add     cx, ax
103    ; Fall to .RotateItemInCX
104
105;--------------------------------------------------------------------
106; .RotateItemInCX
107;   Parameters
108;       CX:     Possibly under of overflown item to be rotated
109;       SS:BP:  Ptr to MENU
110;   Returns:
111;       CX:     Valid item index
112;   Corrupts registers:
113;       DX
114;--------------------------------------------------------------------
115;.RotateItemInCX:
116    mov     dx, [bp+MENUINIT.wItems]
117    test    cx, cx
118    js      SHORT .RotateNegativeItemInCX
119    sub     cx, dx
120    jae     SHORT .ScrollPageForNewItemInCX
121
122ALIGN JUMP_ALIGN
123.RotateNegativeItemInCX:
124    add     cx, dx
125    ; Fall to .ScrollPageForNewItemInCX
126
127;--------------------------------------------------------------------
128; .ScrollPageForNewItemInCX
129;   Parameters
130;       CX:     New item to be highlighted
131;       SS:BP:  Ptr to MENU
132;   Returns:
133;       Nothing
134;   Corrupts registers:
135;       AX, BX, CX, DX, SI, DI
136;--------------------------------------------------------------------
137ALIGN JUMP_ALIGN
138.ScrollPageForNewItemInCX:
139    call    MenuScrollbars_IsItemInCXonVisiblePage
140    jc      SHORT .HighlightNewItemOnCX
141
142    mov     dx, [bp+MENU.wFirstVisibleItem]
143    sub     dx, [bp+MENUINIT.wHighlightedItem]
144
145    ; Get MaxFirstVisibleItem to AX
146    push    cx
147    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
148    mov     ax, [bp+MENUINIT.wItems]
149    sub     ax, cx
150    pop     cx
151
152    add     dx, cx
153    jns     .DXisPositive
154    cwd     ; This won't work if MaxFirstVisibleItem > 32767
155
156ALIGN JUMP_ALIGN
157.DXisPositive:
158    cmp     ax, dx
159    jb      .AXisLessThanDX
160    xchg    dx, ax
161
162ALIGN JUMP_ALIGN
163.AXisLessThanDX:
164    mov     [bp+MENU.wFirstVisibleItem], ax
165    call    MenuText_RefreshAllItems
166
167ALIGN JUMP_ALIGN
168.HighlightNewItemOnCX:
169    jmp     MenuEvent_HighlightItemFromCX
170
171
172;--------------------------------------------------------------------
173; MenuScrollbars_IsItemInCXonVisiblePage
174;   Parameters
175;       CX:     Item whose visibility is to be checked
176;       SS:BP:  Ptr to MENU
177;   Returns:
178;       CF:     Set if item is on visible page
179;               Cleared if item is not on visible page
180;   Corrupts registers:
181;       AX
182;--------------------------------------------------------------------
183ALIGN JUMP_ALIGN
184MenuScrollbars_IsItemInCXonVisiblePage:
185    cmp     [bp+MENU.wFirstVisibleItem], cx
186    ja      SHORT .ItemIsNotVisible
187
188    call    MenuScrollbars_GetLastVisibleItemOnPageToAX
189    cmp     cx, ax
190    ja      SHORT .ItemIsNotVisible
191    stc     ; Item is visible
192ALIGN JUMP_ALIGN, ret
193.ItemIsNotVisible:
194    ret
195
196
197;--------------------------------------------------------------------
198; MenuScrollbars_GetLastVisibleItemOnPageToAX
199;   Parameters
200;       SS:BP:  Ptr to MENU
201;   Returns:
202;       AX:     Index of last visible item on page
203;   Corrupts registers:
204;       Nothing
205;--------------------------------------------------------------------
206ALIGN JUMP_ALIGN
207MenuScrollbars_GetLastVisibleItemOnPageToAX:
208    xchg    cx, ax
209    call    MenuScrollbars_GetActualVisibleItemsOnPageToCX
210    xchg    ax, cx
211    dec     ax
212    add     ax, [bp+MENU.wFirstVisibleItem]
213    ret
214
215
216;--------------------------------------------------------------------
217; MenuScrollbars_GetActualVisibleItemsOnPageToCX
218;   Parameters
219;       SS:BP:  Ptr to MENU
220;   Returns:
221;       CX:     Currently visible items
222;   Corrupts registers:
223;       Nothing
224;--------------------------------------------------------------------
225ALIGN JUMP_ALIGN
226MenuScrollbars_GetActualVisibleItemsOnPageToCX:
227    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
228    cmp     cx, [bp+MENUINIT.wItems]
229    jb      SHORT .Return
230    mov     cx, [bp+MENUINIT.wItems]
231ALIGN JUMP_ALIGN, ret
232.Return:
233    ret
234
235
236;--------------------------------------------------------------------
237; MenuScrollbars_GetMaxVisibleItemsOnPageToCX
238;   Parameters
239;       SS:BP:  Ptr to MENU
240;   Returns:
241;       CX:     Maximum number of visible items
242;   Corrupts registers:
243;       Nothing
244;--------------------------------------------------------------------
245ALIGN JUMP_ALIGN
246MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
247    eMOVZX  cx, [bp+MENUINIT.bHeight]
248    sub     cl, [bp+MENUINIT.bTitleLines]
249    sub     cl, [bp+MENUINIT.bInfoLines]
250    sub     cl, MENU_VERTICAL_BORDER_LINES
251    ret
Note: See TracBrowser for help on using the repository browser.