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

Last change on this file since 141 was 133, checked in by krille_n_@…, 13 years ago

Size optimizations in various files in the Assembly Library. Also a very small change to a string in XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm

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