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

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

Separated MODULE_8BIT_IDE into the basic part used by XTIDE rev 1 and rev 2 which is PIO based, and MODULE_8BIT_IDE_ADVANCED for JRIDE and XTCF support which requires memory mapping and/or DMA. This allows for creating an 8KB image with boot menu support (but no hotkeys) for the XTIDE rev 1. Cleaned up how we reset the drive translation information, ensuring it is properly set between boot attempt on a primary and secondary drive - as a result we clean it when needed, rather than trying to always keep it clean. Also fixed translation bugs in int13h.asm where I had previously missed converting some MODULE_HOTKEYS into MODULE_DRIVEXLATE.

File size: 7.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-2012 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_ItemSelectedFromCX equ (EventItemSelectedFromCX - FirstEvent)
72MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - FirstEvent)
73MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - FirstEvent)
74MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - FirstEvent)
75;
76; Note that there is no entry for MENUEVENT_IdleProcessing.  If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined,
77; then the entry point will not be called (saving memory on this end and at the CALL point).
78;
79
80%else
81
82    cmp     bx, BYTE MENUEVENT.RefreshItemFromCX    ; Above last supported item?
83    ja      SHORT .EventNotHandled
84    jmp     [cs:bx+rgfnEventSpecificHandlers]
85
86.EventNotHandled:
87.DoNotSetDefaultMenuitem:
88    xor     dx, dx      ; Clear CF (and menuitem index for DoNotSetDefaultMenuitem)
89    ret
90
91rgfnEventSpecificHandlers:
92    dw      EventInitializeMenuinitFromSSBP     ; MENUEVENT.InitializeMenuinitFromDSSI
93    dw      EventCompleted                      ; MENUEVENT.ExitMenu
94    dw      EventNotHandled                     ; MENUEVENT.IdleProcessing
95    dw      EventItemHighlightedFromCX          ; MENUEVENT.ItemHighlightedFromCX
96    dw      EventItemSelectedFromCX             ; MENUEVENT.ItemSelectedFromCX
97    dw      EventKeyStrokeInAX                  ; MENUEVENT.KeyStrokeInAX
98    dw      BootMenuPrint_TitleStrings          ; MENUEVENT.RefreshTitle
99    dw      BootMenuPrint_RefreshInformation    ; MENUEVENT.RefreshInformation
100    dw      BootMenuPrint_RefreshItem           ; MENUEVENT.RefreshItemFromCX
101
102%endif
103
104
105;--------------------------------------------------------------------
106; EventInitializeMenuinitFromSSBP
107;   Parameters
108;       DS:     Ptr to RAMVARS
109;       ES:     Ptr to BDA (zero)
110;       SS:BP:  Ptr to MENUINIT struct to initialize
111;   Returns:
112;       CF:     Set if event processed
113;               Cleared if event not processed
114;   Corrupts registers:
115;       Does not matter
116;--------------------------------------------------------------------
117FirstEvent: 
118EventInitializeMenuinitFromSSBP:
119    ; Store default Menuitem (=default drive to boot from)
120    xor     dx, dx
121    mov     [bp+MENUINIT.wHighlightedItem], dx
122
123    ; Store number of Menuitems
124    call    RamVars_GetHardDiskCountFromBDAtoAX
125    xchg    ax, cx
126    call    FloppyDrive_GetCountToAX
127    add     ax, cx
128    inc     ax                              ; extra entry for ROM Boot item
129    mov     [bp+MENUINIT.wItems], ax
130               
131    ; Store menu size
132    mov     WORD [bp+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
133    mov     BYTE [bp+MENUINIT.bWidth], BOOT_MENU_WIDTH
134    add     al, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
135    xchg    cx, ax
136    CALL_DISPLAY_LIBRARY    GetColumnsToALandRowsToAH
137    MIN_U   ah, cl
138    mov     [bp+MENUINIT.bHeight], ah
139
140    ; Store selection timeout
141    mov     ax, [cs:ROMVARS.wBootTimeout]
142    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
143    stc
144    ret
145
146
147;--------------------------------------------------------------------
148; EventItemHighlightedFromCX
149;   Parameters
150;       CX:     Index of new highlighted item
151;       DX:     Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
152;       DS:     Ptr to RAMVARS
153;       ES:     Ptr to BDA (zero)
154;       SS:BP:  Menu library handle
155;   Returns:
156;       CF:     Set if event processed
157;               Cleared if event not processed
158;   Corrupts registers:
159;       Does not matter
160;--------------------------------------------------------------------
161EventItemHighlightedFromCX:
162    push    cx
163    call    BootMenu_GetDriveToDXforMenuitemInCX       
164    jnc     .noDriveSwap       
165    call    DriveXlate_SetDriveToSwap
166.noDriveSwap:   
167       
168    ; Redraw changes in drive numbers
169    xor     ax, ax  ; Update first floppy drive (for translated drive number)
170    CALL_MENU_LIBRARY   RefreshItemFromAX
171    mov     dl, 80h
172    call    GetMenuitemToDXforDriveInDL
173    xchg    ax, dx  ; Update first hard disk (for translated drive number)
174    CALL_MENU_LIBRARY   RefreshItemFromAX
175    pop     ax      ; Update new item (for translated drive number)
176    CALL_MENU_LIBRARY   RefreshItemFromAX
177    CALL_MENU_LIBRARY   RefreshInformation
178    stc
179    ret
180
181       
182;--------------------------------------------------------------------
183; EventItemSelectedFromCX
184;   Parameters
185;       CX:     Index of selected item
186;       DS:     Ptr to RAMVARS
187;       ES:     Ptr to BDA (zero)
188;       SS:BP:  Menu library handle
189;   Returns:
190;       CF:     Set if event processed
191;               Cleared if event not processed
192;   Corrupts registers:
193;       Does not matter
194;--------------------------------------------------------------------
195EventItemSelectedFromCX:
196    ; Fall to CloseBootMenu
197
198
199;--------------------------------------------------------------------
200; CloseBootMenu
201;   Parameters
202;       DS:     RAMVARS segment
203;       ES:     BDA segment (zero)
204;   Returns:
205;       Nothing
206;   Corrupts registers:
207;       Does not matter
208;--------------------------------------------------------------------
209CloseBootMenu:
210    CALL_MENU_LIBRARY   Close
211    ; Fall to BootMenuEvent_Completed
212
213       
214;--------------------------------------------------------------------
215; BootMenuEvent_Completed
216;   Parameters
217;       Nothing
218;   Returns:
219;       CF:     Set to exit from menu
220;   Corrupts registers:
221;       Nothing
222;--------------------------------------------------------------------
223BootMenuEvent_Completed:
224    stc
225    ret
Note: See TracBrowser for help on using the repository browser.