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

Last change on this file since 230 was 212, checked in by gregli@…, 13 years ago

Fixed a bug where DL was always zero when transitioning control to the MBR (boot sector), where it should have been the drive number. This was preventing FreeDOS from booting. Also took the opportunity to fold two code paths together, jump to boot sector and jump to rom boot, resulting in a savings of 20 bytes for the XT build.

File size: 6.5 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Boot Menu event handler for menu library callbacks.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; BootMenuEvent_Handler
9; Common parameters for all events:
10; BX: Menu event (anything from MENUEVENT struct)
11; SS:BP: Menu library handle
12; Common return values for all events:
13; CF: Set if event processed
14; Cleared if event not processed
15; Corrupts registers:
16; All
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19BootMenuEvent_Handler:
20
21%ifdef MENUEVENT_INLINE_OFFSETS
22
23 add bx, BootMenuEvent_Handler
24 jmp bx
25
26MENUEVENT_InitializeMenuinitFromDSSI equ (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler)
27MENUEVENT_ExitMenu equ (BootMenuEvent_Handler.EventCompleted - BootMenuEvent_Handler)
28MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler)
29MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler)
30MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler)
31MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler)
32MENUEVENT_RefreshInformation equ (BootMenuEvent_Handler.RefreshInformation - BootMenuEvent_Handler)
33MENUEVENT_RefreshItemFromCX equ (BootMenuEvent_Handler.RefreshItemFromCX - BootMenuEvent_Handler)
34;
35; Note that there is no entry for MENUEVENT_IdleProcessing. If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined,
36; then the entry point will not be called (saving memory on this end and at the CALL point).
37;
38
39%else
40
41 cmp bx, BYTE MENUEVENT.RefreshItemFromCX ; Above last supported item?
42 ja SHORT .EventNotHandled
43 jmp [cs:bx+.rgfnEventSpecificHandlers]
44
45.EventNotHandled:
46 clc
47 ret
48
49ALIGN WORD_ALIGN
50.rgfnEventSpecificHandlers:
51 dw .InitializeMenuinitFromDSSI ; MENUEVENT.InitializeMenuinitFromDSSI
52 dw .EventCompleted ; MENUEVENT.ExitMenu
53 dw .EventNotHandled ; MENUEVENT.IdleProcessing
54 dw .ItemHighlightedFromCX ; MENUEVENT.ItemHighlightedFromCX
55 dw .ItemSelectedFromCX ; MENUEVENT.ItemSelectedFromCX
56 dw .KeyStrokeInAX ; MENUEVENT.KeyStrokeInAX
57 dw BootMenuPrint_TitleStrings ; MENUEVENT.RefreshTitle
58 dw .RefreshInformation ; MENUEVENT.RefreshInformation
59 dw .RefreshItemFromCX ; MENUEVENT.RefreshItemFromCX
60
61%endif
62
63
64; Parameters:
65; DS:SI: Ptr to MENUINIT struct to initialize
66; Returns:
67; DS:SI: Ptr to initialized MENUINIT struct
68ALIGN JUMP_ALIGN
69.InitializeMenuinitFromDSSI:
70 push ds
71 call RamVars_GetSegmentToDS
72 call .GetDefaultMenuitemToDX
73 call BootMenu_GetMenuitemCountToAX
74 pop ds
75 mov [si+MENUINIT.wItems], ax
76 mov [si+MENUINIT.wHighlightedItem], dx
77 mov WORD [si+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
78 mov BYTE [si+MENUINIT.bWidth], BOOT_MENU_WIDTH
79 call BootMenu_GetHeightToAHwithItemCountInAL
80 mov [si+MENUINIT.bHeight], ah
81 mov ax, [cs:ROMVARS.wBootTimeout]
82 CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
83 stc
84 ret
85
86ALIGN JUMP_ALIGN
87.GetDefaultMenuitemToDX:
88 mov dl, [cs:ROMVARS.bBootDrv] ; Default boot drive
89 call BootMenu_IsDriveInSystem
90 jnc SHORT .DoNotSetDefaultMenuitem
91 call DriveXlate_SetDriveToSwap
92 jmp BootMenu_GetMenuitemToDXforDriveInDL
93ALIGN JUMP_ALIGN
94.DoNotSetDefaultMenuitem:
95 xor dx, dx ; Whatever appears first on boot menu
96 ret
97
98
99; Parameters:
100; CX: Index of new highlighted item
101; DX: Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
102ALIGN JUMP_ALIGN
103.ItemHighlightedFromCX:
104 push cx
105 call RamVars_GetSegmentToDS
106 call DriveXlate_Reset
107 call BootMenu_GetDriveToDXforMenuitemInCX
108 call DriveXlate_SetDriveToSwap
109
110 xor ax, ax ; Update first floppy drive (for translated drive number)
111 CALL_MENU_LIBRARY RefreshItemFromAX
112 mov dl, 80h
113 call BootMenu_GetMenuitemToDXforDriveInDL
114 xchg ax, dx ; Update first hard disk (for translated drive number)
115 CALL_MENU_LIBRARY RefreshItemFromAX
116 pop ax ; Update new item (for translated drive number)
117 CALL_MENU_LIBRARY RefreshItemFromAX
118 CALL_MENU_LIBRARY RefreshInformation
119 stc
120 ret
121
122
123; Parameters:
124; AL: ASCII character for the key
125; AH: Keyboard library scan code for the key
126ALIGN JUMP_ALIGN
127.KeyStrokeInAX:
128 cmp ah, ROM_BOOT_HOTKEY_SCANCODE
129 jne SHORT .CheckDriveHotkeys
130 ;; NOTE: carry flag will be clear after compare above that resulted in zero
131 jmp Int19hMenu_JumpToBootSector_or_RomBoot
132ALIGN JUMP_ALIGN
133.CheckDriveHotkeys:
134 call BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
135 cmp ax, [bp+MENUINIT.wItems]
136 jae SHORT .EventCompleted ; Invalid key
137 CALL_MENU_LIBRARY HighlightItemFromAX
138 ; Fall to .ItemSelectedFromCX
139
140
141; Parameters:
142; CX: Index of selected item
143ALIGN JUMP_ALIGN
144.ItemSelectedFromCX:
145 CALL_MENU_LIBRARY Close
146.EventCompleted:
147 stc
148 ret
149
150
151; Parameters:
152; CX: Index of item to refresh
153; Cursor has been positioned to the beginning of item line
154ALIGN JUMP_ALIGN
155.RefreshItemFromCX:
156 xor bl, bl ; will result in SF being clear in .RefreshItemOrInformation...
157 SKIP2B dx ; dx corrupted below by BootMenu_GetDriveToDXforMenuitemInCX
158 ; Fall to .RefreshInformation
159
160; Parameters:
161; CX: Index of highlighted item
162; Cursor has been positioned to the beginning of first line
163; NO ALIGN - in the shadow of SKIP2B
164.RefreshInformation:
165 mov bl,040h ; will result in SF being set in .RefreshItemOrInformation...
166 ; Fall to .RefreshItemOrInformationWithJumpTableInCSBX
167
168;--------------------------------------------------------------------
169; RefreshItemOrInformationWithJumpTableInCSBX
170; Parameters:
171; CX: Index of selected menuitem
172; CS:BX: Ptr to ITEM_TYPE_REFRESH jump table
173; Returns:
174; CF: set since event processed
175;--------------------------------------------------------------------
176.RefreshItemOrInformationWithJumpTableInCSBX:
177 cmp cl, NO_ITEM_HIGHLIGHTED
178 je SHORT .EventCompleted
179
180 call RamVars_GetSegmentToDS
181 call BootMenu_GetDriveToDXforMenuitemInCX
182 or bl,dl ; or drive number with bit from .RefreshItemFromCX or .RefreshInformation
183 shl bl,1 ; drive letter high order bit to CF, Item/Information bit to SF
184 jc SHORT BootMenuPrint_HardDiskMenuitem
185 ; fall through to BootMenuEvent_FallThroughToFloppyMenuitem
186
187;;;
188;;; Fall-through (to BootMenuPrint_FloppyMenuitem)
189;;; (checked at assembler time with the code after BootMenuPrint_FloppyMenuitem)
190;;;
191ALIGN JUMP_ALIGN
192BootMenuEvent_FallThroughToFloppyMenuitem:
193 ; fall through to BootMenuPrint_FloppyMenuitem
Note: See TracBrowser for help on using the repository browser.