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

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

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 7.0 KB
RevLine 
[41]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:
[67]15;       AX
[41]16;--------------------------------------------------------------------
[369]17ALIGN MENU_JUMP_ALIGN
[41]18MenuScrollbars_AreScrollbarsNeeded:
[67]19    xchg    ax, cx
[41]20    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
21    cmp     cx, [bp+MENUINIT.wItems]        ; Set CF if max visible < total items
[67]22    xchg    cx, ax
[41]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;--------------------------------------------------------------------
[369]36ALIGN MENU_JUMP_ALIGN
[41]37MenuScrollbars_GetScrollCharacterToALForLineInDI:
38    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[181]39    ; Get first thumb line to AX
40    mov     ax, [bp+MENU.wFirstVisibleItem]
41    call    .CalculateFirstOrLastThumbLineToAX
42
[41]43    cmp     di, ax              ; Before first thumb line?
44    jb      SHORT .ReturnTrackCharacter
45    call    .GetLastThumbLineToAX
[181]46    cmp     ax, di              ; After last thumb line?
[369]47ALIGN MENU_JUMP_ALIGN
[41]48.ReturnTrackCharacter:
49    mov     al, SCROLL_TRACK_CHARACTER
[181]50    jb      SHORT .Return
51    mov     al, SCROLL_THUMB_CHARACTER
[369]52ALIGN MENU_JUMP_ALIGN, ret
[181]53.Return:
[41]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
[133]65;--------------------------------------------------------------------
[369]66ALIGN MENU_JUMP_ALIGN
[41]67.GetLastThumbLineToAX:
68    call    MenuScrollbars_GetLastVisibleItemOnPageToAX
[181]69    ; Fall to .CalculateFirstOrLastThumbLineToAX
[41]70
71;--------------------------------------------------------------------
[181]72; .CalculateFirstOrLastThumbLineToAX
[41]73;   Parameters
[181]74;       AX:     Index of first or last visible item on page
[41]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;--------------------------------------------------------------------
[369]82ALIGN MENU_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[369]99ALIGN MENU_JUMP_ALIGN
[41]100MenuScrollbars_MoveHighlightedItemByAX:
[52]101    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]102    add     cx, ax
[181]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
[369]122ALIGN MENU_JUMP_ALIGN
[181]123.RotateNegativeItemInCX:
124    add     cx, dx
[41]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;--------------------------------------------------------------------
[369]137ALIGN MENU_JUMP_ALIGN
[41]138.ScrollPageForNewItemInCX:
139    call    MenuScrollbars_IsItemInCXonVisiblePage
140    jc      SHORT .HighlightNewItemOnCX
141
142    mov     dx, [bp+MENU.wFirstVisibleItem]
[52]143    sub     dx, [bp+MENUINIT.wHighlightedItem]
[41]144
[181]145    ; Get MaxFirstVisibleItem to AX
[41]146    push    cx
147    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
148    mov     ax, [bp+MENUINIT.wItems]
149    sub     ax, cx
150    pop     cx
151
[181]152    add     dx, cx
153    jns     .DXisPositive
154    cwd     ; This won't work if MaxFirstVisibleItem > 32767
155
[369]156ALIGN MENU_JUMP_ALIGN
[181]157.DXisPositive:
158    cmp     ax, dx
159    jb      .AXisLessThanDX
160    xchg    dx, ax
[41]161
[369]162ALIGN MENU_JUMP_ALIGN
[181]163.AXisLessThanDX:
164    mov     [bp+MENU.wFirstVisibleItem], ax
165    call    MenuText_RefreshAllItems
[41]166
[369]167ALIGN MENU_JUMP_ALIGN
[181]168.HighlightNewItemOnCX:
169    jmp     MenuEvent_HighlightItemFromCX
[41]170
171
172;--------------------------------------------------------------------
[105]173; MenuScrollbars_IsItemInCXonVisiblePage
[41]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;--------------------------------------------------------------------
[369]183ALIGN MENU_JUMP_ALIGN
[41]184MenuScrollbars_IsItemInCXonVisiblePage:
[133]185    cmp     [bp+MENU.wFirstVisibleItem], cx
186    ja      SHORT .ItemIsNotVisible
[41]187
188    call    MenuScrollbars_GetLastVisibleItemOnPageToAX
189    cmp     cx, ax
190    ja      SHORT .ItemIsNotVisible
191    stc     ; Item is visible
[369]192ALIGN MENU_JUMP_ALIGN, ret
[41]193.ItemIsNotVisible:
194    ret
195
196
197;--------------------------------------------------------------------
[105]198; MenuScrollbars_GetLastVisibleItemOnPageToAX
[41]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;--------------------------------------------------------------------
[369]206ALIGN MENU_JUMP_ALIGN
[41]207MenuScrollbars_GetLastVisibleItemOnPageToAX:
[181]208    xchg    cx, ax
[41]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;--------------------------------------------------------------------
[369]225ALIGN MENU_JUMP_ALIGN
[41]226MenuScrollbars_GetActualVisibleItemsOnPageToCX:
227    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[181]228    cmp     cx, [bp+MENUINIT.wItems]
229    jb      SHORT .Return
230    mov     cx, [bp+MENUINIT.wItems]
[369]231ALIGN MENU_JUMP_ALIGN, ret
[181]232.Return:
[41]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;--------------------------------------------------------------------
[369]245ALIGN MENU_JUMP_ALIGN
[41]246MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
[293]247    eMOVZX  cx, [bp+MENUINIT.bHeight]
[41]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.