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

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

General code size optimizations, preparing for string compression, consolidating all strings into strings.asm. Note that some changes resulted in slightly larger size now uncompressed, but will be net win when compressed.

File size: 14.4 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;--------------------------------------------------------------------
[130]8; BootMenuPrint_ClearScreen
9; Parameters:
10; Nothing
11; Returns:
12; Nothing
13; Corrupts registers:
14; AX, DI
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17BootMenuPrint_ClearScreen:
18 call BootMenuPrint_InitializeDisplayContext
19 xor ax, ax
20 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
21 mov ax, ' ' | (MONO_NORMAL<<8)
22 CALL_DISPLAY_LIBRARY ClearScreenWithCharInALandAttrInAH
23 ret
24
25
26;--------------------------------------------------------------------
27; BootMenuPrint_InitializeDisplayContext
28; Parameters:
29; Nothing
30; Returns:
31; Nothing
32; Corrupts registers:
33; AX, DI
34;--------------------------------------------------------------------
35ALIGN JUMP_ALIGN
36BootMenuPrint_InitializeDisplayContext:
37 CALL_DISPLAY_LIBRARY InitializeDisplayContext
38 ret
39
40
41;--------------------------------------------------------------------
[88]42; Prints Boot Menu title strings.
[3]43;
[88]44; BootMenuPrint_TitleStrings
[3]45; Parameters:
[88]46; Nothing
[3]47; Returns:
[88]48; CF: Set since menu event handled
[3]49; Corrupts registers:
[88]50; AX, SI, DI
[3]51;--------------------------------------------------------------------
52ALIGN JUMP_ALIGN
[88]53BootMenuPrint_TitleStrings:
54 mov si, ROMVARS.szTitle
[96]55 call BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
56 CALL_DISPLAY_LIBRARY PrintNewlineCharacters
[88]57 mov si, ROMVARS.szVersion
[161]58 ; Fall to BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
[3]59
60
61;--------------------------------------------------------------------
[128]62; BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
63; Parameters:
64; CS:SI: Ptr to NULL terminated string to print
65; Returns:
66; CF: Set since menu event was handled successfully
67; Corrupts registers:
68; AX
69;--------------------------------------------------------------------
70ALIGN JUMP_ALIGN
71BootMenuPrint_NullTerminatedStringFromCSSIandSetCF:
72 push di
73 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
74 pop di
75 stc
76 ret
77
78
79;--------------------------------------------------------------------
[3]80; BootMenuPrint_FloppyMenuitem
81; Parameters:
82; DL: Untranslated Floppy Drive number
83; Returns:
[88]84; Nothing
[3]85; Corrupts registers:
[120]86; AX, DX, SI, DI
[3]87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89BootMenuPrint_FloppyMenuitem:
[135]90 call PrintDriveNumberAfterTranslationFromDL
[88]91 push bp
92 mov bp, sp
93 mov si, g_szFDLetter
[3]94 ePUSH_T ax, g_szFloppyDrv
[88]95 add dl, 'A'
96 push dx ; Drive letter
97 jmp BootMenuPrint_FormatCSSIfromParamsInSSBP
[3]98
99
100;--------------------------------------------------------------------
101; BootMenuPrint_HardDiskMenuitem
102; Parameters:
103; DL: Untranslated Hard Disk number
104; DS: RAMVARS segment
105; Returns:
[88]106; CF: Set since menu event handled
[3]107; Corrupts registers:
[88]108; AX, BX, SI, DI
[3]109;--------------------------------------------------------------------
110ALIGN JUMP_ALIGN
111BootMenuPrint_HardDiskMenuitem:
[135]112 call PrintDriveNumberAfterTranslationFromDL
[150]113 call RamVars_IsDriveHandledByThisBIOS
[88]114 jnc SHORT .HardDiskMenuitemForForeignDrive
115 ; Fall to .HardDiskMenuitemForOurDrive
[3]116
117;--------------------------------------------------------------------
[88]118; .HardDiskMenuitemForOurDrive
[3]119; Parameters:
120; DL: Untranslated Hard Disk number
121; DS: RAMVARS segment
122; Returns:
[88]123; CF: Set since menu event handled
[3]124; Corrupts registers:
[88]125; AX, BX, SI, DI
[3]126;--------------------------------------------------------------------
[88]127.HardDiskMenuitemForOurDrive:
128 call BootInfo_GetOffsetToBX
129 lea si, [bx+BOOTNFO.szDrvName]
130 xor bx, bx ; BDA segment
131 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromBXSI
132 stc
133 ret
[3]134
135;--------------------------------------------------------------------
[88]136; BootMenuPrint_HardDiskMenuitemForForeignDrive
[3]137; Parameters:
138; DL: Untranslated Hard Disk number
139; DS: RAMVARS segment
140; Returns:
[88]141; CF: Set since menu event handled
[3]142; Corrupts registers:
[88]143; AX, SI, DI
[3]144;--------------------------------------------------------------------
145ALIGN JUMP_ALIGN
[88]146.HardDiskMenuitemForForeignDrive:
147 mov si, g_szforeignHD
[128]148 jmp SHORT BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
[3]149
150
151;--------------------------------------------------------------------
[135]152; PrintDriveNumberAfterTranslationFromDL
153; Parameters:
154; DL: Untranslated Floppy Drive number
155; DS: RAMVARS segment
156; Returns:
157; Nothing
158; Corrupts registers:
159; AX, DI
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162PrintDriveNumberAfterTranslationFromDL:
163 mov ax, dx
164 call DriveXlate_ToOrBack
165 xchg dx, ax ; Restore DX, WORD to print in AL
166 xor ah, ah
167 push bp
168 mov bp, sp
169 mov si, g_szDriveNum
170 push ax
[161]171 jmp SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
[135]172
173
174;--------------------------------------------------------------------
[3]175; BootMenuPrint_FloppyMenuitemInformation
176; Parameters:
177; DL: Untranslated Floppy Drive number
178; DS: RAMVARS segment
179; Returns:
[88]180; CF: Set since menu event was handled successfully
[3]181; Corrupts registers:
[88]182; AX, BX, CX, DX, SI, DI, ES
[3]183;--------------------------------------------------------------------
184ALIGN JUMP_ALIGN
185BootMenuPrint_FloppyMenuitemInformation:
[88]186 call BootMenuPrint_ClearInformationArea
187 call FloppyDrive_GetType ; Get Floppy Drive type to BX
[182]188
[161]189 push bp
190 mov bp, sp
[182]191 ePUSH_T ax, g_szCapacity
192
193 mov si, g_szFddSizeOr ; .PrintXTFloppyType
194 test bx, bx ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)
195 jz SHORT .output
196
197 mov si, g_szFddUnknown ; .PrintUnknownFloppyType
[3]198 cmp bl, FLOPPY_TYPE_35_ED
[182]199 ja SHORT .output
200
[161]201 ; Fall to .PrintKnownFloppyType
[3]202
[161]203
[3]204;--------------------------------------------------------------------
[161]205; .PrintKnownFloppyType
[3]206; Parameters:
[161]207; BX: Floppy drive type
[3]208; Returns:
[88]209; CF: Set since menu event was handled successfully
[3]210; Corrupts registers:
[161]211; AX, BX, SI, DI
[182]212;
213; Floppy Drive Types:
214;
215; 0 Handled above
216; 1 FLOPPY_TYPE_525_DD 5 1/4 360K
217; 2 FLOPPY_TYPE_525_HD 5 1/4 1.2M
218; 3 FLOPPY_TYPE_35_DD 3 1/2 720K
219; 4 FLOPPY_TYPE_35_HD 3 1/2 1.44M
220; 5 3.5" ED on some BIOSes 3 1/2 2.88M
221; 6 FLOPPY_TYPE_35_ED 3 1/2 2.88M
222; >6 Unknwon, handled above
223;
[3]224;--------------------------------------------------------------------
[161]225.PrintKnownFloppyType:
226 mov si, g_szFddSize
[182]227
228 mov ax, g_szFddThreeHalf
229 cmp bl, FLOPPY_TYPE_525_HD
230 ja .ThreeHalf
231 add ax, g_szFddThreeFive_Displacement
232.ThreeHalf:
233 push ax ; "5 1/4" or "3 1/2"
[3]234
[182]235 mov al,FloppyTypes.rgbCapacityMultiplier
236 mul byte [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table
237 push ax
[161]238
[182]239ALIGN JUMP_ALIGN
240.output:
[88]241 jmp SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
[182]242
243FloppyTypes:
244.rgbCapacityMultiplier equ 20 ; Multiplier to reduce word sized values to byte size
245.rgbCapacity:
246 db 360 / FloppyTypes.rgbCapacityMultiplier ; type 1
247 db 1200 / FloppyTypes.rgbCapacityMultiplier ; type 2
248 db 720 / FloppyTypes.rgbCapacityMultiplier ; type 3
249 db 1440 / FloppyTypes.rgbCapacityMultiplier ; type 4
250 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 5
251 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 6
[88]252
[182]253%if g_szFddFiveQuarter <> g_szFddThreeHalf+g_szFddThreeFive_Displacement
254%error "FddThreeFive_Displacement incorrect"
255%endif
256
[3]257;--------------------------------------------------------------------
258; Prints Hard Disk Menuitem information strings.
259;
260; BootMenuPrint_HardDiskMenuitemInformation
261; Parameters:
262; DL: Untranslated Hard Disk number
263; DS: RAMVARS segment
264; Returns:
[88]265; CF: Set since menu event was handled successfully
[3]266; Corrupts registers:
267; BX, CX, DX, SI, DI, ES
268;--------------------------------------------------------------------
269ALIGN JUMP_ALIGN
270BootMenuPrint_HardDiskMenuitemInformation:
[150]271 call RamVars_IsDriveHandledByThisBIOS
272 jnc SHORT .HardDiskMenuitemInfoForForeignDrive
[3]273 call FindDPT_ForDriveNumber ; DS:DI to point DPT
[127]274 ; Fall to .HardDiskMenuitemInfoForOurDrive
[3]275
276;--------------------------------------------------------------------
[127]277; .HardDiskMenuitemInfoForOurDrive
[3]278; Parameters:
279; DL: Untranslated Hard Disk number
[127]280; DS:DI: Ptr to DPT
[3]281; Returns:
[127]282; Nothing
[3]283; Corrupts registers:
[127]284; AX, BX, CX, DX, SI, DI, ES
[3]285;--------------------------------------------------------------------
[127]286.HardDiskMenuitemInfoForOurDrive:
287 push di
288 ePUSH_T ax, BootMenuPrintCfg_ForOurDrive ; Return from BootMenuPrint_FormatCSSIfromParamsInSSBP
[88]289 push bp
290 mov bp, sp
291 ePUSH_T ax, g_szCapacity
292
[127]293 ; Get and push L-CHS size
[155]294 mov [RAMVARS.bTimeoutTicksLeft], dl ; Store drive number
[150]295 call AH15h_GetSectorCountToDXAX
[88]296 call ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
297
[127]298 ; Get and push total LBA size
[155]299 mov dl, [RAMVARS.bTimeoutTicksLeft] ; Restore drive number
[127]300 call BootInfo_GetTotalSectorCount
301 call ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
302
303 mov si, g_szSizeDual
[88]304 jmp SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
[3]305
[127]306
[3]307;--------------------------------------------------------------------
[127]308; .HardDiskMenuitemInfoForForeignDrive
[3]309; Parameters:
310; DL: Untranslated Hard Disk number
[127]311; DS: RAMVARS segment
[3]312; Returns:
[127]313; CF: Set since menu event was handled successfully
[3]314; Corrupts registers:
[127]315; AX, BX, CX, DX, SI, DI
[3]316;--------------------------------------------------------------------
317ALIGN JUMP_ALIGN
[127]318.HardDiskMenuitemInfoForForeignDrive:
[88]319 push bp
320 mov bp, sp
321 ePUSH_T ax, g_szCapacity
[3]322
[127]323 call DriveXlate_ToOrBack
[150]324 call AH15h_GetSectorCountFromForeignDriveToDXAX
[88]325 call ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
326
[127]327 mov si, g_szSizeSingle
[88]328 ; Fall to BootMenuPrint_FormatCSSIfromParamsInSSBP
[3]329
330
331;--------------------------------------------------------------------
[88]332; BootMenuPrint_FormatCSSIfromParamsInSSBP
333; Parameters:
334; CS:SI: Ptr to string to format
[120]335; BP: SP before pushing parameters
[88]336; Returns:
337; BP: Popped from stack
338; Corrupts registers:
[120]339; AX, DI
[88]340;--------------------------------------------------------------------
341ALIGN JUMP_ALIGN
342BootMenuPrint_FormatCSSIfromParamsInSSBP:
343 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
344 stc ; Successfull return from menu event
345 pop bp
346 ret
347
348
349;--------------------------------------------------------------------
350; ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
351; Parameters:
352; BX:DX:AX: Sector count
353; Returns:
354; Size in stack
355; Corrupts registers:
356; AX, BX, CX, DX, SI
357;--------------------------------------------------------------------
358ALIGN JUMP_ALIGN
359ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
360 pop si ; Pop return address
361 call Size_ConvertSectorCountInBXDXAXtoKiB
362 mov cx, BYTE_MULTIPLES.kiB
363 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
364 push ax ; Size in magnitude
365 push cx ; Tenths
366 push dx ; Magnitude character
367 jmp si
368
369
370;--------------------------------------------------------------------
371; BootMenuPrint_ClearInformationArea
372; Parameters:
373; Nothing
374; Returns:
375; CF: Set
376; Corrupts registers:
377; AX, DI
378;--------------------------------------------------------------------
379ALIGN JUMP_ALIGN
380BootMenuPrint_ClearInformationArea:
381 CALL_MENU_LIBRARY ClearInformationArea
382 stc
383 ret
384
385
386;--------------------------------------------------------------------
387; BootMenuPrint_TheBottomOfScreen
[3]388; Parameters:
389; DS: RAMVARS segment
390; Returns:
[88]391; Nothing
[3]392; Corrupts registers:
[92]393; AX, BX, CX, DX, SI, DI
[3]394;--------------------------------------------------------------------
395ALIGN JUMP_ALIGN
[88]396BootMenuPrint_TheBottomOfScreen:
[124]397 call FloppyDrive_GetCountToCX
[88]398 mov bl, cl ; Floppy Drive count to BL
399 call RamVars_GetHardDiskCountFromBDAtoCX
400 mov bh, cl ; Hard Disk count to BH
[92]401 ; Fall to .MoveCursorToHotkeyStrings
[3]402
[92]403;--------------------------------------------------------------------
404; .MoveCursorToHotkeyStrings
405; Parameters:
406; Nothing
407; Returns:
408; Nothing
409; Corrupts registers:
410; AX, DI
411;--------------------------------------------------------------------
412.MoveCursorToHotkeyStrings:
413 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
414 xor al, al
415 dec ah
416 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
417 ; Fall to .PrintHotkeyString
[3]418
419;--------------------------------------------------------------------
[92]420; .PrintHotkeyString
[3]421; Parameters:
[92]422; BL: Floppy Drives
423; BH: Hard Drives
[88]424; Returns:
[92]425; Nothing
[88]426; Corrupts registers:
[120]427; AX, CX, DX, SI, DI
[88]428;--------------------------------------------------------------------
[92]429.PrintHotkeyString:
430 ; Display Library should not be called like this
431 mov si, ATTRIBUTE_CHARS.cHighlightedItem
432 call MenuAttribute_GetToAXfromTypeInSI
433 xchg dx, ax
[122]434 mov cx, MONO_BRIGHT
[88]435
[92]436 test bl, bl ; Any Floppy Drives?
437 jz SHORT .SkipFloppyDriveHotkeys
438 mov ax, 'A' | (ANGLE_QUOTE_RIGHT<<8)
439 mov si, g_szFDD
440 call PushHotkeyParamsAndFormat
[88]441
[92]442.SkipFloppyDriveHotkeys:
443 test bh, bh ; Any Hard Drives?
444 jz SHORT .SkipHardDriveHotkeys
[122]445 xchg ax, cx ; Store Key Attribute
[92]446 call BootMenu_GetLetterForFirstHardDiskToCL
447 mov ch, ANGLE_QUOTE_RIGHT
448 xchg ax, cx
449 mov si, g_szHDD
450 call PushHotkeyParamsAndFormat
451
452.SkipHardDriveHotkeys:
453 ; Fall to .PrintRomBootHotkey
454
[88]455;--------------------------------------------------------------------
[92]456; .PrintRomBootHotkey
[88]457; Parameters:
[92]458; CX: Key Attribute
459; DX: Description Attribute
[3]460; Returns:
[88]461; Nothing
[3]462; Corrupts registers:
[120]463; AX, SI, DI
[3]464;--------------------------------------------------------------------
[92]465.PrintRomBootHotkey:
466 mov ax, 'F' | ('8'<<8) ; F8
467 mov si, g_szRomBoot
468 ; Fall to PushHotkeyParamsAndFormat
469
470;--------------------------------------------------------------------
471; PushHotkeyParamsAndFormat
472; Parameters:
473; AL: First character
474; AH: Second character
475; CX: Key Attribute
476; DX: Description Attribute
477; CS:SI: Description string
478; Returns:
479; Nothing
480; Corrupts registers:
[120]481; AX, SI, DI
[92]482;--------------------------------------------------------------------
[3]483ALIGN JUMP_ALIGN
[92]484PushHotkeyParamsAndFormat:
485 push bp
486 mov bp, sp
487
488 push cx ; Key attribute
489 push ax ; First character
490 xchg al, ah
491 push ax ; Second character
492 push dx ; Description attribute
493 push si ; Description string
494 push cx ; Key attribute for last space
495 mov si, g_szHotkey
[161]496 jmp SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
497
[182]498
Note: See TracBrowser for help on using the repository browser.