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

Last change on this file since 605 was 583, checked in by krille_n_@…, 10 years ago

Changes:

  • Changed BOOT_MENU_DEFAULT_TIMEOUT to reduce rounding error.
  • Minor optimizations and fixes, mostly to the menu library code.
File size: 7.3 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for drawing scroll bars over menu borders.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; MenuScrollbars_AreScrollbarsNeeded
26; Parameters
27; SS:BP: Ptr to MENU
28; Returns:
29; CF: Set if scroll bars are needed
30; Cleared if no scroll bars needed
31; Corrupts registers:
32; AX
33;--------------------------------------------------------------------
34ALIGN MENU_JUMP_ALIGN
35MenuScrollbars_AreScrollbarsNeeded:
36 xchg ax, cx
37 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
38 cmp cx, [bp+MENUINIT.wItems] ; Set CF if max visible < total items
39 xchg cx, ax
40 ret
41
42
43;--------------------------------------------------------------------
44; MenuScrollbars_GetScrollCharacterToALForLineInDI
45; Parameters
46; DI: Index of item line to draw
47; SS:BP: Ptr to MENU
48; Returns:
49; AL: Scroll track or thumb character
50; Corrupts registers:
51; AH, CX, DX
52;--------------------------------------------------------------------
53ALIGN MENU_JUMP_ALIGN
54MenuScrollbars_GetScrollCharacterToALForLineInDI:
55 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
56 ; Get first thumb line to AX
57 mov ax, [bp+MENU.wFirstVisibleItem]
58 call .CalculateFirstOrLastThumbLineToAX
59
60 cmp di, ax ; Before first thumb line?
61 jb SHORT .ReturnTrackCharacter
62 call .GetLastThumbLineToAX
63 cmp ax, di ; After last thumb line?
64ALIGN MENU_JUMP_ALIGN
65.ReturnTrackCharacter:
66 mov al, SCROLL_TRACK_CHARACTER
67 jb SHORT .Return
68 mov al, SCROLL_THUMB_CHARACTER
69ALIGN MENU_JUMP_ALIGN, ret
70.Return:
71 ret
72
73;--------------------------------------------------------------------
74; .GetLastThumbLineToAX
75; Parameters
76; CX: Max visible items on page
77; SS:BP: Ptr to MENU
78; Returns:
79; AX: Item line for last thumb character
80; Corrupts registers:
81; DX
82;--------------------------------------------------------------------
83ALIGN MENU_JUMP_ALIGN
84.GetLastThumbLineToAX:
85 call MenuScrollbars_GetLastVisibleItemOnPageToAX
86 ; Fall to .CalculateFirstOrLastThumbLineToAX
87
88;--------------------------------------------------------------------
89; .CalculateFirstOrLastThumbLineToAX
90; Parameters
91; AX: Index of first or last visible item on page
92; CX: Max visible items on page
93; SS:BP: Ptr to MENU
94; Returns:
95; AX: Item line for first thumb character
96; Corrupts registers:
97; DX
98;--------------------------------------------------------------------
99ALIGN MENU_JUMP_ALIGN
100.CalculateFirstOrLastThumbLineToAX:
101 mul cx
102 div WORD [bp+MENUINIT.wItems]
103 ret ; (Visible items on page * First visible item on page) / total items
104
105
106;--------------------------------------------------------------------
107; MenuScrollbars_MoveHighlightedItemByAX
108; Parameters
109; AX: Signed offset to new item to be highlighted
110; SS:BP: Ptr to MENU
111; Returns:
112; Nothing
113; Corrupts registers:
114; AX, BX, CX, DX, SI, DI
115;--------------------------------------------------------------------
116ALIGN MENU_JUMP_ALIGN
117MenuScrollbars_MoveHighlightedItemByAX:
118 mov dx, [bp+MENUINIT.wItems]
119 add ax, [bp+MENUINIT.wHighlightedItem]
120 xchg cx, ax
121 js SHORT .RotateNegativeItemInCX
122 sub cx, dx
123 jae SHORT .ScrollPageForNewItemInCX
124
125ALIGN MENU_JUMP_ALIGN
126.RotateNegativeItemInCX:
127 add cx, dx
128 ; Fall to .ScrollPageForNewItemInCX
129
130;--------------------------------------------------------------------
131; .ScrollPageForNewItemInCX
132; Parameters
133; CX: New item to be highlighted
134; SS:BP: Ptr to MENU
135; Returns:
136; Nothing
137; Corrupts registers:
138; AX, BX, CX, DX, SI, DI
139;--------------------------------------------------------------------
140ALIGN MENU_JUMP_ALIGN
141.ScrollPageForNewItemInCX:
142 call MenuScrollbars_IsItemInCXonVisiblePage
143 jc SHORT .HighlightNewItemOnCX
144
145 mov dx, [bp+MENU.wFirstVisibleItem]
146 sub dx, [bp+MENUINIT.wHighlightedItem]
147
148 ; Get MaxFirstVisibleItem to AX
149 push cx
150 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
151 mov ax, [bp+MENUINIT.wItems]
152 sub ax, cx
153 pop cx
154
155 add dx, cx
156 jns .DXisPositive
157 cwd ; This won't work if MaxFirstVisibleItem > 32767
158
159ALIGN MENU_JUMP_ALIGN
160.DXisPositive:
161 cmp ax, dx
162 jb .AXisLessThanDX
163 xchg dx, ax
164
165ALIGN MENU_JUMP_ALIGN
166.AXisLessThanDX:
167 mov [bp+MENU.wFirstVisibleItem], ax
168 call MenuText_RefreshAllItems
169
170ALIGN MENU_JUMP_ALIGN
171.HighlightNewItemOnCX:
172 jmp MenuEvent_HighlightItemFromCX
173
174
175;--------------------------------------------------------------------
176; MenuScrollbars_IsItemInCXonVisiblePage
177; Parameters
178; CX: Item whose visibility is to be checked
179; SS:BP: Ptr to MENU
180; Returns:
181; CF: Set if item is on visible page
182; Cleared if item is not on visible page
183; Corrupts registers:
184; AX
185;--------------------------------------------------------------------
186ALIGN MENU_JUMP_ALIGN
187MenuScrollbars_IsItemInCXonVisiblePage:
188 cmp [bp+MENU.wFirstVisibleItem], cx
189 ja SHORT .ItemIsNotVisible
190
191 call MenuScrollbars_GetLastVisibleItemOnPageToAX
192 cmp cx, ax
193 ja SHORT .ItemIsNotVisible
194 stc ; Item is visible
195ALIGN MENU_JUMP_ALIGN, ret
196.ItemIsNotVisible:
197 ret
198
199
200;--------------------------------------------------------------------
201; MenuScrollbars_GetLastVisibleItemOnPageToAX
202; Parameters
203; SS:BP: Ptr to MENU
204; Returns:
205; AX: Index of last visible item on page
206; Corrupts registers:
207; Nothing
208;--------------------------------------------------------------------
209ALIGN MENU_JUMP_ALIGN
210MenuScrollbars_GetLastVisibleItemOnPageToAX:
211 xchg cx, ax
212 call MenuScrollbars_GetActualVisibleItemsOnPageToCX
213 xchg ax, cx
214 dec ax
215 add ax, [bp+MENU.wFirstVisibleItem]
216 ret
217
218
219;--------------------------------------------------------------------
220; MenuScrollbars_GetActualVisibleItemsOnPageToCX
221; Parameters
222; SS:BP: Ptr to MENU
223; Returns:
224; CX: Currently visible items
225; Corrupts registers:
226; Nothing
227;--------------------------------------------------------------------
228ALIGN MENU_JUMP_ALIGN
229MenuScrollbars_GetActualVisibleItemsOnPageToCX:
230 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
231 cmp cx, [bp+MENUINIT.wItems]
232 jb SHORT .Return
233 mov cx, [bp+MENUINIT.wItems]
234ALIGN MENU_JUMP_ALIGN, ret
235.Return:
236 ret
237
238
239;--------------------------------------------------------------------
240; MenuScrollbars_GetMaxVisibleItemsOnPageToCX
241; Parameters
242; SS:BP: Ptr to MENU
243; Returns:
244; CX: Maximum number of visible items
245; Corrupts registers:
246; Nothing
247;--------------------------------------------------------------------
248ALIGN MENU_JUMP_ALIGN
249MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
250 mov cx, -MENU_VERTICAL_BORDER_LINES & 0FFh
251 add cl, [bp+MENUINIT.bHeight]
252 sub cl, [bp+MENUINIT.bTitleLines]
253 sub cl, [bp+MENUINIT.bInfoLines]
254 ret
Note: See TracBrowser for help on using the repository browser.