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