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

Last change on this file since 399 was 376, checked in by gregli@…, 13 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

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