source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenuPrint.asm@ 590

Last change on this file since 590 was 589, checked in by Krister Nordvall, 9 years ago

Changes:

  • BIOS: Fixed a purely cosmetic bug from r542 where, in builds containing MODULE_EBIOS, the boot menu would display an incorrect drive size (0.4 kB with MODULE_STRINGS_COMPRESSED or 0.5 kB without) for old drives with no support for LBA.
  • Fixed a bug from r392 where Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent would return the ID in AL instead of AH (if DANGEROUS_DETECTION had been defined).
  • Fixed a bug from r587 in AdvAtaInit.asm that would prevent detection of QDI Vision controllers.
  • Also changed how the QDI Vision IDs are defined (removed the need for shifting) to avoid confusion. This fixed a potential bug from r587 in AdvAtaInit.asm where some IDs were not being shifted.
  • Fixed a bug in PDC20x30.asm from r587 where GetPdcIDtoAX would not return with the IDE base port in DX so DisablePdcProgrammingMode would fail.
  • Made some changes to ModuleDependency.inc and other files so that MODULE_ADVANCED_ATA now requires USE_386. Consequently it is no longer included in the regular AT-builds, only in the 386_8k-build.
  • Moved the UNROLL_SECTORS_IN_CX_TO_xWORDS macros from IDE_8bit.inc to IdeIO.inc which means it's now possible to build a BIOS without MODULE_8BIT_IDE.
  • XTIDECFG: Added a minimum DOS version check (since it needs DOS version 2+) to allow the program to quit gracefully in the unlikely scenario where someone tries to run it under DOS version 1.
  • Made some changes to Drive.asm to improve drive enumeration. The old method using GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE worked well in Windows XP but not in Windows 98 SE (in Windows or in DOS mode). The two problems were; 1) The function call would access the drives which on single floppy drive systems would cause Windows to swap between A: and B: (throwing a blue screen asking the user to insert a disk etc). 2) Only floppy drives and FAT16 drives would be available in the list of drives, no FAT32/optical/network drives.
  • Improved code in IdeControllerMenu.asm so that the default port addresses for all IDE interfaces are now restored when (re-)selecting the (same) type of IDE device.
  • Also made it impossible to select a device type unless the required module is included in the loaded BIOS.
  • The version check done when loading a BIOS now uses the FLASH_SIGNATURE definition from Version.inc. Any changes affecting RomVars now only requires updating that definition. This means that changes to RomVars must be implemented in both the BIOS and XTIDECFG before being committed to the repository.
  • Added a compatibility fix for 3Com 3C503 cards to the ROM checksumming code in Buffers.asm (Buffers_GenerateChecksum).
  • SerDrive: Made some minor changes to file names and paths to improve compatibility with case sensitive environments.
  • BIOSDRVS: Made a minor size optimization which as a side effect also makes it compatible with all DOS versions including DOS version 1.
  • Library: Renamed the WAIT_RETRACE_IF_NECESSARY_THEN macro to CALL_WAIT_FOR_RETRACE_IF_NECESSARY_THEN and made a tail-call-optimized version of it (JMP_WAIT_FOR_RETRACE_IF_NECESSARY_THEN).
  • A speed optimization to the eRCL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Other minor optimizations and fixes.
File size: 7.8 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Functions for printing boot menu strings.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; BootMenuPrint_RefreshItem
25;
26; Parameters:
27; CX: Index of highlighted item
28; DS: RAMVARS segment
29; Returns:
30; Nothing
31; Corrupts registers:
32; Does not matter
33;--------------------------------------------------------------------
34BootMenuPrint_RefreshItem:
35 push bp
36 mov bp, sp
37
38 call BootMenu_GetDriveToDXforMenuitemInCX
39 mov si, g_szRomBootDash ; Standard "Rom Boot" but with a "-" at the front
40 mov al, 20h ; The space between "Rom" and "Boot"
41 jnc SHORT .ROMBoot ; display "Rom Boot" option for last entry
42
43 call FindDPT_ForDriveNumberInDL
44 jc SHORT .notOurs
45
46 call DriveDetectInfo_ConvertDPTtoBX
47 mov si, g_szDriveNumBOOTNFO ; special g_szDriveNum that prints from BDA
48 jmp SHORT .go
49
50.notOurs:
51 mov si, g_szDriveNum
52 mov bx, g_szForeignHD ; assume a hard disk for the moment
53
54 test dl, dl
55 js SHORT .go
56 mov bl, ((g_szFloppyDrv)-$$ & 0xff) ; and revisit the earlier assumption...
57
58.go:
59 mov ax, dx ; preserve DL for the floppy drive letter addition
60 call DriveXlate_ToOrBack
61
62 cmp dl, 10h ; Check if there is a character in the upper nibble
63 sbb si, 0 ; If not, backup a character to a leading space
64
65 push dx ; translated drive number
66 push bx ; sub string
67 add al, 'A' ; floppy drive letter (we always push this although
68 ; the hard disks don't ever use it, but it does no harm)
69.ROMBoot:
70 push ax
71
72 jmp SHORT BootMenuPrint_RefreshInformation.FormatRelay
73
74;--------------------------------------------------------------------
75; Prints Boot Menu title strings.
76;
77; BootMenuPrint_TitleStrings
78; Parameters:
79; Nothing
80; Returns:
81; CF: Set since menu event handled
82; Corrupts registers:
83; AX, SI, DI
84;--------------------------------------------------------------------
85BootMenuPrint_TitleStrings:
86 xor di, di ; Null character will be eaten
87 mov si, g_szBootMenuTitle
88 jmp DetectPrint_RomFoundAtSegment.BootMenuEntry
89
90
91;--------------------------------------------------------------------
92; BootMenuPrint_RefreshInformation
93; Parameters:
94; CX: Index of highlighted item
95; DS: RAMVARS segment
96; Returns:
97; CF: Set since menu event was handled successfully
98; Corrupts registers:
99; Does not matter
100;--------------------------------------------------------------------
101BootMenuPrint_RefreshInformation:
102 CALL_MENU_LIBRARY ClearInformationArea
103
104 call BootMenu_GetDriveToDXforMenuitemInCX
105 jnc SHORT BootMenuEvent_Completed ; nothing to display if "Rom Boot" option
106
107 push bp
108 mov bp, sp
109
110 mov si, g_szCapacity ; Setup print string now, carries through to print call
111
112 call FindDPT_ForDriveNumberInDL
113
114 inc dl ; are we a hard disk?
115 dec dl ; inc/dec will set SF, without modifying CF or DL
116 js SHORT .HardDiskRefreshInformation
117
118 jnc SHORT .ours ; Based on CF from FindDPT_ForDriveNumberInDL above
119 call FloppyDrive_GetType ; Get Floppy Drive type to BX
120 jmp SHORT .around
121.ours:
122 call AH8h_GetDriveParameters
123.around:
124
125 mov ax, g_szFddSizeOr ; .PrintXTFloppyType
126 test bl, bl ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)
127 jz SHORT .PushAXAndOutput
128
129 mov al, (g_szFddUnknown - $$) & 0xff ; .PrintUnknownFloppyType
130 cmp bl, FLOPPY_TYPE_35_ED
131 ja SHORT .PushAXAndOutput
132 ; Fall to .PrintKnownFloppyType
133
134;--------------------------------------------------------------------
135; .PrintKnownFloppyType
136; Parameters:
137; BX: Floppy drive type
138; Returns:
139; CF: Set since menu event was handled successfully
140; Corrupts registers:
141; AX, BX, SI, DI
142;
143; Floppy Drive Types:
144;
145; 0 Handled above
146; 1 FLOPPY_TYPE_525_DD 5 1/4 360K
147; 2 FLOPPY_TYPE_525_HD 5 1/4 1.2M
148; 3 FLOPPY_TYPE_35_DD 3 1/2 720K
149; 4 FLOPPY_TYPE_35_HD 3 1/2 1.44M
150; 5 3.5" ED on some BIOSes 3 1/2 2.88M
151; 6 FLOPPY_TYPE_35_ED 3 1/2 2.88M
152; >6 Unknown, handled above
153;
154;--------------------------------------------------------------------
155.PrintKnownFloppyType:
156 mov al, (g_szFddSize - $$) & 0xff
157 push ax
158
159 mov al, (g_szFddThreeHalf - $$) & 0xff
160 cmp bl, FLOPPY_TYPE_525_HD
161 ja SHORT .ThreeHalf
162 mov al, (g_szFddFiveQuarter - $$) & 0xff
163.ThreeHalf:
164 push ax ; "5 1/4" or "3 1/2"
165
166 xor bh, bh
167 mov al, FloppyTypes.rgbCapacityMultiplier
168 mul BYTE [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table
169
170.PushAXAndOutput:
171 push ax
172
173.FormatRelay:
174 jmp DetectPrint_FormatCSSIfromParamsInSSBP
175
176
177;--------------------------------------------------------------------
178; Prints Hard Disk Menuitem information strings.
179;
180; BootMenuPrint_HardDiskMenuitemInformation
181; Parameters:
182; DS: RAMVARS segment
183; DI: Zero if foreign drive
184; Offset to DPT if our drive
185; CF: Set if foreign drive
186; Clear if our drive
187; Returns:
188; CF: Set since menu event was handled successfully
189; Corrupts registers:
190; AX, BX, CX, DX, SI, DI, ES
191;--------------------------------------------------------------------
192.HardDiskRefreshInformation:
193 jc SHORT .HardDiskMenuitemInfoForForeignDrive ; Based on CF from FindDPT_ForDriveNumberInDL (way) above
194
195.HardDiskMenuitemInfoForOurDrive:
196 ePUSH_T ax, g_szInformation ; Add substring for our hard disk information
197
198%ifdef MODULE_EBIOS
199 ePUSH_T ax, .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
200 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_LBA
201%ifdef USE_386
202 jnz AccessDPT_GetLbaSectorCountToBXDXAX
203 jmp AH15h_GetSectorCountToBXDXAX
204%else ; ~USE_386
205 jz SHORT .NoLBA
206 jmp AccessDPT_GetLbaSectorCountToBXDXAX
207.NoLBA:
208 jmp AH15h_GetSectorCountToBXDXAX
209%endif
210%else ; ~MODULE_EBIOS
211 call AH15h_GetSectorCountToBXDXAX
212 jmp SHORT .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
213%endif ; MODULE_EBIOS
214
215.HardDiskMenuitemInfoForForeignDrive:
216 call DriveXlate_ToOrBack
217 call AH15h_GetSectorCountFromForeignDriveToBXDXAX
218
219.ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
220 ePUSH_T cx, g_szCapacityNum ; Push format substring
221 call Size_ConvertSectorCountInBXDXAXtoKiB
222 mov cx, BYTE_MULTIPLES.kiB
223 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
224 push ax ; Size in magnitude
225 push cx ; Tenths
226 push dx ; Magnitude character
227
228 test di, di ; Zero if foreign drive
229 jz SHORT BootMenuPrint_RefreshInformation.FormatRelay
230
231%include "BootMenuPrintCfg.asm" ; Inline of code to fill out remainder of information string
232 jmp DetectPrint_FormatCSSIfromParamsInSSBP
233
234
235FloppyTypes:
236.rgbCapacityMultiplier equ 120 ; Multiplier to reduce word sized values to byte size
237.rgbCapacity:
238 db 360 / FloppyTypes.rgbCapacityMultiplier ; type 1
239 db 1200 / FloppyTypes.rgbCapacityMultiplier ; type 2
240 db 720 / FloppyTypes.rgbCapacityMultiplier ; type 3
241 db 1440 / FloppyTypes.rgbCapacityMultiplier ; type 4
242 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 5
243 db 2880 / FloppyTypes.rgbCapacityMultiplier ; type 6
Note: See TracBrowser for help on using the repository browser.