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

Last change on this file since 95 was 60, checked in by Tomi Tilli, 14 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.