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

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

Changes to Assembly Library:

  • Menu system KeyStroke event related code now always included since the %ifdef did not seem to work.
File size: 5.7 KB
RevLine 
[41]1; Project name  :   Assembly Library
2; Description   :   Menu loop for waiting keystrokes.
3
[376]4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[526]12;
[376]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
[526]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
[526]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
[526]89
[41]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:
[492]106%ifndef MENU_NO_ESC
[178]107    cmp     al, ESC
[41]108    je      SHORT .LeaveMenuWithoutSelectingItem
[492]109%endif
[178]110    cmp     al, CR
[41]111    je      SHORT .SelectItem
112
113    test    BYTE [bp+MENU.bFlags], FLG_MENU_USER_HANDLES_SCROLLING
114    jz      SHORT MenuLoop_ProcessScrollingKeysFromAX
[133]115    ret     ; Return with CF cleared since keystroke not processed
[41]116
[526]117%ifndef MENU_NO_ESC
[369]118ALIGN MENU_JUMP_ALIGN
[41]119.LeaveMenuWithoutSelectingItem:
[58]120    call    MenuEvent_ExitMenu
121    jnc     SHORT .CancelMenuExit
[41]122    call    MenuInit_CloseMenuWindow
[52]123    mov     WORD [bp+MENUINIT.wHighlightedItem], NO_ITEM_HIGHLIGHTED
[58]124.CancelMenuExit:
[41]125    stc
126    ret
[492]127%endif
[526]128
[369]129ALIGN MENU_JUMP_ALIGN
[41]130.SelectItem:
[52]131    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]132    call    MenuEvent_ItemSelectedFromCX
133    stc
134    ret
135
136
137;--------------------------------------------------------------------
138; MenuLoop_ProcessScrollingKeysFromAX
139;   Parameters
140;       AL:     ASCII character
141;       AH:     BIOS scan code
142;       SS:BP:  Ptr to MENU
143;   Returns:
144;       CF:     Set if keystroke processed
145;               Cleared if keystroke not processed
146;       AL:     ASCII character (if CF cleared)
147;       AH:     BIOS scan code (if CF cleared)
148;   Corrupts registers:
149;       BX, CX, DX, SI, DI
150;--------------------------------------------------------------------
[369]151ALIGN MENU_JUMP_ALIGN
[41]152MenuLoop_ProcessScrollingKeysFromAX:
[178]153    xchg    ah, al
154    cmp     al, MENU_KEY_PGUP
[41]155    je      SHORT .ChangeToPreviousPage
[178]156    cmp     al, MENU_KEY_PGDN
[41]157    je      SHORT .ChangeToNextPage
[178]158    cmp     al, MENU_KEY_HOME
[41]159    je      SHORT .SelectFirstItem
[178]160    cmp     al, MENU_KEY_END
[41]161    je      SHORT .SelectLastItem
162
[178]163    cmp     al, MENU_KEY_UP
[41]164    je      SHORT .DecrementSelectedItem
[178]165    cmp     al, MENU_KEY_DOWN
[41]166    je      SHORT .IncrementSelectedItem
167    clc     ; Clear CF since keystroke not processed
[178]168    xchg    ah, al
[41]169    ret
170
[369]171ALIGN MENU_JUMP_ALIGN
[41]172.ChangeToPreviousPage:
173    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
174    xchg    ax, cx
175    neg     ax
[52]176    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]177    add     cx, ax
178    jge     SHORT .MoveHighlightedItemByAX  ; No rotation for PgUp
179    ; Fall to .SelectFirstItem
[369]180ALIGN MENU_JUMP_ALIGN
[41]181.SelectFirstItem:
[52]182    mov     ax, [bp+MENUINIT.wHighlightedItem]
[41]183    neg     ax
184    jmp     SHORT .MoveHighlightedItemByAX
185
[369]186ALIGN MENU_JUMP_ALIGN
[41]187.ChangeToNextPage:
188    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
189    xchg    ax, cx
[52]190    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]191    add     cx, ax
192    cmp     cx, [bp+MENUINIT.wItems]
193    jb      SHORT .MoveHighlightedItemByAX  ; No rotation for PgDn
194    ; Fall to .SelectLastItem
[369]195ALIGN MENU_JUMP_ALIGN
[41]196.SelectLastItem:
[178]197    stc
[41]198    mov     ax, [bp+MENUINIT.wItems]
[178]199    sbb     ax, [bp+MENUINIT.wHighlightedItem]
[41]200    jmp     SHORT .MoveHighlightedItemByAX
201
[369]202ALIGN MENU_JUMP_ALIGN
[41]203.DecrementSelectedItem:
204    mov     ax, -1
[178]205    SKIP2B  cx  ; mov cx, <next instruction>
[41]206.IncrementSelectedItem:
[178]207    mov     al, 1   ; AH is already 0
[369]208ALIGN MENU_JUMP_ALIGN
[41]209.MoveHighlightedItemByAX:
210    call    MenuScrollbars_MoveHighlightedItemByAX
211    stc
212    ret
Note: See TracBrowser for help on using the repository browser.