source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm@ 282

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

More optimizations. Merged RamVars_IsFunction/DriveHandledByThisBIOS in with FindDPT_ForDriveNumber, since they are often used together, making a returned NULL DI pointer indicate a foreign drive in many places. Revamped the iteration done in the handlers for int13/0dh and int13h/0h. Added serial specific print string during drive detection.

File size: 11.9 KB
RevLine 
[88]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for printing boot menu strings.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[241]8; BootMenuPrint_RefreshItem
9;
[189]10; Parameters:
11; DL: Untranslated Floppy Drive number
12; Returns:
13; Nothing
14; Corrupts registers:
[241]15; AX, BX, DX, SI, DI
[189]16;--------------------------------------------------------------------
17ALIGN JUMP_ALIGN
[241]18BootMenuPrint_RefreshItem:
19 call BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
20 jnc BootMenuEvent_EventCompleted ; if no menu item selected, out we go
21
[189]22 push bp
23 mov bp, sp
24
[262]25 call FindDPT_ForDriveNumberInDL
[258]26 jc .notOurs
[241]27
[254]28 call BootMenuInfo_ConvertDPTtoBX
[241]29 mov si, g_szDriveNumBOOTNFO ; special g_szDriveNum that prints from BDA
30 jmp .go
[189]31
[241]32.notOurs:
33 mov si,g_szDriveNum
34 mov bx,g_szForeignHD ; assume a hard disk for the moment
35
36 test dl,80h
37 js .go
38 mov bl,((g_szFloppyDrv)-$$ & 0xff) ; and revisit the earlier assumption...
39
40.go:
41 mov ax, dx ; preserve DL for the floppy drive letter addition
42 call DriveXlate_ToOrBack
43 push dx ; translated drive number
44 push bx ; sub string
45 add al, 'A' ; floppy drive letter (we always push this although
46 push ax ; the hard disks don't ever use it, but it does no harm)
47
[258]48 jmp short BootMenuPrint_RefreshInformation.FormatRelay
[130]49
50;--------------------------------------------------------------------
[88]51; Prints Boot Menu title strings.
[3]52;
[88]53; BootMenuPrint_TitleStrings
[3]54; Parameters:
[88]55; Nothing
[3]56; Returns:
[88]57; CF: Set since menu event handled
[3]58; Corrupts registers:
[88]59; AX, SI, DI
[3]60;--------------------------------------------------------------------
61ALIGN JUMP_ALIGN
[88]62BootMenuPrint_TitleStrings:
63 mov si, ROMVARS.szTitle
[96]64 call BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
65 CALL_DISPLAY_LIBRARY PrintNewlineCharacters
[88]66 mov si, ROMVARS.szVersion
[161]67 ; Fall to BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
[3]68
69;--------------------------------------------------------------------
[128]70; BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
71; Parameters:
72; CS:SI: Ptr to NULL terminated string to print
73; Returns:
74; CF: Set since menu event was handled successfully
75; Corrupts registers:
[186]76; AX, DI
[128]77;--------------------------------------------------------------------
78ALIGN JUMP_ALIGN
79BootMenuPrint_NullTerminatedStringFromCSSIandSetCF:
[186]80;
81; We send all CSSI strings through the Format routine for the case of
82; compressed strings, but this doesn't hurt in the non-compressed case either
83; (perhaps a little slower, but shouldn't be noticeable to the user)
84; and results in smaller code size.
85;
86 push bp
87 mov bp,sp
[258]88 jmp short BootMenuPrint_RefreshInformation.FormatRelay
[128]89
[192]90
[128]91;--------------------------------------------------------------------
[3]92; BootMenuPrint_FloppyMenuitemInformation
93; Parameters:
94; DL: Untranslated Floppy Drive number
95; DS: RAMVARS segment
96; Returns:
[88]97; CF: Set since menu event was handled successfully
[3]98; Corrupts registers:
[88]99; AX, BX, CX, DX, SI, DI, ES
[3]100;--------------------------------------------------------------------
[241]101ALIGN JUMP_ALIGN
102BootMenuPrint_RefreshInformation:
103 CALL_MENU_LIBRARY ClearInformationArea
[192]104
[241]105 call BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
106 jnc BootMenuEvent_EventCompleted ; if no menu selection, abort
[182]107
[161]108 push bp
109 mov bp, sp
[241]110
[258]111 mov si, g_szCapacity ; Setup print string now, carries through to print call
112
[262]113 call FindDPT_ForDriveNumberInDL
[259]114
[262]115 inc dl ; are we a hard disk?
116 dec dl ; inc/dec will set SF, without modifying CF or DL
117 js .HardDiskRefreshInformation
[258]118
[262]119 jnc .ours ; Based on CF from FindDPT_ForDriveNumberInDL above
[241]120 call FloppyDrive_GetType ; Get Floppy Drive type to BX
[258]121 jmp .around
122.ours:
123 call AH8h_GetDriveParameters
124.around:
[182]125
[255]126 mov ax, g_szFddSizeOr ; .PrintXTFloppyType
[258]127 test bl, bl ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)
[255]128 jz SHORT .PushAXAndOutput
[241]129
[255]130 mov al, (g_szFddUnknown - $$) & 0xff ; .PrintUnknownFloppyType
[3]131 cmp bl, FLOPPY_TYPE_35_ED
[255]132 ja SHORT .PushAXAndOutput
[182]133
[161]134 ; Fall to .PrintKnownFloppyType
[3]135
136;--------------------------------------------------------------------
[161]137; .PrintKnownFloppyType
[3]138; Parameters:
[161]139; BX: Floppy drive type
[3]140; Returns:
[88]141; CF: Set since menu event was handled successfully
[3]142; Corrupts registers:
[161]143; AX, BX, SI, DI
[182]144;
145; Floppy Drive Types:
146;
147; 0 Handled above
148; 1 FLOPPY_TYPE_525_DD 5 1/4 360K
149; 2 FLOPPY_TYPE_525_HD 5 1/4 1.2M
150; 3 FLOPPY_TYPE_35_DD 3 1/2 720K
151; 4 FLOPPY_TYPE_35_HD 3 1/2 1.44M
152; 5 3.5" ED on some BIOSes 3 1/2 2.88M
153; 6 FLOPPY_TYPE_35_ED 3 1/2 2.88M
154; >6 Unknwon, handled above
155;
[3]156;--------------------------------------------------------------------
[161]157.PrintKnownFloppyType:
[255]158 mov al, (g_szFddSize - $$) & 0xff
159 push ax
[182]160
[255]161 mov al, (g_szFddThreeHalf - $$) & 0xff
[182]162 cmp bl, FLOPPY_TYPE_525_HD
163 ja .ThreeHalf
[255]164 mov al, (g_szFddFiveQuarter - $$) & 0xff
[182]165.ThreeHalf:
[255]166 push ax ; "5 1/4" or "3 1/2"
[3]167
[182]168 mov al,FloppyTypes.rgbCapacityMultiplier
[258]169 mov bh, 0
[182]170 mul byte [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table
[255]171
172.PushAXAndOutput:
[182]173 push ax
[161]174
[258]175.FormatRelay:
176 jmp short BootMenuPrint_FormatCSSIfromParamsInSSBP
[88]177
[192]178
179;--------------------------------------------------------------------
[3]180; Prints Hard Disk Menuitem information strings.
181;
182; BootMenuPrint_HardDiskMenuitemInformation
183; Parameters:
184; DS: RAMVARS segment
185; Returns:
[88]186; CF: Set since menu event was handled successfully
[3]187; Corrupts registers:
188; BX, CX, DX, SI, DI, ES
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
[262]191.HardDiskRefreshInformation:
192 jc .HardDiskMenuitemInfoForForeignDrive ; Based on CF from FindDPT_ForDriveNumberInDL (way) above
[3]193
[127]194.HardDiskMenuitemInfoForOurDrive:
[262]195 ePUSH_T ax, g_szInformation ; Add substring for our hard disk information
196 call BootMenuInfo_GetTotalSectorCount ; Get Total LBA Size
[258]197 jmp .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
198
[127]199.HardDiskMenuitemInfoForForeignDrive:
200 call DriveXlate_ToOrBack
[150]201 call AH15h_GetSectorCountFromForeignDriveToDXAX
[88]202
[258]203.ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
204 ePUSH_T cx, g_szCapacityNum ; Push format substring
205 call Size_ConvertSectorCountInBXDXAXtoKiB
206 mov cx, BYTE_MULTIPLES.kiB
207 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
208 push ax ; Size in magnitude
209 push cx ; Tenths
210 push dx ; Magnitude character
211
212 test di,di
213 jz short BootMenuPrint_FormatCSSIfromParamsInSSBP
[3]214
[258]215%include "BootMenuPrintCfg.asm" ; inline of code to fill out remainder of information string
216
217;;; fall-through to BootMenuPrint_FormatCSSIfromParamsInSSBP
218
219
[3]220;--------------------------------------------------------------------
[241]221; BootMenuPrint_FormatCSSIfromParamsInSSBP
[88]222; Parameters:
[241]223; CS:SI: Ptr to string to format
224; BP: SP before pushing parameters
[88]225; Returns:
[241]226; BP: Popped from stack
227; CF: Set since menu event was handled successfully
[88]228; Corrupts registers:
[120]229; AX, DI
[88]230;--------------------------------------------------------------------
231ALIGN JUMP_ALIGN
[241]232BootMenuPrint_FormatCSSIfromParamsInSSBP:
233 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
234 stc ; Successfull return from menu event
235 pop bp
[88]236 ret
[192]237
[241]238
[88]239;--------------------------------------------------------------------
[192]240; BootMenuPrint_ClearScreen
[88]241; Parameters:
[192]242; Nothing
[88]243; Returns:
[192]244; Nothing
[88]245; Corrupts registers:
[192]246; AX, DI
[88]247;--------------------------------------------------------------------
248ALIGN JUMP_ALIGN
[192]249BootMenuPrint_ClearScreen:
250 call BootMenuPrint_InitializeDisplayContext
251 xor ax, ax
252 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
253 mov ax, ' ' | (MONO_NORMAL<<8)
254 CALL_DISPLAY_LIBRARY ClearScreenWithCharInALandAttrInAH
255 ret
[88]256
257
258;--------------------------------------------------------------------
259; BootMenuPrint_TheBottomOfScreen
[3]260; Parameters:
261; DS: RAMVARS segment
262; Returns:
[88]263; Nothing
[3]264; Corrupts registers:
[92]265; AX, BX, CX, DX, SI, DI
[3]266;--------------------------------------------------------------------
267ALIGN JUMP_ALIGN
[88]268BootMenuPrint_TheBottomOfScreen:
[258]269 call FloppyDrive_GetCountToAX
270 xchg bx, ax ; Floppy Drive count to BL
271 call RamVars_GetHardDiskCountFromBDAtoAX
272 mov bh, al ; Hard Disk count to BH
[92]273 ; Fall to .MoveCursorToHotkeyStrings
[3]274
[92]275;--------------------------------------------------------------------
276; .MoveCursorToHotkeyStrings
277; Parameters:
278; Nothing
279; Returns:
280; Nothing
281; Corrupts registers:
282; AX, DI
283;--------------------------------------------------------------------
284.MoveCursorToHotkeyStrings:
285 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
286 xor al, al
287 dec ah
288 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
289 ; Fall to .PrintHotkeyString
[3]290
291;--------------------------------------------------------------------
[92]292; .PrintHotkeyString
[3]293; Parameters:
[92]294; BL: Floppy Drives
295; BH: Hard Drives
[88]296; Returns:
[92]297; Nothing
[88]298; Corrupts registers:
[120]299; AX, CX, DX, SI, DI
[88]300;--------------------------------------------------------------------
[92]301.PrintHotkeyString:
302 ; Display Library should not be called like this
303 mov si, ATTRIBUTE_CHARS.cHighlightedItem
304 call MenuAttribute_GetToAXfromTypeInSI
305 xchg dx, ax
[122]306 mov cx, MONO_BRIGHT
[88]307
[92]308 test bl, bl ; Any Floppy Drives?
309 jz SHORT .SkipFloppyDriveHotkeys
310 mov ax, 'A' | (ANGLE_QUOTE_RIGHT<<8)
311 mov si, g_szFDD
312 call PushHotkeyParamsAndFormat
[88]313
[92]314.SkipFloppyDriveHotkeys:
315 test bh, bh ; Any Hard Drives?
316 jz SHORT .SkipHardDriveHotkeys
[258]317 call BootMenu_GetLetterForFirstHardDiskToAL
318 mov ah, ANGLE_QUOTE_RIGHT
[92]319 mov si, g_szHDD
320 call PushHotkeyParamsAndFormat
321
322.SkipHardDriveHotkeys:
323 ; Fall to .PrintRomBootHotkey
324
[88]325;--------------------------------------------------------------------
[92]326; .PrintRomBootHotkey
[88]327; Parameters:
[92]328; CX: Key Attribute
329; DX: Description Attribute
[3]330; Returns:
[88]331; Nothing
[3]332; Corrupts registers:
[120]333; AX, SI, DI
[3]334;--------------------------------------------------------------------
[92]335.PrintRomBootHotkey:
336 mov ax, 'F' | ('8'<<8) ; F8
337 mov si, g_szRomBoot
338 ; Fall to PushHotkeyParamsAndFormat
339
340;--------------------------------------------------------------------
341; PushHotkeyParamsAndFormat
342; Parameters:
343; AL: First character
344; AH: Second character
345; CX: Key Attribute
346; DX: Description Attribute
347; CS:SI: Description string
348; Returns:
349; Nothing
350; Corrupts registers:
[120]351; AX, SI, DI
[92]352;--------------------------------------------------------------------
[3]353ALIGN JUMP_ALIGN
[92]354PushHotkeyParamsAndFormat:
355 push bp
356 mov bp, sp
357
358 push cx ; Key attribute
359 push ax ; First character
360 xchg al, ah
361 push ax ; Second character
362 push dx ; Description attribute
363 push si ; Description string
364 push cx ; Key attribute for last space
365 mov si, g_szHotkey
[241]366
367BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay:
368 jmp SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
[161]369
[182]370
[192]371;--------------------------------------------------------------------
372; BootMenuPrint_InitializeDisplayContext
373; Parameters:
374; Nothing
375; Returns:
376; Nothing
377; Corrupts registers:
378; AX, DI
379;--------------------------------------------------------------------
380ALIGN JUMP_ALIGN
381BootMenuPrint_InitializeDisplayContext:
382 CALL_DISPLAY_LIBRARY InitializeDisplayContext
383 ret
384
385
[241]386FloppyTypes:
387.rgbCapacityMultiplier equ 20 ; Multiplier to reduce word sized values to byte size
388.rgbCapacity:
389 db 360 / FloppyTypes.rgbCapacityMultiplier ; type 1
390 db 1200 / FloppyTypes.rgbCapacityMultiplier ; type 2
391 db 720 / FloppyTypes.rgbCapacityMultiplier ; type 3
392 db 1440 / FloppyTypes.rgbCapacityMultiplier ; type 4
393 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 5
394 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 6
Note: See TracBrowser for help on using the repository browser.