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

Last change on this file since 60 was 60, checked in by aitotat, 13 years ago

Changes to Assembly Library:

  • Timeout count down is now stopped when any key pressed.
File size: 5.1 KB
RevLine 
[41]1; File name     :   MenuLoop.asm
2; Project name  :   Assembly Library
3; Created date  :   22.7.2010
[60]4; Last update   :   25.11.2010
[41]5; Author        :   Tomi Tilli
6; Description   :   Menu loop for waiting keystrokes.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; MenuLoop_Enter
13;   Parameters
14;       SS:BP:  Ptr to MENU
15;   Returns:
16;       Nothing
17;   Corrupts registers:
18;       AX, BX, CX, DX, SI, DI
19;--------------------------------------------------------------------
20ALIGN JUMP_ALIGN
21MenuLoop_Enter:
[58]22    call    KeystrokeProcessing
23    call    TimeoutProcessing
24    call    IdleTimeProcessing
[41]25    test    BYTE [bp+MENU.bFlags], FLG_MENU_EXIT
26    jz      SHORT MenuLoop_Enter
[58]27    ret
[41]28
29
30;--------------------------------------------------------------------
31; IdleTimeProcessing
[58]32; TimeoutProcessing
33; KeystrokeProcessing
[41]34;   Parameters
35;       SS:BP:  Ptr to MENU
36;   Returns:
37;       Nothing
38;   Corrupts registers:
[58]39;       All, except SS:BP
[41]40;--------------------------------------------------------------------
41ALIGN JUMP_ALIGN
42IdleTimeProcessing:
[58]43    jmp     MenuEvent_IdleProcessing        ; User idle processing
[41]44
[58]45ALIGN JUMP_ALIGN
46TimeoutProcessing:
47    call    MenuTime_UpdateSelectionTimeout
48    mov     ah, MENU_KEY_ENTER              ; Fake ENTER to select item
49    jc      SHORT ProcessKeystrokeFromAX    ; Process faked ENTER
50    ret
[41]51
[58]52ALIGN JUMP_ALIGN
53KeystrokeProcessing:
54    call    Keyboard_GetKeystrokeToAX
55    jnz     SHORT ProcessKeystrokeFromAX
56    ret
57
58
[41]59;--------------------------------------------------------------------
60; ProcessKeystrokeFromAX
61;   Parameters
62;       AL:     ASCII character
63;       AH:     BIOS scan code
64;       SS:BP:  Ptr to MENU
65;   Returns:
66;       Nothing 
67;   Corrupts registers:
68;       AX, BX, CX, DX, SI, DI
69;--------------------------------------------------------------------
70ALIGN JUMP_ALIGN
71ProcessKeystrokeFromAX:
[60]72    xchg    cx, ax
73    call    MenuTime_StopSelectionTimeout
74    xchg    ax, cx
75    call    .ProcessMenuSystemKeystrokeFromAX
[41]76    jc      SHORT .Return
77    jmp     MenuEvent_KeyStrokeInAX
78ALIGN JUMP_ALIGN, ret
79.Return:
80    ret
81
82;--------------------------------------------------------------------
[60]83; .ProcessMenuSystemKeystrokeFromAX
[41]84;   Parameters
85;       AL:     ASCII character
86;       AH:     BIOS scan code
87;       SS:BP:  Ptr to MENU
88;   Returns:
89;       CF:     Set if keystroke processed
90;               Cleared if keystroke not processed
91;       AL:     ASCII character (if CF cleared)
92;       AH:     BIOS scan code (if CF cleared)
93;   Corrupts registers:
94;       BX, CX, DX, SI, DI
95;--------------------------------------------------------------------
96ALIGN JUMP_ALIGN
[60]97.ProcessMenuSystemKeystrokeFromAX:
[41]98    cmp     ah, MENU_KEY_ESC
99    je      SHORT .LeaveMenuWithoutSelectingItem
100    cmp     ah, MENU_KEY_ENTER
101    je      SHORT .SelectItem
102
103    test    BYTE [bp+MENU.bFlags], FLG_MENU_USER_HANDLES_SCROLLING
104    jz      SHORT MenuLoop_ProcessScrollingKeysFromAX
105    clc     ; Clear CF since keystroke not processed
106    ret
107
108ALIGN JUMP_ALIGN
109.LeaveMenuWithoutSelectingItem:
[58]110    call    MenuEvent_ExitMenu
111    jnc     SHORT .CancelMenuExit
[41]112    call    MenuInit_CloseMenuWindow
[52]113    mov     WORD [bp+MENUINIT.wHighlightedItem], NO_ITEM_HIGHLIGHTED
[58]114.CancelMenuExit:
[41]115    stc
116    ret
117
118ALIGN JUMP_ALIGN
119.SelectItem:
[52]120    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]121    call    MenuEvent_ItemSelectedFromCX
122    stc
123    ret
124
125
126;--------------------------------------------------------------------
127; MenuLoop_ProcessScrollingKeysFromAX
128;   Parameters
129;       AL:     ASCII character
130;       AH:     BIOS scan code
131;       SS:BP:  Ptr to MENU
132;   Returns:
133;       CF:     Set if keystroke processed
134;               Cleared if keystroke not processed
135;       AL:     ASCII character (if CF cleared)
136;       AH:     BIOS scan code (if CF cleared)
137;   Corrupts registers:
138;       BX, CX, DX, SI, DI
139;--------------------------------------------------------------------
140ALIGN JUMP_ALIGN
141MenuLoop_ProcessScrollingKeysFromAX:
142    cmp     ah, MENU_KEY_PGUP
143    je      SHORT .ChangeToPreviousPage
144    cmp     ah, MENU_KEY_PGDN
145    je      SHORT .ChangeToNextPage
146    cmp     ah, MENU_KEY_HOME
147    je      SHORT .SelectFirstItem
148    cmp     ah, MENU_KEY_END
149    je      SHORT .SelectLastItem
150
151    cmp     ah, MENU_KEY_UP
152    je      SHORT .DecrementSelectedItem
153    cmp     ah, MENU_KEY_DOWN
154    je      SHORT .IncrementSelectedItem
155    clc     ; Clear CF since keystroke not processed
156    ret
157
158ALIGN JUMP_ALIGN
159.ChangeToPreviousPage:
160    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
161    xchg    ax, cx
162    neg     ax
[52]163    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]164    add     cx, ax
165    jge     SHORT .MoveHighlightedItemByAX  ; No rotation for PgUp
166    ; Fall to .SelectFirstItem
167ALIGN JUMP_ALIGN
168.SelectFirstItem:
[52]169    mov     ax, [bp+MENUINIT.wHighlightedItem]
[41]170    neg     ax
171    jmp     SHORT .MoveHighlightedItemByAX
172
173ALIGN JUMP_ALIGN
174.ChangeToNextPage:
175    call    MenuScrollbars_GetMaxVisibleItemsOnPageToCX
176    xchg    ax, cx
[52]177    mov     cx, [bp+MENUINIT.wHighlightedItem]
[41]178    add     cx, ax
179    cmp     cx, [bp+MENUINIT.wItems]
180    jb      SHORT .MoveHighlightedItemByAX  ; No rotation for PgDn
181    ; Fall to .SelectLastItem
182ALIGN JUMP_ALIGN
183.SelectLastItem:
184    mov     ax, [bp+MENUINIT.wItems]
[52]185    sub     ax, [bp+MENUINIT.wHighlightedItem]
[41]186    dec     ax
187    jmp     SHORT .MoveHighlightedItemByAX
188
189ALIGN JUMP_ALIGN
190.DecrementSelectedItem:
191    mov     ax, -1
192    jmp     SHORT .MoveHighlightedItemByAX
193ALIGN JUMP_ALIGN
194.IncrementSelectedItem:
195    mov     ax, 1
196ALIGN JUMP_ALIGN
197.MoveHighlightedItemByAX:
198    call    MenuScrollbars_MoveHighlightedItemByAX
199    stc
200    ret
Note: See TracBrowser for help on using the repository browser.