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

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

Removed the dependency between MODULE_BOOT_MENU and MODULE_HOTKEYS. With these changes, 0, 1, or 2 of them can be included in a build. This change also means that the hotkeys don't work while the menu is up. But the most important hotkey there was for Rom Boot, and that has been added to the menu as a choice proper. Lots of changes across the board in the hotkeys code - even if we eventually back this change out (becaue, for example we want hotkeys to work in the menu) we should probably start from this base and add that functionality back in, as these changes results in approximately 120 bytes of savings and includes new functionality, such as the Rom Boot menu item and the Com Detect hotkey.

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