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

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

Added floppy drive emulation over the serial connection (MODULE_SERIAL_FLOPPY). Along the way, various optimizations were made to stay within the 8K ROM size target. Also, serial code now returns the number of sectors transferred.

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