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

Last change on this file since 371 was 369, checked in by gregli@…, 12 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

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