source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm@ 87

Last change on this file since 87 was 28, checked in by Tomi Tilli, 14 years ago
  • v1.1.1 broke booting from foreign drives, it is now fixed.
  • Improved error handling a bit.
  • Longer DRQ and IRQ timeouts to minimize write timouts with some (bad) CF cards.
  • Default boot menu drive should now be properly selected.
File size: 8.7 KB
Line 
1; File name : BootMenuEvent.asm
2; Project name : IDE BIOS
3; Created date : 26.3.2010
4; Last update : 1.4.2010
5; Author : Tomi Tilli
6; Description : Boot Menu event handler for menu library callbacks.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Boot Menu event handler.
13;
14; BootMenuEvent_Handler
15; Parameters:
16; BX: Callback event
17; CX: Menuitem index (usually index of selected Menuitem)
18; DX: Event parameter (event specific)
19; SS:BP: Ptr to MENUVARS
20; Returns:
21; AH: Event specific or unused. Set to 0 if unused.
22; AL: 1=Event processed
23; 0=Event not processed (default action if any)
24; Corrupts registers:
25; BX, CX, DX
26;--------------------------------------------------------------------
27ALIGN JUMP_ALIGN
28BootMenuEvent_Handler:
29 push es
30 push ds
31 push di
32 push si
33
34 xor ax, ax ; Event not processed
35 cmp bx, BYTE EVNT_MNU_GETDEF ; Event in jump table?
36 ja SHORT .Return
37 shl bx, 1
38 call [cs:bx+.rgwEventJmp]
39.Return:
40 pop si
41 pop di
42 pop ds
43 pop es
44 ret
45ALIGN WORD_ALIGN
46.rgwEventJmp:
47 dw BootMenuEvent_Exit ; 0, EVNT_MNU_EXIT (Menu will quit)
48 dw BootMenuEvent_EventItemSelectionChanged ; 1, EVNT_MMU_SELCHG (Menuitem selection changed (with arrows))
49 dw BootMenuEvent_EventItemSelected ; 2, EVNT_MNU_SELSET (Menuitem selected (with Enter))
50 dw BootMenuEvent_EventKeyPressed ; 3, EVNT_MNU_KEY (Keyboard key pressed)
51 dw BootMenuEvent_EventMenuDraw ; 4, EVNT_MNU_UPD (Menu needs to be updated)
52 dw BootMenuEvent_EventGetDefaultMenuitem ; 5, EVNT_MNU_GETDEF (Request menuitem to be selected by default)
53
54
55;--------------------------------------------------------------------
56; Boot Menu event handler.
57; Handles Menu Exit notification (EVNT_MNU_EXIT).
58;
59; BootMenuEvent_Exit
60; Parameters:
61; SS:BP: Ptr to MENUVARS
62; Returns:
63; AH: 1 to cancel exit
64; 0 to allow menu exit
65; AL: 1 = Event processed
66; Corrupts registers:
67; Nothing
68;--------------------------------------------------------------------
69ALIGN JUMP_ALIGN
70BootMenuEvent_Exit:
71 mov ax, 1 ; Event handled
72 ret
73
74
75;--------------------------------------------------------------------
76; Boot Menu event handler.
77; Handles Menuitem Selection Changed notification (EVNT_MMU_SELCHG).
78;
79; BootMenuEvent_EventItemSelectionChanged
80; Parameters:
81; CX: Index of selected Menuitem
82; SS:BP: Ptr to MENUVARS
83; Returns:
84; AX: 1 = Event processed
85; Corrupts registers:
86; BX, CX, DX, DI
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89BootMenuEvent_EventItemSelectionChanged:
90 call RamVars_GetSegmentToDS
91 call DriveXlate_Reset
92 call BootMenu_ConvertMenuitemToDriveOrFunction
93 jc SHORT BootMenuEvent_UpdateAllMenuitems ; Selection changed to a function
94 call DriveXlate_SetDriveToSwap
95 ; Fall to BootMenuEvent_UpdateAllMenuitems
96
97;--------------------------------------------------------------------
98; Redraws all menuitems.
99;
100; BootMenuEvent_UpdateAllMenuitems
101; Parameters:
102; SS:BP: Ptr to MENUVARS
103; Returns:
104; AX: 1 = Event processed
105; Corrupts registers:
106; BX, CX, DX
107;--------------------------------------------------------------------
108ALIGN JUMP_ALIGN
109BootMenuEvent_UpdateAllMenuitems:
110 mov cx, -1 ; Update all items
111 mov dl, MFL_UPD_ITEM | MFL_UPD_NFO | MFL_UPD_NOCLEAR
112 call Menu_Invalidate
113 mov ax, 1 ; Event handled
114 ret
115
116
117;--------------------------------------------------------------------
118; Boot Menu event handler.
119; Handles Menuitem Selected notification (EVNT_MNU_SELSET).
120;
121; BootMenuEvent_EventItemSelected
122; Parameters:
123; CX: Index of selected Menuitem
124; SS:BP: Ptr to MENUVARS
125; Returns:
126; AX: 1 = Event processed
127; Corrupts registers:
128; BX, CX, DX
129;--------------------------------------------------------------------
130ALIGN JUMP_ALIGN
131BootMenuEvent_EventItemSelected:
132 call Menu_Exit ; Exit from menu
133 mov ax, 1 ; Event handled
134 ret
135
136
137;--------------------------------------------------------------------
138; Boot Menu event handler.
139; Handles Key pressed notification (EVNT_MNU_KEY).
140;
141; BootMenuEvent_EventKeyPressed
142; Parameters:
143; CX: Index of currently selected Menuitem
144; DL: ASCII character
145; DH: BIOS Scan Code
146; SS:BP: Ptr to MENUVARS
147; Returns:
148; AX: 1 = Event processed
149; Corrupts registers:
150; BX, CX, DX, DS
151;--------------------------------------------------------------------
152ALIGN JUMP_ALIGN
153BootMenuEvent_EventKeyPressed:
154 mov al, dl ; Copy ASCII char to AL
155 sub al, 'a'-'A' ; To upper case character
156 cmp al, 'A' ; First possible drive letter?
157 jb SHORT .Return ; If below, return
158 cmp al, 'Z' ; Last possible drive letter?
159 ja SHORT .Return ; If above, return
160 LOAD_BDA_SEGMENT_TO ds, dx
161 mov [BOOTVARS.bMenuHotkey], al
162 jmp SHORT BootMenuEvent_EventItemSelected
163.Return:
164 mov ax, 1
165 ret
166
167
168;--------------------------------------------------------------------
169; Boot Menu event handler.
170; Handles Menu Update notification (EVNT_MNU_UPD).
171;
172; BootMenuEvent_EventMenuDraw
173; Parameters:
174; CX: Index of Menuitem to update (if MFL_UPD_ITEM set)
175; DL: Update flag (only one):
176; MFL_UPD_TITLE Update Menu Title string(s)
177; MFL_UPD_NFO Update Menu Info string(s)
178; MFL_UPD_ITEM Update Menuitem string
179; SS:BP: Ptr to MENUVARS
180; Returns:
181; AX: Was event processed
182; Corrupts registers:
183; BX, CX, DX, SI, DI, DS
184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
186BootMenuEvent_EventMenuDraw:
187 test dl, MFL_UPD_ITEM ; Need to update Menuitem?
188 jnz SHORT BootMenuEvent_DrawMenuitem
189 test dl, MFL_UPD_NFO ; Need to update Info String(s)?
190 jnz SHORT BootMenuEvent_DrawInfo
191 test dl, MFL_UPD_TITLE ; Need to update Title String(s)?
192 jnz SHORT BootMenuEvent_DrawTitle
193 xor ax, ax
194 ret
195
196;--------------------------------------------------------------------
197; Draws Menuitem string. Cursor is set to a menuitem location.
198;
199; BootMenuEvent_DrawMenuitem
200; Parameters:
201; CX: Index of Menuitem to draw
202; SS:BP: Ptr to MENUVARS
203; Returns:
204; AX: Was event processed
205; Corrupts registers:
206; BX, CX, DX, SI, DI, DS, ES
207;--------------------------------------------------------------------
208ALIGN JUMP_ALIGN
209BootMenuEvent_DrawMenuitem:
210 call RamVars_GetSegmentToDS
211 call BootMenu_ConvertMenuitemToDriveOrFunction
212 jc SHORT .DrawFunctionItem
213 call BootMenuPrint_TranslatedDriveNumber
214 test dl, 80h ; Floppy drive?
215 jz SHORT .DrawFloppyDriveItem
216 jmp BootMenuPrint_HardDiskMenuitem
217ALIGN JUMP_ALIGN
218.DrawFunctionItem:
219 jmp BootMenuPrint_FunctionMenuitem
220ALIGN JUMP_ALIGN
221.DrawFloppyDriveItem:
222 jmp BootMenuPrint_FloppyMenuitem
223
224;--------------------------------------------------------------------
225; Draws information strings. Cursor is set to a first information line.
226;
227; BootMenuEvent_DrawInfo
228; Parameters:
229; CX: Index of selected menuitem
230; SS:BP: Ptr to MENUVARS
231; Returns:
232; AX: Was event processed
233; Corrupts registers:
234; BX, CX, DX, SI, DI, DS, ES
235;--------------------------------------------------------------------
236ALIGN JUMP_ALIGN
237BootMenuEvent_DrawInfo:
238 call RamVars_GetSegmentToDS
239 call BootMenu_ConvertMenuitemToDriveOrFunction
240 jc SHORT .DrawFunctionInfo
241 test dl, 80h ; Floppy drive?
242 jz SHORT .DrawFloppyDriveInfo
243 jmp BootMenuPrint_HardDiskMenuitemInformation
244ALIGN JUMP_ALIGN
245.DrawFunctionInfo:
246 jmp BootMenuPrint_FunctionMenuitemInformation
247ALIGN JUMP_ALIGN
248.DrawFloppyDriveInfo:
249 jmp BootMenuPrint_FloppyMenuitemInformation
250
251;--------------------------------------------------------------------
252; Draws title strings. Cursor is set to a first title line.
253;
254; BootMenuEvent_DrawTitle
255; Parameters:
256; SS:BP: Ptr to MENUVARS
257; Returns:
258; AX: Was event processed
259; Corrupts registers:
260; CX, DX, SI
261;--------------------------------------------------------------------
262ALIGN JUMP_ALIGN
263BootMenuEvent_DrawTitle:
264 jmp BootMenuPrint_TitleStrings
265
266
267;--------------------------------------------------------------------
268; Boot Menu event handler.
269; Handles Get Default Menuitem notification (EVNT_MNU_GETDEF).
270;
271; BootMenuEvent_EventGetDefaultMenuitem
272; Parameters:
273; SS:BP: Ptr to MENUVARS
274; Returns:
275; AX: Was event processed
276; CX: Index of menuitem to set selected
277; Corrupts registers:
278; BX, CX, DX, DI, DS
279;--------------------------------------------------------------------
280ALIGN JUMP_ALIGN
281BootMenuEvent_EventGetDefaultMenuitem:
282 call RamVars_GetSegmentToDS
283 mov dl, [cs:ROMVARS.bBootDrv] ; Default boot drive
284 call BootMenu_IsDriveInSystem
285 jnc SHORT .DoNotSetDefaultMenuitem
286 call DriveXlate_SetDriveToSwap
287 call BootMenu_ConvertDriveToMenuitem
288 mov ax, 1
289 ret
290ALIGN JUMP_ALIGN
291.DoNotSetDefaultMenuitem:
292 xor ax, ax
293 ret
Note: See TracBrowser for help on using the repository browser.