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

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

Changes:

  • Added a new define (USE_UNDOC_INTEL) that enables optimizations possible by using undocumented instructions available on all Intel processors and truly compatible clones. AFAIK the only exceptions are the NEC V-series and the Sony CXQ70108 processors so this option should be safe for use on the AT builds.
  • Building BIOSDRVS or the BIOS without MODULE_STRINGS_COMPRESSED would fail due to the recent code exclusions so I changed them a bit. Also fixed the mistaken change to Main.asm
  • Changed the Tandy specific info in Configuration_FullMode.txt so it matches the info in the Wiki.
  • Optimizations and fixes in general.
File size: 7.7 KB
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for drawing scroll bars over menu borders.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[376]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 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.
[491]12;
[376]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
[491]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
[491]20
[41]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:
[67]32; AX
[41]33;--------------------------------------------------------------------
[369]34ALIGN MENU_JUMP_ALIGN
[41]35MenuScrollbars_AreScrollbarsNeeded:
[67]36 xchg ax, cx
[41]37 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
38 cmp cx, [bp+MENUINIT.wItems] ; Set CF if max visible < total items
[67]39 xchg cx, ax
[41]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;--------------------------------------------------------------------
[369]53ALIGN MENU_JUMP_ALIGN
[41]54MenuScrollbars_GetScrollCharacterToALForLineInDI:
55 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[181]56 ; Get first thumb line to AX
57 mov ax, [bp+MENU.wFirstVisibleItem]
58 call .CalculateFirstOrLastThumbLineToAX
59
[41]60 cmp di, ax ; Before first thumb line?
61 jb SHORT .ReturnTrackCharacter
62 call .GetLastThumbLineToAX
[181]63 cmp ax, di ; After last thumb line?
[369]64ALIGN MENU_JUMP_ALIGN
[41]65.ReturnTrackCharacter:
66 mov al, SCROLL_TRACK_CHARACTER
[181]67 jb SHORT .Return
68 mov al, SCROLL_THUMB_CHARACTER
[369]69ALIGN MENU_JUMP_ALIGN, ret
[181]70.Return:
[41]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:
[491]81; DX
[133]82;--------------------------------------------------------------------
[369]83ALIGN MENU_JUMP_ALIGN
[41]84.GetLastThumbLineToAX:
85 call MenuScrollbars_GetLastVisibleItemOnPageToAX
[181]86 ; Fall to .CalculateFirstOrLastThumbLineToAX
[41]87
88;--------------------------------------------------------------------
[181]89; .CalculateFirstOrLastThumbLineToAX
[41]90; Parameters
[181]91; AX: Index of first or last visible item on page
[41]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:
[491]97; DX
[41]98;--------------------------------------------------------------------
[369]99ALIGN MENU_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[369]116ALIGN MENU_JUMP_ALIGN
[41]117MenuScrollbars_MoveHighlightedItemByAX:
[52]118 mov cx, [bp+MENUINIT.wHighlightedItem]
[41]119 add cx, ax
[181]120 ; Fall to .RotateItemInCX
121
122;--------------------------------------------------------------------
123; .RotateItemInCX
124; Parameters
125; CX: Possibly under of overflown item to be rotated
126; SS:BP: Ptr to MENU
127; Returns:
128; CX: Valid item index
129; Corrupts registers:
130; DX
131;--------------------------------------------------------------------
132;.RotateItemInCX:
133 mov dx, [bp+MENUINIT.wItems]
134 test cx, cx
135 js SHORT .RotateNegativeItemInCX
136 sub cx, dx
137 jae SHORT .ScrollPageForNewItemInCX
138
[369]139ALIGN MENU_JUMP_ALIGN
[181]140.RotateNegativeItemInCX:
141 add cx, dx
[41]142 ; Fall to .ScrollPageForNewItemInCX
143
144;--------------------------------------------------------------------
145; .ScrollPageForNewItemInCX
146; Parameters
147; CX: New item to be highlighted
148; SS:BP: Ptr to MENU
149; Returns:
150; Nothing
151; Corrupts registers:
152; AX, BX, CX, DX, SI, DI
153;--------------------------------------------------------------------
[369]154ALIGN MENU_JUMP_ALIGN
[41]155.ScrollPageForNewItemInCX:
156 call MenuScrollbars_IsItemInCXonVisiblePage
157 jc SHORT .HighlightNewItemOnCX
158
159 mov dx, [bp+MENU.wFirstVisibleItem]
[52]160 sub dx, [bp+MENUINIT.wHighlightedItem]
[41]161
[181]162 ; Get MaxFirstVisibleItem to AX
[41]163 push cx
164 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
165 mov ax, [bp+MENUINIT.wItems]
166 sub ax, cx
167 pop cx
168
[181]169 add dx, cx
170 jns .DXisPositive
171 cwd ; This won't work if MaxFirstVisibleItem > 32767
172
[369]173ALIGN MENU_JUMP_ALIGN
[181]174.DXisPositive:
175 cmp ax, dx
176 jb .AXisLessThanDX
177 xchg dx, ax
[41]178
[369]179ALIGN MENU_JUMP_ALIGN
[181]180.AXisLessThanDX:
181 mov [bp+MENU.wFirstVisibleItem], ax
182 call MenuText_RefreshAllItems
[41]183
[369]184ALIGN MENU_JUMP_ALIGN
[181]185.HighlightNewItemOnCX:
186 jmp MenuEvent_HighlightItemFromCX
[41]187
188
189;--------------------------------------------------------------------
[105]190; MenuScrollbars_IsItemInCXonVisiblePage
[41]191; Parameters
192; CX: Item whose visibility is to be checked
193; SS:BP: Ptr to MENU
194; Returns:
195; CF: Set if item is on visible page
196; Cleared if item is not on visible page
197; Corrupts registers:
198; AX
199;--------------------------------------------------------------------
[369]200ALIGN MENU_JUMP_ALIGN
[41]201MenuScrollbars_IsItemInCXonVisiblePage:
[133]202 cmp [bp+MENU.wFirstVisibleItem], cx
203 ja SHORT .ItemIsNotVisible
[41]204
205 call MenuScrollbars_GetLastVisibleItemOnPageToAX
206 cmp cx, ax
207 ja SHORT .ItemIsNotVisible
208 stc ; Item is visible
[369]209ALIGN MENU_JUMP_ALIGN, ret
[41]210.ItemIsNotVisible:
211 ret
212
213
214;--------------------------------------------------------------------
[105]215; MenuScrollbars_GetLastVisibleItemOnPageToAX
[41]216; Parameters
217; SS:BP: Ptr to MENU
218; Returns:
219; AX: Index of last visible item on page
220; Corrupts registers:
221; Nothing
222;--------------------------------------------------------------------
[369]223ALIGN MENU_JUMP_ALIGN
[41]224MenuScrollbars_GetLastVisibleItemOnPageToAX:
[181]225 xchg cx, ax
[41]226 call MenuScrollbars_GetActualVisibleItemsOnPageToCX
227 xchg ax, cx
228 dec ax
229 add ax, [bp+MENU.wFirstVisibleItem]
230 ret
231
232
233;--------------------------------------------------------------------
234; MenuScrollbars_GetActualVisibleItemsOnPageToCX
235; Parameters
236; SS:BP: Ptr to MENU
237; Returns:
238; CX: Currently visible items
239; Corrupts registers:
240; Nothing
241;--------------------------------------------------------------------
[369]242ALIGN MENU_JUMP_ALIGN
[41]243MenuScrollbars_GetActualVisibleItemsOnPageToCX:
244 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[181]245 cmp cx, [bp+MENUINIT.wItems]
246 jb SHORT .Return
247 mov cx, [bp+MENUINIT.wItems]
[369]248ALIGN MENU_JUMP_ALIGN, ret
[181]249.Return:
[41]250 ret
251
252
253;--------------------------------------------------------------------
254; MenuScrollbars_GetMaxVisibleItemsOnPageToCX
255; Parameters
256; SS:BP: Ptr to MENU
257; Returns:
258; CX: Maximum number of visible items
259; Corrupts registers:
260; Nothing
261;--------------------------------------------------------------------
[369]262ALIGN MENU_JUMP_ALIGN
[41]263MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
[293]264 eMOVZX cx, [bp+MENUINIT.bHeight]
[41]265 sub cl, [bp+MENUINIT.bTitleLines]
266 sub cl, [bp+MENUINIT.bInfoLines]
267 sub cl, MENU_VERTICAL_BORDER_LINES
268 ret
Note: See TracBrowser for help on using the repository browser.