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

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

Changes:

  • SerDrive: Using named pipe mode (serdrive -p) now works under Windows XP/2000/Server 2003.
  • checksum.pl: Added a compatibility fix for 3Com 3C503 cards.
  • XTIDECFG will now scan every possible segment address to find and load the BIOS and/or its settings from EEPROM. This should simplify things for people using combined option ROMs.
  • Fixed a bug from r521 in BootSector.asm where the BIOS would not display a timeout error if it failed to load the boot sector from harddrive.
  • Fixed a bug from r541 in CompatibleDPT.asm where CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI would generate an invalid checksum in the DPTE.
  • Optimizations and other fixes.
File size: 7.3 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
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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:
[181]118    mov     dx, [bp+MENUINIT.wItems]
[568]119    add     ax, [bp+MENUINIT.wHighlightedItem]
120    xchg    cx, ax
[181]121    js      SHORT .RotateNegativeItemInCX
122    sub     cx, dx
123    jae     SHORT .ScrollPageForNewItemInCX
124
[369]125ALIGN MENU_JUMP_ALIGN
[181]126.RotateNegativeItemInCX:
127    add     cx, dx
[41]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;--------------------------------------------------------------------
[369]140ALIGN MENU_JUMP_ALIGN
[41]141.ScrollPageForNewItemInCX:
142    call    MenuScrollbars_IsItemInCXonVisiblePage
143    jc      SHORT .HighlightNewItemOnCX
144
145    mov     dx, [bp+MENU.wFirstVisibleItem]
[52]146    sub     dx, [bp+MENUINIT.wHighlightedItem]
[41]147
[181]148    ; Get MaxFirstVisibleItem to AX
[41]149    push    cx
150    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
151    mov     ax, [bp+MENUINIT.wItems]
152    sub     ax, cx
153    pop     cx
154
[181]155    add     dx, cx
156    jns     .DXisPositive
157    cwd     ; This won't work if MaxFirstVisibleItem > 32767
158
[369]159ALIGN MENU_JUMP_ALIGN
[181]160.DXisPositive:
161    cmp     ax, dx
162    jb      .AXisLessThanDX
163    xchg    dx, ax
[41]164
[369]165ALIGN MENU_JUMP_ALIGN
[181]166.AXisLessThanDX:
167    mov     [bp+MENU.wFirstVisibleItem], ax
168    call    MenuText_RefreshAllItems
[41]169
[369]170ALIGN MENU_JUMP_ALIGN
[181]171.HighlightNewItemOnCX:
172    jmp     MenuEvent_HighlightItemFromCX
[41]173
174
175;--------------------------------------------------------------------
[105]176; MenuScrollbars_IsItemInCXonVisiblePage
[41]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;--------------------------------------------------------------------
[369]186ALIGN MENU_JUMP_ALIGN
[41]187MenuScrollbars_IsItemInCXonVisiblePage:
[133]188    cmp     [bp+MENU.wFirstVisibleItem], cx
189    ja      SHORT .ItemIsNotVisible
[41]190
191    call    MenuScrollbars_GetLastVisibleItemOnPageToAX
192    cmp     cx, ax
193    ja      SHORT .ItemIsNotVisible
194    stc     ; Item is visible
[369]195ALIGN MENU_JUMP_ALIGN, ret
[41]196.ItemIsNotVisible:
197    ret
198
199
200;--------------------------------------------------------------------
[105]201; MenuScrollbars_GetLastVisibleItemOnPageToAX
[41]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;--------------------------------------------------------------------
[369]209ALIGN MENU_JUMP_ALIGN
[41]210MenuScrollbars_GetLastVisibleItemOnPageToAX:
[181]211    xchg    cx, ax
[41]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;--------------------------------------------------------------------
[369]228ALIGN MENU_JUMP_ALIGN
[41]229MenuScrollbars_GetActualVisibleItemsOnPageToCX:
230    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
[181]231    cmp     cx, [bp+MENUINIT.wItems]
232    jb      SHORT .Return
233    mov     cx, [bp+MENUINIT.wItems]
[369]234ALIGN MENU_JUMP_ALIGN, ret
[181]235.Return:
[41]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;--------------------------------------------------------------------
[369]248ALIGN MENU_JUMP_ALIGN
[41]249MenuScrollbars_GetMaxVisibleItemsOnPageToCX:
[293]250    eMOVZX  cx, [bp+MENUINIT.bHeight]
[41]251    sub     cl, [bp+MENUINIT.bTitleLines]
252    sub     cl, [bp+MENUINIT.bInfoLines]
253    sub     cl, MENU_VERTICAL_BORDER_LINES
254    ret
Note: See TracBrowser for help on using the repository browser.