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

Last change on this file since 133 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.