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

Last change on this file since 526 was 526, checked in by krille_n_@…, 12 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.