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

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

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

File size: 5.7 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-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
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    jc      SHORT NoKeystrokeToProcess
88    jmp     MenuEvent_KeyStrokeInAX
89
90;--------------------------------------------------------------------
91; .ProcessMenuSystemKeystrokeFromAX
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;--------------------------------------------------------------------
104ALIGN MENU_JUMP_ALIGN
105.ProcessMenuSystemKeystrokeFromAX:
106    cmp     al, ESC
107    je      SHORT .LeaveMenuWithoutSelectingItem
108    cmp     al, CR
109    je      SHORT .SelectItem
110
111    test    BYTE [bp+MENU.bFlags], FLG_MENU_USER_HANDLES_SCROLLING
112    jz      SHORT MenuLoop_ProcessScrollingKeysFromAX
113    ret     ; Return with CF cleared since keystroke not processed
114
115ALIGN MENU_JUMP_ALIGN
116.LeaveMenuWithoutSelectingItem:
117    call    MenuEvent_ExitMenu
118    jnc     SHORT .CancelMenuExit
119    call    MenuInit_CloseMenuWindow
120    mov     WORD [bp+MENUINIT.wHighlightedItem], NO_ITEM_HIGHLIGHTED
121.CancelMenuExit:
122    stc
123    ret
124
125ALIGN MENU_JUMP_ALIGN
126.SelectItem:
127    mov     cx, [bp+MENUINIT.wHighlightedItem]
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;--------------------------------------------------------------------
147ALIGN MENU_JUMP_ALIGN
148MenuLoop_ProcessScrollingKeysFromAX:
149    xchg    ah, al
150    cmp     al, MENU_KEY_PGUP
151    je      SHORT .ChangeToPreviousPage
152    cmp     al, MENU_KEY_PGDN
153    je      SHORT .ChangeToNextPage
154    cmp     al, MENU_KEY_HOME
155    je      SHORT .SelectFirstItem
156    cmp     al, MENU_KEY_END
157    je      SHORT .SelectLastItem
158
159    cmp     al, MENU_KEY_UP
160    je      SHORT .DecrementSelectedItem
161    cmp     al, MENU_KEY_DOWN
162    je      SHORT .IncrementSelectedItem
163    clc     ; Clear CF since keystroke not processed
164    xchg    ah, al
165    ret
166
167ALIGN MENU_JUMP_ALIGN
168.ChangeToPreviousPage:
169    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
170    xchg    ax, cx
171    neg     ax
172    mov     cx, [bp+MENUINIT.wHighlightedItem]
173    add     cx, ax
174    jge     SHORT .MoveHighlightedItemByAX  ; No rotation for PgUp
175    ; Fall to .SelectFirstItem
176ALIGN MENU_JUMP_ALIGN
177.SelectFirstItem:
178    mov     ax, [bp+MENUINIT.wHighlightedItem]
179    neg     ax
180    jmp     SHORT .MoveHighlightedItemByAX
181
182ALIGN MENU_JUMP_ALIGN
183.ChangeToNextPage:
184    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
185    xchg    ax, cx
186    mov     cx, [bp+MENUINIT.wHighlightedItem]
187    add     cx, ax
188    cmp     cx, [bp+MENUINIT.wItems]
189    jb      SHORT .MoveHighlightedItemByAX  ; No rotation for PgDn
190    ; Fall to .SelectLastItem
191ALIGN MENU_JUMP_ALIGN
192.SelectLastItem:
193    stc
194    mov     ax, [bp+MENUINIT.wItems]
195    sbb     ax, [bp+MENUINIT.wHighlightedItem]
196    jmp     SHORT .MoveHighlightedItemByAX
197
198ALIGN MENU_JUMP_ALIGN
199.DecrementSelectedItem:
200    mov     ax, -1
201    SKIP2B  cx  ; mov cx, <next instruction>
202.IncrementSelectedItem:
203    mov     al, 1   ; AH is already 0
204ALIGN MENU_JUMP_ALIGN
205.MoveHighlightedItemByAX:
206    call    MenuScrollbars_MoveHighlightedItemByAX
207    stc
208    ret
Note: See TracBrowser for help on using the repository browser.