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

Last change on this file since 99 was 67, checked in by Tomi Tilli, 14 years ago

Changes to Assembly Library:

  • Forgot to update SI on new File Read and Write functions.
  • Screen clearing function now accepts any character and attribute.
  • Menu library now accepts CR,LF combination as line feed. Previously only LF,CR worked properly.
File size: 7.3 KB
RevLine 
[41]1; File name : MenuScrollbars.asm
2; Project name : Assembly Library
3; Created date : 20.7.2010
[67]4; Last update : 9.12.2010
[41]5; Author : Tomi Tilli
6; Description : Functions for drawing scroll bars over menu borders.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; MenuScrollbars_AreScrollbarsNeeded
13; Parameters
14; SS:BP: Ptr to MENU
15; Returns:
16; CF: Set if scroll bars are needed
17; Cleared if no scroll bars needed
18; Corrupts registers:
[67]19; AX
[41]20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22MenuScrollbars_AreScrollbarsNeeded:
[67]23 xchg ax, cx
[41]24 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
25 cmp cx, [bp+MENUINIT.wItems] ; Set CF if max visible < total items
[67]26 xchg cx, ax
[41]27 ret
28
29
30;--------------------------------------------------------------------
31; MenuScrollbars_GetScrollCharacterToALForLineInDI
32; Parameters
33; DI: Index of item line to draw
34; SS:BP: Ptr to MENU
35; Returns:
36; AL: Scroll track or thumb character
37; Corrupts registers:
38; AH, CX, DX
39;--------------------------------------------------------------------
40ALIGN JUMP_ALIGN
41MenuScrollbars_GetScrollCharacterToALForLineInDI:
42 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
43 call .GetFirstThumbLineToAX
44 cmp di, ax ; Before first thumb line?
45 jb SHORT .ReturnTrackCharacter
46 call .GetLastThumbLineToAX
47 cmp di, ax ; After last thumb line?
48 ja SHORT .ReturnTrackCharacter
49 mov al, SCROLL_THUMB_CHARACTER
50 ret
51ALIGN JUMP_ALIGN
52.ReturnTrackCharacter:
53 mov al, SCROLL_TRACK_CHARACTER
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 jmp SHORT .CalculateFirstOrLastThumbLineToAX
70
71;--------------------------------------------------------------------
72; .GetFirstThumbLineToAX
73; Parameters
74; CX: Max visible items on page
75; SS:BP: Ptr to MENU
76; Returns:
77; AX: Item line for first thumb character
78; Corrupts registers:
79; CX, DX
80;--------------------------------------------------------------------
81ALIGN JUMP_ALIGN
82.GetFirstThumbLineToAX:
83 mov ax, [bp+MENU.wFirstVisibleItem]
84.CalculateFirstOrLastThumbLineToAX:
85 mul cx
86 div WORD [bp+MENUINIT.wItems]
87 ret ; (Visible items on page * First visible item on page) / total items
88
89
90;--------------------------------------------------------------------
91; MenuScrollbars_MoveHighlightedItemByAX
92; Parameters
93; AX: Signed offset to new item to be highlighted
94; SS:BP: Ptr to MENU
95; Returns:
96; Nothing
97; Corrupts registers:
98; AX, BX, CX, DX, SI, DI
99;--------------------------------------------------------------------
100ALIGN JUMP_ALIGN
101MenuScrollbars_MoveHighlightedItemByAX:
[52]102 mov cx, [bp+MENUINIT.wHighlightedItem]
[41]103 add cx, ax
104 call .RotateItemInCX
105 ; Fall to .ScrollPageForNewItemInCX
106
107;--------------------------------------------------------------------
108; .ScrollPageForNewItemInCX
109; Parameters
110; CX: New item to be highlighted
111; SS:BP: Ptr to MENU
112; Returns:
113; Nothing
114; Corrupts registers:
115; AX, BX, CX, DX, SI, DI
116;--------------------------------------------------------------------
117.ScrollPageForNewItemInCX:
118 call MenuScrollbars_IsItemInCXonVisiblePage
119 jc SHORT .HighlightNewItemOnCX
120
121 mov dx, [bp+MENU.wFirstVisibleItem]
[52]122 sub dx, [bp+MENUINIT.wHighlightedItem]
[41]123 add dx, cx
124 MAX_S dx, 0
125 call .GetMaxFirstVisibleItemToAX
126 MIN_U ax, dx
127 mov [bp+MENU.wFirstVisibleItem], ax
128 call MenuText_RefreshAllItems
129
130ALIGN JUMP_ALIGN
131.HighlightNewItemOnCX:
132 jmp MenuEvent_HighlightItemFromCX
133
134;--------------------------------------------------------------------
135; .GetMaxFirstVisibleItemToAX
136; Parameters
137; SS:BP: Ptr to MENU
138; Returns:
139; AX: Max first visible item
140; Corrupts registers:
141; Nothing
142;--------------------------------------------------------------------
143ALIGN JUMP_ALIGN
144.GetMaxFirstVisibleItemToAX:
145 push cx
146
147 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
148 mov ax, [bp+MENUINIT.wItems]
149 sub ax, cx
150
151 pop cx
152 ret
153
154;--------------------------------------------------------------------
155; .RotateItemInCX
156; Parameters
157; CX: Possibly under of overflown item to be rotated
158; SS:BP: Ptr to MENU
159; Returns:
160; CX: Valid item index
161; Corrupts registers:
162; DX
163;--------------------------------------------------------------------
164ALIGN JUMP_ALIGN
165.RotateItemInCX:
166 mov dx, [bp+MENUINIT.wItems]
167 cmp cx, BYTE 0
168 jl SHORT .RotateNegativeItemInCX
169 cmp cx, dx
170 jae SHORT .RotatePositiveItemInCX
171 ret
172
173ALIGN JUMP_ALIGN
174.RotatePositiveItemInCX:
175 sub cx, dx
176 ;jae SHORT .RotatePositiveItemInCX ; Not needed by scrolling
177 ret
178
179ALIGN JUMP_ALIGN
180.RotateNegativeItemInCX:
181 add cx, dx
182 ;js SHORT .RotateNegativeItemInCX ; Not needed by scrolling
183 ret
184
185
186;--------------------------------------------------------------------
187; .IsItemInCXonVisiblePage
188; Parameters
189; CX: Item whose visibility is to be checked
190; SS:BP: Ptr to MENU
191; Returns:
192; CF: Set if item is on visible page
193; Cleared if item is not on visible page
194; Corrupts registers:
195; AX
196;--------------------------------------------------------------------
197ALIGN JUMP_ALIGN
198MenuScrollbars_IsItemInCXonVisiblePage:
199 cmp cx, [bp+MENUINIT.wItems]
200 jae SHORT .ItemIsNotVisible
201
202 cmp cx, [bp+MENU.wFirstVisibleItem]
203 jb SHORT .ItemIsNotVisible
204
205 call MenuScrollbars_GetLastVisibleItemOnPageToAX
206 cmp cx, ax
207 ja SHORT .ItemIsNotVisible
208 stc ; Item is visible
209 ret
210ALIGN JUMP_ALIGN
211.ItemIsNotVisible:
212 clc
213 ret
214
215
216;--------------------------------------------------------------------
217; MenuLocation_GetLastVisibleItemOnPageToAX
218; Parameters
219; SS:BP: Ptr to MENU
220; Returns:
221; AX: Index of last visible item on page
222; Corrupts registers:
223; Nothing
224;--------------------------------------------------------------------
225ALIGN JUMP_ALIGN
226MenuScrollbars_GetLastVisibleItemOnPageToAX:
227 push cx
228
229 call MenuScrollbars_GetActualVisibleItemsOnPageToCX
230 xchg ax, cx
231 dec ax
232 add ax, [bp+MENU.wFirstVisibleItem]
233
234 pop cx
235 ret
236
237
238;--------------------------------------------------------------------
239; MenuScrollbars_GetActualVisibleItemsOnPageToCX
240; Parameters
241; SS:BP: Ptr to MENU
242; Returns:
243; CX: Currently visible items
244; Corrupts registers:
245; Nothing
246;--------------------------------------------------------------------
247ALIGN JUMP_ALIGN
248MenuScrollbars_GetActualVisibleItemsOnPageToCX:
249 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
250 MIN_U cx, [bp+MENUINIT.wItems]
251 ret
252
253
254;--------------------------------------------------------------------
255; MenuScrollbars_GetMaxVisibleItemsOnPageToCX
256; Parameters
257; SS:BP: Ptr to MENU
258; Returns:
259; CX: Maximum number of visible items
260; Corrupts registers:
261; Nothing
262;--------------------------------------------------------------------
263ALIGN JUMP_ALIGN
264MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
265 eMOVZX cx, BYTE [bp+MENUINIT.bHeight]
266 sub cl, [bp+MENUINIT.bTitleLines]
267 sub cl, [bp+MENUINIT.bInfoLines]
268 sub cl, MENU_VERTICAL_BORDER_LINES
269 ret
Note: See TracBrowser for help on using the repository browser.