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

Last change on this file since 249 was 248, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • Booting with hotkey now properly maintains FD and HD drive swappings (it is now again possible to boot with both translated FD and HD drives).
  • Had to change file orders so compressed strings could be included after recent changes to Assembly Library size.
File size: 6.4 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;
[243]10; BootMenu_DisplayAndReturnSelectionInDX
[3]11; Parameters:
12; DS: RAMVARS segment
13; Returns:
[95]14; DX: Untranslated drive number to be used for booting
[3]15; Corrupts registers:
16; All General Purpose Registers
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
[243]19BootMenu_DisplayAndReturnSelectionInDX:
[3]20 call DriveXlate_Reset
21 call BootMenuPrint_TheBottomOfScreen
22 call BootMenu_Enter ; Get selected menuitem index to CX
23 call BootMenuPrint_ClearScreen
[241]24 call BootMenu_GetDriveToDXforMenuitemInCX
[243]25 jnc BootMenu_DisplayAndReturnSelectionInDX
[241]26 ret
[88]27
[128]28;--------------------------------------------------------------------
[248]29; BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
[130]30; BootMenu_GetDriveToDXforMenuitemInCX
[128]31; Parameters:
32; CX: Index of menuitem selected from Boot Menu
33; Returns:
34; DX: Drive number to be used for booting
[241]35; DS: RAMVARS segment
36; CF: Set: There is a selected menu item, DL is valid
37; Clear: There is no selected menu item, DL is not valid
[128]38; Corrupts registers:
[241]39; CX, DI
[128]40;--------------------------------------------------------------------
41ALIGN JUMP_ALIGN
[241]42BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS:
43 call RamVars_GetSegmentToDS
44;;; fall-through
45
46ALIGN JUMP_ALIGN
[130]47BootMenu_GetDriveToDXforMenuitemInCX:
[241]48 cmp cl, NO_ITEM_HIGHLIGHTED
49 je SHORT .ReturnFloppyDriveInDX ; Clear CF if branch taken
50
51 mov dl, cl ; Copy menuitem index to DX
[128]52 call FloppyDrive_GetCountToCX
[241]53 cmp dl, cl ; Floppy drive?
54 jb SHORT .ReturnFloppyDriveInDX ; Set CF if branch taken
55 or cl, 80h ; Or 80h into CL before the sub
56 ; to cause CF to be set after
57 ; and result has high order bit set
58 sub dl, cl ; Remove floppy drives from index
59
[128]60.ReturnFloppyDriveInDX:
61 ret
[88]62
[128]63
[88]64;--------------------------------------------------------------------
65; Enters Boot Menu or submenu.
66;
67; BootMenu_Enter
68; Parameters:
69; Nothing
70; Returns:
71; CX: Index of selected item or NO_ITEM_SELECTED
72; Corrupts registers:
[127]73; AX, BX, DI
[88]74;--------------------------------------------------------------------
[3]75ALIGN JUMP_ALIGN
[88]76BootMenu_Enter:
77 mov bx, BootMenuEvent_Handler
78 CALL_MENU_LIBRARY DisplayWithHandlerInBXandUserDataInDXAX
79 xchg cx, ax
[3]80 ret
81
82
83;--------------------------------------------------------------------
84; Returns number of menuitems in Boot Menu.
85;
[124]86; BootMenu_GetMenuitemCountToAX
[3]87; Parameters:
88; DS: RAMVARS segment
89; Returns:
[124]90; AX: Number of boot menu items
[3]91; Corrupts registers:
[124]92; CX
[3]93;--------------------------------------------------------------------
94ALIGN JUMP_ALIGN
[124]95BootMenu_GetMenuitemCountToAX:
[32]96 call RamVars_GetHardDiskCountFromBDAtoCX
97 xchg ax, cx
[124]98 call FloppyDrive_GetCountToCX
[3]99 add ax, cx
100 ret
101
102
103;--------------------------------------------------------------------
[124]104; BootMenu_GetHeightToAHwithItemCountInAL
[3]105; Parameters:
[124]106; AL: Number of menuitems
[3]107; Returns:
[88]108; AH: Boot menu height
[3]109; Corrupts registers:
[124]110; AL, CX, DI
[3]111;--------------------------------------------------------------------
112ALIGN JUMP_ALIGN
[124]113BootMenu_GetHeightToAHwithItemCountInAL:
[128]114 add al, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
[124]115 xchg cx, ax
[88]116 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
[124]117 sub ah, MENU_SCREEN_BOTTOM_LINES*2 ; Leave space for bottom info
[181]118 cmp ah, cl
119 jb SHORT .Return
120 mov ah, cl
121ALIGN JUMP_ALIGN, ret
122.Return:
[3]123 ret
124
125
126;--------------------------------------------------------------------
[130]127; BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
[3]128; Parameters:
[130]129; AL: ASCII hotkey
[3]130; Returns:
[130]131; AX: Menuitem index
[3]132; Corrupts registers:
[130]133; CX
[3]134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
[130]136BootMenu_GetMenuitemToAXforAsciiHotkeyInAL:
137 call Char_ALtoUpperCaseLetter
[92]138 call BootMenu_GetLetterForFirstHardDiskToCL
[130]139 xor ah, ah
[3]140 cmp al, cl ; Letter is for Hard Disk?
141 jae SHORT .StartFromHardDiskLetter
142 sub al, 'A' ; Letter to Floppy Drive menuitem
143 ret
144ALIGN JUMP_ALIGN
145.StartFromHardDiskLetter:
146 sub al, cl ; Hard Disk index
[124]147 call FloppyDrive_GetCountToCX
[130]148 add ax, cx ; Menuitem index
[3]149 ret
150
[128]151
[3]152;--------------------------------------------------------------------
153; Returns letter for first hard disk. Usually it will be 'c' but it
154; can be higher if more than two floppy drives are found.
155;
[92]156; BootMenu_GetLetterForFirstHardDiskToCL
[3]157; Parameters:
158; Nothing
159; Returns:
160; CL: Upper case letter for first hard disk
161; Corrupts registers:
162; CH
163;--------------------------------------------------------------------
164ALIGN JUMP_ALIGN
[92]165BootMenu_GetLetterForFirstHardDiskToCL:
[124]166 call FloppyDrive_GetCountToCX
[3]167 add cl, 'A'
[181]168 cmp cl, 'C'
169 ja .Return
170 mov cl, 'C'
171ALIGN JUMP_ALIGN, ret
172.Return:
[3]173 ret
174
175
176;--------------------------------------------------------------------
[124]177; BootMenu_GetMenuitemToDXforDriveInDL
[3]178; Parameters:
179; DL: Drive number
180; Returns:
[124]181; DX: Menuitem index (assuming drive is available)
[3]182; Corrupts registers:
[124]183; Nothing
[3]184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
[124]186BootMenu_GetMenuitemToDXforDriveInDL:
187 xor dh, dh ; Drive number now in DX
[128]188 test dl, dl
189 jns SHORT .ReturnItemIndexInDX ; Return if floppy drive (HD bit not set)
[124]190 call FloppyDrive_GetCountToCX
[127]191 and dl, ~80h ; Clear HD bit
[124]192 add dx, cx
193.ReturnItemIndexInDX:
[3]194 ret
195
196
197;--------------------------------------------------------------------
198; Checks is drive number valid for this system.
199;
200; BootMenu_IsDriveInSystem
201; Parameters:
202; DL: Drive number
203; DS: RAMVARS segment
204; Returns:
[28]205; CF: Set if drive number is valid
[3]206; Clear if drive is not present in system
207; Corrupts registers:
[28]208; AX, CX
[3]209;--------------------------------------------------------------------
210ALIGN JUMP_ALIGN
211BootMenu_IsDriveInSystem:
[128]212 test dl, dl ; Floppy drive?
[130]213 jns SHORT .IsFloppyDriveInSystem
[32]214 call RamVars_GetHardDiskCountFromBDAtoCX ; Hard Disk count to CX
215 or cl, 80h ; Set Hard Disk bit to CX
[28]216 jmp SHORT .CompareDriveNumberToDriveCount
[130]217.IsFloppyDriveInSystem:
[124]218 call FloppyDrive_GetCountToCX
[28]219.CompareDriveNumberToDriveCount:
[124]220 cmp dl, cl ; Set CF when DL is smaller
[3]221 ret
Note: See TracBrowser for help on using the repository browser.