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

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