source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenuEvent.asm @ 599

Last change on this file since 599 was 599, checked in by aitotat, 6 years ago

Hotkey bar is now updated and drawn from system timer tick handler 1Ch. This gives much more responsive key input and makes possible to implement some simple detection animation to show that system has not frozen.

File size: 9.1 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Boot Menu event handler for menu library callbacks.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; GetMenuitemToDXforDriveInDL
25;   Parameters:
26;       DL:     Drive number
27;   Returns:
28;       DX:     Menuitem index (assuming drive is available)
29;   Corrupts registers:
30;       AX
31;--------------------------------------------------------------------
32GetMenuitemToDXforDriveInDL:
33    xor     dh, dh                      ; Drive number now in DX
34    test    dl, dl
35    jns     SHORT .ReturnItemIndexInDX  ; Return if floppy drive (HD bit not set)
36    call    FloppyDrive_GetCountToAX
37    and     dl, ~80h                    ; Clear HD bit
38    add     dx, ax
39.ReturnItemIndexInDX:
40    ret
41
42
43;--------------------------------------------------------------------
44; BootMenuEvent_Handler
45;   Common parameters for all events:
46;       BX:         Menu event (anything from MENUEVENT struct)
47;       SS:BP:      Menu library handle
48;   Common return values for all events:
49;       CF:         Set if event processed
50;                   Cleared if event not processed
51;   Corrupts registers:
52;       All
53;--------------------------------------------------------------------
54BootMenuEvent_Handler:
55    LOAD_BDA_SEGMENT_TO es, di
56    call    RamVars_GetSegmentToDS
57
58%ifdef MENUEVENT_INLINE_OFFSETS
59
60    add     bx, FirstEvent
61    jmp     bx
62
63.EventNotHandled:
64.DoNotSetDefaultMenuitem:
65    xor     dx, dx      ; Clear CF (and menuitem index for DoNotSetDefaultMenuitem)
66    ret
67
68MENUEVENT_InitializeMenuinitFromDSSI    equ (EventInitializeMenuinitFromSSBP    - FirstEvent)
69MENUEVENT_ExitMenu                      equ (BootMenuEvent_Completed            - FirstEvent)
70MENUEVENT_ItemHighlightedFromCX         equ (EventItemHighlightedFromCX         - FirstEvent)
71MENUEVENT_KeyStrokeInAX                 equ (EventKeyStrokeInAX                 - FirstEvent)
72MENUEVENT_ItemSelectedFromCX            equ (EventItemSelectedFromCX            - FirstEvent)
73MENUEVENT_RefreshTitle                  equ (BootMenuPrint_TitleStrings         - FirstEvent)
74MENUEVENT_RefreshInformation            equ (BootMenuPrint_RefreshInformation   - FirstEvent)
75MENUEVENT_RefreshItemFromCX             equ (BootMenuPrint_RefreshItem          - FirstEvent)
76;
77; Note that there is no entry for MENUEVENT_IdleProcessing.  If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined,
78; then the entry point will not be called (saving memory on this end and at the CALL point).
79;
80
81%else
82
83    cmp     bx, BYTE MENUEVENT.RefreshItemFromCX    ; Above last supported item?
84    ja      SHORT .EventNotHandled
85    jmp     [cs:bx+rgfnEventSpecificHandlers]
86
87.EventNotHandled:
88.DoNotSetDefaultMenuitem:
89    xor     dx, dx      ; Clear CF (and menuitem index for DoNotSetDefaultMenuitem)
90    ret
91
92rgfnEventSpecificHandlers:
93    dw      EventInitializeMenuinitFromSSBP     ; MENUEVENT.InitializeMenuinitFromDSSI
94    dw      EventCompleted                      ; MENUEVENT.ExitMenu
95    dw      EventNotHandled                     ; MENUEVENT.IdleProcessing
96    dw      EventItemHighlightedFromCX          ; MENUEVENT.ItemHighlightedFromCX
97
98    dw      EventItemSelectedFromCX             ; MENUEVENT.ItemSelectedFromCX
99    dw      EventKeyStrokeInAX                  ; MENUEVENT.KeyStrokeInAX
100    dw      BootMenuPrint_TitleStrings          ; MENUEVENT.RefreshTitle
101    dw      BootMenuPrint_RefreshInformation    ; MENUEVENT.RefreshInformation
102    dw      BootMenuPrint_RefreshItem           ; MENUEVENT.RefreshItemFromCX
103
104%endif
105
106
107;--------------------------------------------------------------------
108; EventInitializeMenuinitFromSSBP
109;   Parameters
110;       DS:     Ptr to RAMVARS
111;       ES:     Ptr to BDA (zero)
112;       SS:BP:  Ptr to MENUINIT struct to initialize
113;   Returns:
114;       CF:     Set if event processed
115;               Cleared if event not processed
116;   Corrupts registers:
117;       Does not matter
118;--------------------------------------------------------------------
119FirstEvent:
120EventInitializeMenuinitFromSSBP:
121    ; Store number of Menuitems
122    call    RamVars_GetHardDiskCountFromBDAtoAX
123    xchg    ax, cx
124    call    FloppyDrive_GetCountToAX
125    add     ax, cx
126    inc     ax                              ; extra entry for ROM Boot item
127    mov     [bp+MENUINIT.wItems], ax
128
129    ; Store menu size
130    mov     WORD [bp+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
131    mov     BYTE [bp+MENUINIT.bWidth], BOOT_MENU_WIDTH
132    add     al, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
133    xchg    cx, ax
134    CALL_DISPLAY_LIBRARY    GetColumnsToALandRowsToAH
135    MIN_U   ah, cl
136    mov     [bp+MENUINIT.bHeight], ah
137
138    ; Store selection timeout
139    mov     ax, [cs:ROMVARS.wBootTimeout]
140    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
141
142    ; Store default Menuitem (=default drive to boot from)
143    eMOVZX  dx, [cs:ROMVARS.bBootDrv]
144    call    GetMenuitemToDXforDriveInDL
145    mov     [bp+MENUINIT.wHighlightedItem], dx
146
147    stc
148    ret
149
150
151;--------------------------------------------------------------------
152; EventItemHighlightedFromCX
153;   Parameters
154;       CX:     Index of new highlighted item
155;       DX:     Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
156;       DS:     Ptr to RAMVARS
157;       ES:     Ptr to BDA (zero)
158;       SS:BP:  Menu library handle
159;   Returns:
160;       CF:     Set if event processed
161;               Cleared if event not processed
162;   Corrupts registers:
163;       Does not matter
164;--------------------------------------------------------------------
165EventItemHighlightedFromCX:
166    push    cx
167
168    ; Drive number translations and hotkeys must be reset to defaults so highlighted
169    ; selections are correctly displayed on Hotkey Bar and on Boot Menu
170%ifdef MODULE_HOTKEYS
171    call    HotkeyBar_StoreDefaultDriveLettersToHotkeyVars
172%endif
173    call    DriveXlate_Reset
174
175    ; Set highlighted item to be drive to boot from for visual purposes only
176    call    BootMenu_GetDriveToDXforMenuitemInCX
177    jnc     SHORT .noDriveSwapSinceRomBootSelected
178    call    DriveXlate_SetDriveToSwap
179
180%ifdef MODULE_HOTKEYS
181    ; Store highlighted drive as hotkey
182    call    HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL
183    jmp     SHORT .UpdateHotkeyBar
184.noDriveSwapSinceRomBootSelected:
185    mov     ah, ROM_BOOT_HOTKEY_SCANCODE
186    call    HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
187
188.UpdateHotkeyBar:
189    ; Redraw Hotkey Bar for updated boot drive letters
190    mov     al, MONO_NORMAL
191    CALL_DISPLAY_LIBRARY    SetCharacterAttributeFromAL
192
193    mov     bl, ATTRIBUTES_ARE_USED
194    mov     ax, TELETYPE_OUTPUT_WITH_ATTRIBUTE
195    CALL_DISPLAY_LIBRARY    SetCharOutputFunctionFromAXwithAttribFlagInBL
196    call    HotkeyBar_DrawToTopOfScreen
197%else
198.noDriveSwapSinceRomBootSelected:
199%endif ; MODULE_HOTKEYS
200
201    ; Redraw changes in drive numbers
202    xor     ax, ax  ; Update first floppy drive (for translated drive number)
203    CALL_MENU_LIBRARY   RefreshItemFromAX
204    mov     dl, 80h
205    call    GetMenuitemToDXforDriveInDL
206    xchg    ax, dx  ; Update first hard disk (for translated drive number)
207    CALL_MENU_LIBRARY   RefreshItemFromAX
208    pop     ax      ; Update new item (for translated drive number)
209    CALL_MENU_LIBRARY   RefreshItemFromAX
210    CALL_MENU_LIBRARY   RefreshInformation
211    stc
212    ret
213
214
215;--------------------------------------------------------------------
216; EventKeyStrokeInAX
217;   Parameters
218;       AL:     ASCII character for the key
219;       AH:     Keyboard library scan code for the key
220;       DS:     Ptr to RAMVARS
221;       ES:     Ptr to BDA (zero)
222;       SS:BP:  Menu library handle
223;   Returns:
224;       CF:     Set if event processed
225;               Cleared if event not processed
226;   Corrupts registers:
227;       Does not matter
228;--------------------------------------------------------------------
229%ifdef MODULE_HOTKEYS
230EventKeyStrokeInAX:
231    ; Keypress will be the primary boot drive
232    cmp     ah, BOOT_MENU_HOTKEY_SCANCODE
233    je      SHORT BootMenuEvent_Completed   ; Ignore Boot Menu hotkey
234    call    HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
235    jnc     SHORT BootMenuEvent_Completed
236    ; Fall to CloseBootMenu through EventItemSelectedFromCX
237%endif
238
239
240;--------------------------------------------------------------------
241; EventItemSelectedFromCX
242;   Parameters
243;       CX:     Index of selected item
244;       DS:     Ptr to RAMVARS
245;       ES:     Ptr to BDA (zero)
246;       SS:BP:  Menu library handle
247;   Returns:
248;       CF:     Set if event processed
249;               Cleared if event not processed
250;   Corrupts registers:
251;       Does not matter
252;--------------------------------------------------------------------
253EventItemSelectedFromCX:
254    ; Fall to CloseBootMenu
255
256
257;--------------------------------------------------------------------
258; CloseBootMenu
259;   Parameters
260;       DS:     RAMVARS segment
261;       ES:     BDA segment (zero)
262;   Returns:
263;       Nothing
264;   Corrupts registers:
265;       Does not matter
266;--------------------------------------------------------------------
267CloseBootMenu:
268    CALL_MENU_LIBRARY   Close
269    ; Fall to BootMenuEvent_Completed
270
271
272;--------------------------------------------------------------------
273; BootMenuEvent_Completed
274;   Parameters
275;       Nothing
276;   Returns:
277;       CF:     Set to exit from menu
278;   Corrupts registers:
279;       Nothing
280;--------------------------------------------------------------------
281BootMenuEvent_Completed:
282    stc
283%ifndef MODULE_HOTKEYS
284EventKeyStrokeInAX:
285%endif
286    ret
Note: See TracBrowser for help on using the repository browser.