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

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

Space optimizations in the Boot Menu and BootInfo routines, taking advantage of nested %s. Optimization in the init of RamVars to avoid writing the signature twice. Preparing for addition of serial floppy support, starting to break the assumption that our drives are always 80h or higher.

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