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

Last change on this file since 387 was 386, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • Boot menu is now an optional module (MODULE_BOOT_MENU).
File size: 10.6 KB
RevLine 
[88]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for printing boot menu strings.
3
[376]4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
[3]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
[241]24; BootMenuPrint_RefreshItem
[294]25;
[189]26; Parameters:
27; DL: Untranslated Floppy Drive number
28; Returns:
29; Nothing
30; Corrupts registers:
[241]31; AX, BX, DX, SI, DI
[189]32;--------------------------------------------------------------------
[241]33BootMenuPrint_RefreshItem:
34 call BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
35 jnc BootMenuEvent_EventCompleted ; if no menu item selected, out we go
[294]36
[189]37 push bp
38 mov bp, sp
39
[262]40 call FindDPT_ForDriveNumberInDL
[258]41 jc .notOurs
[241]42
[254]43 call BootMenuInfo_ConvertDPTtoBX
[241]44 mov si, g_szDriveNumBOOTNFO ; special g_szDriveNum that prints from BDA
45 jmp .go
[294]46
[241]47.notOurs:
[294]48 mov si,g_szDriveNum
[241]49 mov bx,g_szForeignHD ; assume a hard disk for the moment
[294]50
51 test dl, dl
[241]52 js .go
53 mov bl,((g_szFloppyDrv)-$$ & 0xff) ; and revisit the earlier assumption...
[294]54
[241]55.go:
56 mov ax, dx ; preserve DL for the floppy drive letter addition
57 call DriveXlate_ToOrBack
58 push dx ; translated drive number
59 push bx ; sub string
60 add al, 'A' ; floppy drive letter (we always push this although
61 push ax ; the hard disks don't ever use it, but it does no harm)
[294]62
[386]63 jmp SHORT BootMenuPrint_RefreshInformation.FormatRelay
[130]64
65;--------------------------------------------------------------------
[88]66; Prints Boot Menu title strings.
[3]67;
[88]68; BootMenuPrint_TitleStrings
[3]69; Parameters:
[88]70; Nothing
[3]71; Returns:
[88]72; CF: Set since menu event handled
[3]73; Corrupts registers:
[88]74; AX, SI, DI
[3]75;--------------------------------------------------------------------
[88]76BootMenuPrint_TitleStrings:
77 mov si, ROMVARS.szTitle
[386]78 call DetectPrint_NullTerminatedStringFromCSSIandSetCF
[96]79 CALL_DISPLAY_LIBRARY PrintNewlineCharacters
[88]80 mov si, ROMVARS.szVersion
[386]81 jmp DetectPrint_NullTerminatedStringFromCSSIandSetCF
[3]82
[128]83
84;--------------------------------------------------------------------
[3]85; BootMenuPrint_FloppyMenuitemInformation
86; Parameters:
87; DL: Untranslated Floppy Drive number
88; DS: RAMVARS segment
89; Returns:
[88]90; CF: Set since menu event was handled successfully
[3]91; Corrupts registers:
[88]92; AX, BX, CX, DX, SI, DI, ES
[3]93;--------------------------------------------------------------------
[241]94BootMenuPrint_RefreshInformation:
[294]95 CALL_MENU_LIBRARY ClearInformationArea
96
[241]97 call BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
98 jnc BootMenuEvent_EventCompleted ; if no menu selection, abort
[182]99
[161]100 push bp
101 mov bp, sp
[241]102
[258]103 mov si, g_szCapacity ; Setup print string now, carries through to print call
104
[262]105 call FindDPT_ForDriveNumberInDL
[259]106
[262]107 inc dl ; are we a hard disk?
108 dec dl ; inc/dec will set SF, without modifying CF or DL
[294]109 js .HardDiskRefreshInformation
[258]110
[262]111 jnc .ours ; Based on CF from FindDPT_ForDriveNumberInDL above
[241]112 call FloppyDrive_GetType ; Get Floppy Drive type to BX
[258]113 jmp .around
114.ours:
115 call AH8h_GetDriveParameters
[294]116.around:
[182]117
[255]118 mov ax, g_szFddSizeOr ; .PrintXTFloppyType
[294]119 test bl, bl ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)
[255]120 jz SHORT .PushAXAndOutput
[241]121
[255]122 mov al, (g_szFddUnknown - $$) & 0xff ; .PrintUnknownFloppyType
[3]123 cmp bl, FLOPPY_TYPE_35_ED
[255]124 ja SHORT .PushAXAndOutput
[294]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
[294]136;
[182]137; Floppy Drive Types:
138;
[294]139; 0 Handled above
[182]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
[294]147;
[3]148;--------------------------------------------------------------------
[161]149.PrintKnownFloppyType:
[255]150 mov al, (g_szFddSize - $$) & 0xff
151 push ax
[294]152
[255]153 mov al, (g_szFddThreeHalf - $$) & 0xff
[182]154 cmp bl, FLOPPY_TYPE_525_HD
155 ja .ThreeHalf
[255]156 mov al, (g_szFddFiveQuarter - $$) & 0xff
[294]157.ThreeHalf:
[255]158 push ax ; "5 1/4" or "3 1/2"
[3]159
[182]160 mov al,FloppyTypes.rgbCapacityMultiplier
[258]161 mov bh, 0
[182]162 mul byte [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table
[255]163
[294]164.PushAXAndOutput:
[182]165 push ax
[161]166
[258]167.FormatRelay:
[386]168 jmp DetectPrint_FormatCSSIfromParamsInSSBP
[88]169
[192]170
171;--------------------------------------------------------------------
[3]172; Prints Hard Disk Menuitem information strings.
173;
174; BootMenuPrint_HardDiskMenuitemInformation
175; Parameters:
176; DS: RAMVARS segment
177; Returns:
[88]178; CF: Set since menu event was handled successfully
[3]179; Corrupts registers:
180; BX, CX, DX, SI, DI, ES
181;--------------------------------------------------------------------
[294]182.HardDiskRefreshInformation:
[262]183 jc .HardDiskMenuitemInfoForForeignDrive ; Based on CF from FindDPT_ForDriveNumberInDL (way) above
[3]184
[127]185.HardDiskMenuitemInfoForOurDrive:
[262]186 ePUSH_T ax, g_szInformation ; Add substring for our hard disk information
187 call BootMenuInfo_GetTotalSectorCount ; Get Total LBA Size
[258]188 jmp .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
[294]189
[127]190.HardDiskMenuitemInfoForForeignDrive:
191 call DriveXlate_ToOrBack
[150]192 call AH15h_GetSectorCountFromForeignDriveToDXAX
[88]193
[258]194.ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
195 ePUSH_T cx, g_szCapacityNum ; Push format substring
196 call Size_ConvertSectorCountInBXDXAXtoKiB
197 mov cx, BYTE_MULTIPLES.kiB
198 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
199 push ax ; Size in magnitude
200 push cx ; Tenths
[294]201 push dx ; Magnitude character
202
[258]203 test di,di
[386]204 jz SHORT BootMenuPrint_RefreshInformation.FormatRelay
[3]205
[258]206%include "BootMenuPrintCfg.asm" ; inline of code to fill out remainder of information string
[386]207 jmp DetectPrint_FormatCSSIfromParamsInSSBP
[258]208
209
[3]210;--------------------------------------------------------------------
[192]211; BootMenuPrint_ClearScreen
[88]212; Parameters:
[192]213; Nothing
[88]214; Returns:
[192]215; Nothing
[88]216; Corrupts registers:
[192]217; AX, DI
[88]218;--------------------------------------------------------------------
[192]219BootMenuPrint_ClearScreen:
220 call BootMenuPrint_InitializeDisplayContext
221 xor ax, ax
222 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
223 mov ax, ' ' | (MONO_NORMAL<<8)
224 CALL_DISPLAY_LIBRARY ClearScreenWithCharInALandAttrInAH
225 ret
[88]226
227
228;--------------------------------------------------------------------
229; BootMenuPrint_TheBottomOfScreen
[3]230; Parameters:
231; DS: RAMVARS segment
232; Returns:
[88]233; Nothing
[3]234; Corrupts registers:
[92]235; AX, BX, CX, DX, SI, DI
[3]236;--------------------------------------------------------------------
[88]237BootMenuPrint_TheBottomOfScreen:
[258]238 call FloppyDrive_GetCountToAX
239 xchg bx, ax ; Floppy Drive count to BL
240 call RamVars_GetHardDiskCountFromBDAtoAX
241 mov bh, al ; Hard Disk count to BH
[92]242 ; Fall to .MoveCursorToHotkeyStrings
[3]243
[92]244;--------------------------------------------------------------------
245; .MoveCursorToHotkeyStrings
246; Parameters:
247; Nothing
248; Returns:
249; Nothing
250; Corrupts registers:
251; AX, DI
252;--------------------------------------------------------------------
253.MoveCursorToHotkeyStrings:
254 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
255 xor al, al
256 dec ah
257 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
258 ; Fall to .PrintHotkeyString
[3]259
260;--------------------------------------------------------------------
[92]261; .PrintHotkeyString
[3]262; Parameters:
[92]263; BL: Floppy Drives
264; BH: Hard Drives
[88]265; Returns:
[92]266; Nothing
[88]267; Corrupts registers:
[120]268; AX, CX, DX, SI, DI
[88]269;--------------------------------------------------------------------
[92]270.PrintHotkeyString:
271 ; Display Library should not be called like this
272 mov si, ATTRIBUTE_CHARS.cHighlightedItem
273 call MenuAttribute_GetToAXfromTypeInSI
274 xchg dx, ax
[122]275 mov cx, MONO_BRIGHT
[88]276
[92]277 test bl, bl ; Any Floppy Drives?
278 jz SHORT .SkipFloppyDriveHotkeys
279 mov ax, 'A' | (ANGLE_QUOTE_RIGHT<<8)
280 mov si, g_szFDD
281 call PushHotkeyParamsAndFormat
[88]282
[92]283.SkipFloppyDriveHotkeys:
284 test bh, bh ; Any Hard Drives?
285 jz SHORT .SkipHardDriveHotkeys
[258]286 call BootMenu_GetLetterForFirstHardDiskToAL
287 mov ah, ANGLE_QUOTE_RIGHT
[92]288 mov si, g_szHDD
289 call PushHotkeyParamsAndFormat
290
291.SkipHardDriveHotkeys:
292 ; Fall to .PrintRomBootHotkey
293
[88]294;--------------------------------------------------------------------
[92]295; .PrintRomBootHotkey
[88]296; Parameters:
[92]297; CX: Key Attribute
298; DX: Description Attribute
[3]299; Returns:
[88]300; Nothing
[3]301; Corrupts registers:
[120]302; AX, SI, DI
[3]303;--------------------------------------------------------------------
[92]304.PrintRomBootHotkey:
305 mov ax, 'F' | ('8'<<8) ; F8
306 mov si, g_szRomBoot
307 ; Fall to PushHotkeyParamsAndFormat
308
309;--------------------------------------------------------------------
310; PushHotkeyParamsAndFormat
311; Parameters:
312; AL: First character
313; AH: Second character
314; CX: Key Attribute
315; DX: Description Attribute
316; CS:SI: Description string
317; Returns:
318; Nothing
319; Corrupts registers:
[120]320; AX, SI, DI
[92]321;--------------------------------------------------------------------
322PushHotkeyParamsAndFormat:
323 push bp
324 mov bp, sp
325
326 push cx ; Key attribute
327 push ax ; First character
328 xchg al, ah
329 push ax ; Second character
330 push dx ; Description attribute
331 push si ; Description string
332 push cx ; Key attribute for last space
333 mov si, g_szHotkey
[386]334 jmp DetectPrint_FormatCSSIfromParamsInSSBP
[294]335
[161]336
[241]337FloppyTypes:
338.rgbCapacityMultiplier equ 20 ; Multiplier to reduce word sized values to byte size
339.rgbCapacity:
340 db 360 / FloppyTypes.rgbCapacityMultiplier ; type 1
341 db 1200 / FloppyTypes.rgbCapacityMultiplier ; type 2
342 db 720 / FloppyTypes.rgbCapacityMultiplier ; type 3
343 db 1440 / FloppyTypes.rgbCapacityMultiplier ; type 4
344 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 5
345 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 6
Note: See TracBrowser for help on using the repository browser.