source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuLoop.asm @ 526

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

Changes:

  • Update of the copyright notices to include the year 2013.
File size: 5.8 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Menu loop for waiting keystrokes.
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; MenuLoop_Enter
26;   Parameters
27;       SS:BP:  Ptr to MENU
28;   Returns:
29;       Nothing
30;   Corrupts registers:
31;       AX, BX, CX, DX, SI, DI
32;--------------------------------------------------------------------
33ALIGN MENU_JUMP_ALIGN
34MenuLoop_Enter:
35    call    KeystrokeProcessing
36    call    TimeoutProcessing
37%ifdef MENUEVENT_IDLEPROCESSING_ENABLE
38    call    MenuEvent_IdleProcessing    ; User idle processing
39%endif
40    test    BYTE [bp+MENU.bFlags], FLG_MENU_EXIT
41    jz      SHORT MenuLoop_Enter
42    ret
43
44
45;--------------------------------------------------------------------
46; KeystrokeProcessing
47; TimeoutProcessing
48;   Parameters
49;       SS:BP:  Ptr to MENU
50;   Returns:
51;       Nothing
52;   Corrupts registers:
53;       All, except SS:BP
54;--------------------------------------------------------------------
55ALIGN MENU_JUMP_ALIGN
56KeystrokeProcessing:
57    call    Keyboard_GetKeystrokeToAX
58    jnz     SHORT ProcessKeystrokeFromAX
59NoKeystrokeToProcess:
60    ret
61
62ALIGN MENU_JUMP_ALIGN
63TimeoutProcessing:
64    call    MenuTime_UpdateSelectionTimeout
65    jnc     NoKeystrokeToProcess
66    mov     al, CR  ; Fake ENTER to select item
67    ; Fall to ProcessKeystrokeFromAX
68
69
70;--------------------------------------------------------------------
71; ProcessKeystrokeFromAX
72;   Parameters
73;       AL:     ASCII character
74;       AH:     BIOS scan code
75;       SS:BP:  Ptr to MENU
76;   Returns:
77;       Nothing
78;   Corrupts registers:
79;       AX, BX, CX, DX, SI, DI
80;--------------------------------------------------------------------
81ALIGN MENU_JUMP_ALIGN
82ProcessKeystrokeFromAX:
83    xchg    cx, ax
84    call    MenuTime_StopSelectionTimeout
85    xchg    ax, cx
86    call    .ProcessMenuSystemKeystrokeFromAX
87%ifdef MENUEVENT_KeyStrokeInAX
88    jc      SHORT NoKeystrokeToProcess
89    jmp     MenuEvent_KeyStrokeInAX
90%else
91    jmp     SHORT NoKeystrokeToProcess
92%endif
93
94;--------------------------------------------------------------------
95; .ProcessMenuSystemKeystrokeFromAX
96;   Parameters
97;       AL:     ASCII character
98;       AH:     BIOS scan code
99;       SS:BP:  Ptr to MENU
100;   Returns:
101;       CF:     Set if keystroke processed
102;               Cleared if keystroke not processed
103;       AL:     ASCII character (if CF cleared)
104;       AH:     BIOS scan code (if CF cleared)
105;   Corrupts registers:
106;       BX, CX, DX, SI, DI
107;--------------------------------------------------------------------
108ALIGN MENU_JUMP_ALIGN
109.ProcessMenuSystemKeystrokeFromAX:
110%ifndef MENU_NO_ESC
111    cmp     al, ESC
112    je      SHORT .LeaveMenuWithoutSelectingItem
113%endif
114    cmp     al, CR
115    je      SHORT .SelectItem
116
117    test    BYTE [bp+MENU.bFlags], FLG_MENU_USER_HANDLES_SCROLLING
118    jz      SHORT MenuLoop_ProcessScrollingKeysFromAX
119    ret     ; Return with CF cleared since keystroke not processed
120
121%ifndef MENU_NO_ESC
122ALIGN MENU_JUMP_ALIGN
123.LeaveMenuWithoutSelectingItem:
124    call    MenuEvent_ExitMenu
125    jnc     SHORT .CancelMenuExit
126    call    MenuInit_CloseMenuWindow
127    mov     WORD [bp+MENUINIT.wHighlightedItem], NO_ITEM_HIGHLIGHTED
128.CancelMenuExit:
129    stc
130    ret
131%endif
132
133ALIGN MENU_JUMP_ALIGN
134.SelectItem:
135    mov     cx, [bp+MENUINIT.wHighlightedItem]
136    call    MenuEvent_ItemSelectedFromCX
137    stc
138    ret
139
140
141;--------------------------------------------------------------------
142; MenuLoop_ProcessScrollingKeysFromAX
143;   Parameters
144;       AL:     ASCII character
145;       AH:     BIOS scan code
146;       SS:BP:  Ptr to MENU
147;   Returns:
148;       CF:     Set if keystroke processed
149;               Cleared if keystroke not processed
150;       AL:     ASCII character (if CF cleared)
151;       AH:     BIOS scan code (if CF cleared)
152;   Corrupts registers:
153;       BX, CX, DX, SI, DI
154;--------------------------------------------------------------------
155ALIGN MENU_JUMP_ALIGN
156MenuLoop_ProcessScrollingKeysFromAX:
157    xchg    ah, al
158    cmp     al, MENU_KEY_PGUP
159    je      SHORT .ChangeToPreviousPage
160    cmp     al, MENU_KEY_PGDN
161    je      SHORT .ChangeToNextPage
162    cmp     al, MENU_KEY_HOME
163    je      SHORT .SelectFirstItem
164    cmp     al, MENU_KEY_END
165    je      SHORT .SelectLastItem
166
167    cmp     al, MENU_KEY_UP
168    je      SHORT .DecrementSelectedItem
169    cmp     al, MENU_KEY_DOWN
170    je      SHORT .IncrementSelectedItem
171    clc     ; Clear CF since keystroke not processed
172    xchg    ah, al
173    ret
174
175ALIGN MENU_JUMP_ALIGN
176.ChangeToPreviousPage:
177    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
178    xchg    ax, cx
179    neg     ax
180    mov     cx, [bp+MENUINIT.wHighlightedItem]
181    add     cx, ax
182    jge     SHORT .MoveHighlightedItemByAX  ; No rotation for PgUp
183    ; Fall to .SelectFirstItem
184ALIGN MENU_JUMP_ALIGN
185.SelectFirstItem:
186    mov     ax, [bp+MENUINIT.wHighlightedItem]
187    neg     ax
188    jmp     SHORT .MoveHighlightedItemByAX
189
190ALIGN MENU_JUMP_ALIGN
191.ChangeToNextPage:
192    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
193    xchg    ax, cx
194    mov     cx, [bp+MENUINIT.wHighlightedItem]
195    add     cx, ax
196    cmp     cx, [bp+MENUINIT.wItems]
197    jb      SHORT .MoveHighlightedItemByAX  ; No rotation for PgDn
198    ; Fall to .SelectLastItem
199ALIGN MENU_JUMP_ALIGN
200.SelectLastItem:
201    stc
202    mov     ax, [bp+MENUINIT.wItems]
203    sbb     ax, [bp+MENUINIT.wHighlightedItem]
204    jmp     SHORT .MoveHighlightedItemByAX
205
206ALIGN MENU_JUMP_ALIGN
207.DecrementSelectedItem:
208    mov     ax, -1
209    SKIP2B  cx  ; mov cx, <next instruction>
210.IncrementSelectedItem:
211    mov     al, 1   ; AH is already 0
212ALIGN MENU_JUMP_ALIGN
213.MoveHighlightedItemByAX:
214    call    MenuScrollbars_MoveHighlightedItemByAX
215    stc
216    ret
Note: See TracBrowser for help on using the repository browser.