source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenu.asm@ 89

Last change on this file since 89 was 88, checked in by Tomi Tilli, 14 years ago

Changes to XTIDE Universal BIOS:

  • Now uses new libraries (untested)
  • Non-working since code size is too large
File size: 7.6 KB
RevLine 
[88]1; Project name : XTIDE Universal BIOS
[3]2; Description : Displays Boot Menu.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Displays Boot Menu and returns Drive or Function number.
9;
10; BootMenu_DisplayAndReturnSelection
11; Parameters:
12; DS: RAMVARS segment
13; Returns:
14; DX: Untranslated drive number to be used for booting (if CF cleared)
15; Function number (if CF set)
16; CF: Cleared if drive selected
17; Set if function selected
18; Corrupts registers:
19; All General Purpose Registers
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22BootMenu_DisplayAndReturnSelection:
23 call DriveXlate_Reset
24 call BootMenuPrint_TheBottomOfScreen
25 call BootMenu_Enter ; Get selected menuitem index to CX
26 call BootMenuPrint_ClearScreen
[88]27 cmp cx, BYTE NO_ITEM_SELECTED
28 je SHORT BootMenu_DisplayAndReturnSelection
[3]29 jmp BootMenu_ConvertMenuitemToDriveOrFunction
[88]30
31
32;--------------------------------------------------------------------
33; Enters Boot Menu or submenu.
34;
35; BootMenu_Enter
36; Parameters:
37; Nothing
38; Returns:
39; CX: Index of selected item or NO_ITEM_SELECTED
40; Corrupts registers:
41; BX, DI
42;--------------------------------------------------------------------
[3]43ALIGN JUMP_ALIGN
[88]44BootMenu_Enter:
45 mov bx, BootMenuEvent_Handler
46 CALL_MENU_LIBRARY DisplayWithHandlerInBXandUserDataInDXAX
47 xchg cx, ax
[3]48 ret
49
50
51;--------------------------------------------------------------------
52; Returns number of menuitems in Boot Menu.
53;
[88]54; BootMenu_GetMenuitemCountToCX
[3]55; Parameters:
56; DS: RAMVARS segment
57; Returns:
58; CX: Number of boot menu items
59; Corrupts registers:
60; AX
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
[88]63BootMenu_GetMenuitemCountToCX:
[32]64 call RamVars_GetHardDiskCountFromBDAtoCX
65 xchg ax, cx
[3]66 call FloppyDrive_GetCount
67 add ax, cx
68 call BootMenu_GetMenuFunctionCount
69 add cx, ax
70 ret
71
72;--------------------------------------------------------------------
73; Returns number of functions displayed in Boot Menu.
74;
75; BootMenu_GetMenuFunctionCount
76; Parameters:
77; Nothing
78; Returns:
79; CX: Number of boot menu functions
80; Corrupts registers:
81; Nothing
82;--------------------------------------------------------------------
83ALIGN JUMP_ALIGN
84BootMenu_GetMenuFunctionCount:
85 xor cx, cx
86 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_ROMBOOT
87 jz SHORT .DontIncludeRomBoot
88 inc cx
89ALIGN JUMP_ALIGN
90.DontIncludeRomBoot:
91 ret
92
93
94;--------------------------------------------------------------------
[88]95; BootMenu_GetHeightToALwithItemCountInCL
[3]96; Parameters:
[88]97; CL: Number of menuitems
[3]98; Returns:
[88]99; AH: Boot menu height
[3]100; Corrupts registers:
[88]101; AL, CL, DI
[3]102;--------------------------------------------------------------------
103ALIGN JUMP_ALIGN
[88]104BootMenu_GetHeightToAHwithItemCountInCL:
105 add cl, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
106 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
107 MIN_U ah, cl
[3]108 ret
109
110
111;--------------------------------------------------------------------
112; Converts any hotkey to Boot Menu menuitem index.
113;
114; BootMenu_ConvertHotkeyToMenuitem
115; Parameters:
116; AX: ASCII hotkey starting from upper case 'A'
117; Returns:
118; CX: Menuitem index
119; Corrupts registers:
120; AX
121;--------------------------------------------------------------------
122ALIGN JUMP_ALIGN
123BootMenu_ConvertHotkeyToMenuitem:
124 call BootMenu_GetLetterForFirstHardDisk
125 cmp al, cl ; Letter is for Hard Disk?
126 jae SHORT .StartFromHardDiskLetter
127 sub al, 'A' ; Letter to Floppy Drive menuitem
128 xchg ax, cx ; Menuitem index to CX
129 ret
130ALIGN JUMP_ALIGN
131.StartFromHardDiskLetter:
132 sub al, cl ; Hard Disk index
133 call FloppyDrive_GetCount
134 add cx, ax ; Menuitem index
135 ret
136
137;--------------------------------------------------------------------
138; Returns letter for first hard disk. Usually it will be 'c' but it
139; can be higher if more than two floppy drives are found.
140;
141; BootMenu_GetLetterForFirstHardDisk
142; Parameters:
143; Nothing
144; Returns:
145; CL: Upper case letter for first hard disk
146; Corrupts registers:
147; CH
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150BootMenu_GetLetterForFirstHardDisk:
151 call FloppyDrive_GetCount
152 add cl, 'A'
153 MAX_U cl, 'C'
154 ret
155
156
157;--------------------------------------------------------------------
158; Converts selected menuitem index to drive number or function ID.
159;
160; BootMenu_ConvertMenuitemToDriveOrFunction
161; Parameters:
162; CX: Index of menuitem selected from Boot Menu
163; DS: RAMVARS segment
164; Returns:
165; DX: Drive number to be used for booting (if CF cleared)
166; Function ID (if CF set)
167; CF: Cleared if drive selected
168; Set if function selected
169; Corrupts registers:
170; AX, CX
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173BootMenu_ConvertMenuitemToDriveOrFunction:
174 mov dx, cx ; Copy menuitem index to DX
175 call FloppyDrive_GetCount
176 cmp dx, cx ; Floppy drive?
177 jb SHORT .ReturnFloppyDriveInDX
178 sub dx, cx ; Remove floppy drives from index
[32]179 call RamVars_GetHardDiskCountFromBDAtoCX
[3]180 cmp dx, cx ; Hard disk?
181 jb SHORT .ReturnHardDiskInDX
182 sub dx, cx ; Remove hard disks from index
183 jmp SHORT BootMenu_ConvertFunctionIndexToID
184ALIGN JUMP_ALIGN
185.ReturnHardDiskInDX:
186 or dl, 80h
187ALIGN JUMP_ALIGN
188.ReturnFloppyDriveInDX:
189 clc
190 ret
191
192
193;--------------------------------------------------------------------
194; Converts selected menuitem index to drive number or function ID.
195;
196; BootMenu_ConvertFunctionIndexToID
197; Parameters:
198; CX: Menuitem index
199; DX: Function index (Menuitem index - floppy count - HD count)
200; Returns:
201; DX: Function ID
202; CF: Set to indicate function
203; Corrupts registers:
204; AX, CX
205;--------------------------------------------------------------------
206ALIGN JUMP_ALIGN
207BootMenu_ConvertFunctionIndexToID:
208 mov dx, ID_BOOTFUNC_ROMBOOT
209 stc
210 ret
211
212
213;--------------------------------------------------------------------
214; Converts Floppy or Hard Disk Drive number to menuitem index.
215; This function does not check does the drive really exists.
216;
217; BootMenu_ConvertDriveToMenuitem
218; Parameters:
219; DL: Drive number
220; Returns:
221; CX: Menuitem index (assuming drive is available)
222; Corrupts registers:
223; AX
224;--------------------------------------------------------------------
225ALIGN JUMP_ALIGN
226BootMenu_ConvertDriveToMenuitem:
227 test dl, 80h ; Floppy drive?
228 jz SHORT .ReturnFloppyMenuitem
229 call FloppyDrive_GetCount
230 mov ax, 7Fh ; Load mask to clear floppy bit
231 and ax, dx ; AX = Hard Disk index
232 add cx, ax ; Add hard disk index to floppy drive count
233 ret
234ALIGN JUMP_ALIGN
235.ReturnFloppyMenuitem:
236 eMOVZX cx, dl ; Drive number and item index are equal
237 ret
238
239
240;--------------------------------------------------------------------
241; Checks is drive number valid for this system.
242;
243; BootMenu_IsDriveInSystem
244; Parameters:
245; DL: Drive number
246; DS: RAMVARS segment
247; Returns:
[28]248; CF: Set if drive number is valid
[3]249; Clear if drive is not present in system
250; Corrupts registers:
[28]251; AX, CX
[3]252;--------------------------------------------------------------------
253ALIGN JUMP_ALIGN
254BootMenu_IsDriveInSystem:
[32]255 test dl, 80h ; Floppy drive?
[3]256 jz SHORT .IsFloppyDriveIsInSystem
[32]257 call RamVars_GetHardDiskCountFromBDAtoCX ; Hard Disk count to CX
258 or cl, 80h ; Set Hard Disk bit to CX
[28]259 jmp SHORT .CompareDriveNumberToDriveCount
[3]260.IsFloppyDriveIsInSystem:
[32]261 call FloppyDrive_GetCount ; Floppy Drive count to CX
[28]262.CompareDriveNumberToDriveCount:
[3]263 cmp dl, cl
264 ret
Note: See TracBrowser for help on using the repository browser.