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

Last change on this file since 528 was 528, checked in by aitotat@…, 11 years ago

Changes to XTIDE Universal BIOS:

  • Swapping Floppy and Hard Drives at the same time work again (broke in r492).
  • Hotkeys again work in boot menu (broke in r492).
File size: 9.0 KB
RevLine 
[392]1; Project name  :   XTIDE Universal BIOS
2; Description   :   Boot Menu event handler for menu library callbacks.
3
4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[392]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.
[526]12;
[392]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
[526]16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
[392]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
[489]63.EventNotHandled:
64.DoNotSetDefaultMenuitem:
[392]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)
[528]71MENUEVENT_KeyStrokeInAX equ (EventKeyStrokeInAX - FirstEvent)
[392]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?
[489]84    ja      SHORT .EventNotHandled
[392]85    jmp     [cs:bx+rgfnEventSpecificHandlers]
86
[489]87.EventNotHandled:
88.DoNotSetDefaultMenuitem:
[392]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
[528]97   
[392]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;--------------------------------------------------------------------
[526]119FirstEvent:
[392]120EventInitializeMenuinitFromSSBP:
121    ; Store default Menuitem (=default drive to boot from)
[492]122    xor     dx, dx
[392]123    mov     [bp+MENUINIT.wHighlightedItem], dx
124
125    ; Store number of Menuitems
126    call    RamVars_GetHardDiskCountFromBDAtoAX
127    xchg    ax, cx
128    call    FloppyDrive_GetCountToAX
129    add     ax, cx
[492]130    inc     ax                              ; extra entry for ROM Boot item
[392]131    mov     [bp+MENUINIT.wItems], ax
[526]132
[392]133    ; Store menu size
134    mov     WORD [bp+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
135    mov     BYTE [bp+MENUINIT.bWidth], BOOT_MENU_WIDTH
136    add     al, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
137    xchg    cx, ax
138    CALL_DISPLAY_LIBRARY    GetColumnsToALandRowsToAH
139    MIN_U   ah, cl
140    mov     [bp+MENUINIT.bHeight], ah
141
142    ; Store selection timeout
143    mov     ax, [cs:ROMVARS.wBootTimeout]
144    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
145    stc
146    ret
147
148
149;--------------------------------------------------------------------
150; EventItemHighlightedFromCX
151;   Parameters
152;       CX:     Index of new highlighted item
153;       DX:     Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
154;       DS:     Ptr to RAMVARS
155;       ES:     Ptr to BDA (zero)
156;       SS:BP:  Menu library handle
157;   Returns:
158;       CF:     Set if event processed
159;               Cleared if event not processed
160;   Corrupts registers:
161;       Does not matter
162;--------------------------------------------------------------------
163EventItemHighlightedFromCX:
164    push    cx
[528]165
166    ; Drive number translations and hotkeys must be reset to defaults so highlighted
167    ; selections are correctly displayed on Hotkey Bar and on Boot Menu
168%ifdef MODULE_HOTKEYS
169    call    BootVars_StoreDefaultDriveLettersToHotkeyVars
170%endif
171    call    DriveXlate_Reset
172
173    ; Set highlighted item to be drive to boot from for visual purposes only
[526]174    call    BootMenu_GetDriveToDXforMenuitemInCX
[528]175    jnc     SHORT .noDriveSwapSinceRomBootSelected
[392]176    call    DriveXlate_SetDriveToSwap
[526]177
[528]178%ifdef MODULE_HOTKEYS
179    ; Store highlighted drive as hotkey
180    call    HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL
181    jmp     SHORT .UpdateHotkeyBar
182.noDriveSwapSinceRomBootSelected:
183    mov     ah, ROM_BOOT_HOTKEY_SCANCODE
184    call    HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
185
186.UpdateHotkeyBar:
187    ; Redraw Hotkey Bar for updated boot drive letters
188    mov     al, MONO_NORMAL
189    CALL_DISPLAY_LIBRARY    SetCharacterAttributeFromAL
190
191    mov     bl, ATTRIBUTES_ARE_USED
192    mov     ax, TELETYPE_OUTPUT_WITH_ATTRIBUTE
193    CALL_DISPLAY_LIBRARY    SetCharOutputFunctionFromAXwithAttribFlagInBL
194    call    HotkeyBar_DrawToTopOfScreen
195%else
196.noDriveSwapSinceRomBootSelected:
197%endif ; MODULE_HOTKEYS
198
[392]199    ; Redraw changes in drive numbers
200    xor     ax, ax  ; Update first floppy drive (for translated drive number)
201    CALL_MENU_LIBRARY   RefreshItemFromAX
202    mov     dl, 80h
203    call    GetMenuitemToDXforDriveInDL
204    xchg    ax, dx  ; Update first hard disk (for translated drive number)
205    CALL_MENU_LIBRARY   RefreshItemFromAX
206    pop     ax      ; Update new item (for translated drive number)
207    CALL_MENU_LIBRARY   RefreshItemFromAX
208    CALL_MENU_LIBRARY   RefreshInformation
209    stc
210    ret
211
[526]212
[392]213;--------------------------------------------------------------------
[528]214; EventKeyStrokeInAX
215;   Parameters
216;       AL:     ASCII character for the key
217;       AH:     Keyboard library scan code for the key
218;       DS:     Ptr to RAMVARS
219;       ES:     Ptr to BDA (zero)
220;       SS:BP:  Menu library handle
221;   Returns:
222;       CF:     Set if event processed
223;               Cleared if event not processed
224;   Corrupts registers:
225;       Does not matter
226;--------------------------------------------------------------------
227%ifdef MODULE_HOTKEYS
228EventKeyStrokeInAX:
229    ; Keypress will be the primary boot drive
230    cmp     ah, BOOT_MENU_HOTKEY_SCANCODE
231    je      SHORT BootMenuEvent_Completed   ; Ignore Boot Menu hotkey
232    call    HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
233    jnc     SHORT BootMenuEvent_Completed
234    ; Fall to CloseBootMenu through EventItemSelectedFromCX
235%endif
236
237
238;--------------------------------------------------------------------
[395]239; EventItemSelectedFromCX
[392]240;   Parameters
[395]241;       CX:     Index of selected item
[392]242;       DS:     Ptr to RAMVARS
243;       ES:     Ptr to BDA (zero)
244;       SS:BP:  Menu library handle
245;   Returns:
246;       CF:     Set if event processed
247;               Cleared if event not processed
248;   Corrupts registers:
249;       Does not matter
250;--------------------------------------------------------------------
[395]251EventItemSelectedFromCX:
[392]252    ; Fall to CloseBootMenu
253
254
255;--------------------------------------------------------------------
256; CloseBootMenu
257;   Parameters
258;       DS:     RAMVARS segment
259;       ES:     BDA segment (zero)
260;   Returns:
261;       Nothing
262;   Corrupts registers:
263;       Does not matter
264;--------------------------------------------------------------------
265CloseBootMenu:
266    CALL_MENU_LIBRARY   Close
267    ; Fall to BootMenuEvent_Completed
268
[526]269
[392]270;--------------------------------------------------------------------
271; BootMenuEvent_Completed
272;   Parameters
273;       Nothing
274;   Returns:
275;       CF:     Set to exit from menu
276;   Corrupts registers:
277;       Nothing
278;--------------------------------------------------------------------
279BootMenuEvent_Completed:
280    stc
[528]281%ifndef MODULE_HOTKEYS
282EventKeyStrokeInAX:
283%endif
[392]284    ret
Note: See TracBrowser for help on using the repository browser.