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

Last change on this file since 180 was 178, checked in by krille_n_@…, 13 years ago
  • Removed an %ifdef in RomVars.inc that prevented XTIDECFG from building.
  • Size optimizations in MenuLoop.asm.
File size: 4.9 KB
RevLine 
[41]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:
[58]18 call KeystrokeProcessing
19 call TimeoutProcessing
[105]20 call MenuEvent_IdleProcessing ; User idle processing
[41]21 test BYTE [bp+MENU.bFlags], FLG_MENU_EXIT
22 jz SHORT MenuLoop_Enter
[58]23 ret
[41]24
25
26;--------------------------------------------------------------------
[105]27; KeystrokeProcessing
[58]28; TimeoutProcessing
[41]29; Parameters
30; SS:BP: Ptr to MENU
31; Returns:
32; Nothing
33; Corrupts registers:
[58]34; All, except SS:BP
[41]35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
[105]37KeystrokeProcessing:
38 call Keyboard_GetKeystrokeToAX
39 jnz SHORT ProcessKeystrokeFromAX
40NoKeystrokeToProcess:
41 ret
[41]42
[58]43ALIGN JUMP_ALIGN
44TimeoutProcessing:
45 call MenuTime_UpdateSelectionTimeout
[105]46 jnc NoKeystrokeToProcess
[178]47 mov al, CR ; Fake ENTER to select item
[105]48 ; Fall to ProcessKeystrokeFromAX
[41]49
[58]50
[41]51;--------------------------------------------------------------------
52; ProcessKeystrokeFromAX
53; Parameters
54; AL: ASCII character
55; AH: BIOS scan code
56; SS:BP: Ptr to MENU
57; Returns:
[133]58; Nothing
[41]59; Corrupts registers:
60; AX, BX, CX, DX, SI, DI
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
63ProcessKeystrokeFromAX:
[60]64 xchg cx, ax
65 call MenuTime_StopSelectionTimeout
66 xchg ax, cx
67 call .ProcessMenuSystemKeystrokeFromAX
[105]68 jc SHORT NoKeystrokeToProcess
[41]69 jmp MenuEvent_KeyStrokeInAX
70
71;--------------------------------------------------------------------
[60]72; .ProcessMenuSystemKeystrokeFromAX
[41]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
[60]86.ProcessMenuSystemKeystrokeFromAX:
[178]87 cmp al, ESC
[41]88 je SHORT .LeaveMenuWithoutSelectingItem
[178]89 cmp al, CR
[41]90 je SHORT .SelectItem
91
92 test BYTE [bp+MENU.bFlags], FLG_MENU_USER_HANDLES_SCROLLING
93 jz SHORT MenuLoop_ProcessScrollingKeysFromAX
[133]94 ret ; Return with CF cleared since keystroke not processed
[41]95
96ALIGN JUMP_ALIGN
97.LeaveMenuWithoutSelectingItem:
[58]98 call MenuEvent_ExitMenu
99 jnc SHORT .CancelMenuExit
[41]100 call MenuInit_CloseMenuWindow
[52]101 mov WORD [bp+MENUINIT.wHighlightedItem], NO_ITEM_HIGHLIGHTED
[58]102.CancelMenuExit:
[41]103 stc
104 ret
105
106ALIGN JUMP_ALIGN
107.SelectItem:
[52]108 mov cx, [bp+MENUINIT.wHighlightedItem]
[41]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:
[178]130 xchg ah, al
131 cmp al, MENU_KEY_PGUP
[41]132 je SHORT .ChangeToPreviousPage
[178]133 cmp al, MENU_KEY_PGDN
[41]134 je SHORT .ChangeToNextPage
[178]135 cmp al, MENU_KEY_HOME
[41]136 je SHORT .SelectFirstItem
[178]137 cmp al, MENU_KEY_END
[41]138 je SHORT .SelectLastItem
139
[178]140 cmp al, MENU_KEY_UP
[41]141 je SHORT .DecrementSelectedItem
[178]142 cmp al, MENU_KEY_DOWN
[41]143 je SHORT .IncrementSelectedItem
144 clc ; Clear CF since keystroke not processed
[178]145 xchg ah, al
[41]146 ret
147
148ALIGN JUMP_ALIGN
149.ChangeToPreviousPage:
150 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
151 xchg ax, cx
152 neg ax
[52]153 mov cx, [bp+MENUINIT.wHighlightedItem]
[41]154 add cx, ax
155 jge SHORT .MoveHighlightedItemByAX ; No rotation for PgUp
156 ; Fall to .SelectFirstItem
157ALIGN JUMP_ALIGN
158.SelectFirstItem:
[52]159 mov ax, [bp+MENUINIT.wHighlightedItem]
[41]160 neg ax
161 jmp SHORT .MoveHighlightedItemByAX
162
163ALIGN JUMP_ALIGN
164.ChangeToNextPage:
165 call MenuScrollbars_GetMaxVisibleItemsOnPageToCX
166 xchg ax, cx
[52]167 mov cx, [bp+MENUINIT.wHighlightedItem]
[41]168 add cx, ax
169 cmp cx, [bp+MENUINIT.wItems]
170 jb SHORT .MoveHighlightedItemByAX ; No rotation for PgDn
171 ; Fall to .SelectLastItem
172ALIGN JUMP_ALIGN
173.SelectLastItem:
[178]174 stc
[41]175 mov ax, [bp+MENUINIT.wItems]
[178]176 sbb ax, [bp+MENUINIT.wHighlightedItem]
[41]177 jmp SHORT .MoveHighlightedItemByAX
178
179ALIGN JUMP_ALIGN
180.DecrementSelectedItem:
181 mov ax, -1
[178]182 SKIP2B cx ; mov cx, <next instruction>
[41]183.IncrementSelectedItem:
[178]184 mov al, 1 ; AH is already 0
[41]185ALIGN JUMP_ALIGN
186.MoveHighlightedItemByAX:
187 call MenuScrollbars_MoveHighlightedItemByAX
188 stc
189 ret
Note: See TracBrowser for help on using the repository browser.