source: xtideuniversalbios/trunk/BIOS_Drive_Information_Tool/Src/AtaInfo.asm@ 520

Last change on this file since 520 was 445, checked in by krille_n_@…, 12 years ago

Changes:

  • A speed optimization to the eSHL_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.
  • Memory_SumCXbytesFromESSItoAL now returns with the zero flag set/cleared according to the result.
  • Unrolled all the 8 bit READ transfer loops to do 16 bytes per iteration. Added a new macro (UNROLL_SECTORS_IN_CX_TO_OWORDS) as part of it. Size wise this is expensive but I think it should be worth the ROM space. The WRITE transfer loops were left as is since writes are rare anyway (<10% of all disk I/O IIRC).
  • Minor optimizations and fixes here and there.
File size: 7.0 KB
Line 
1; Project name : BIOS Drive Information Tool
2; Description : Reads and prints information from ATA ID.
3
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
20; Section containing code
21SECTION .text
22
23
24;--------------------------------------------------------------------
25; AtaInfo_DisplayAtaInformationForDriveDL
26; Parameters:
27; DL: Drive Number
28; Returns:
29; Nothing
30; Corrupts registers:
31; All, except CX and DX
32;--------------------------------------------------------------------
33AtaInfo_DisplayAtaInformationForDriveDL:
34 push cx
35 push dx
36
37 ; Read ATA Information from the drive
38 call Bios_ReadAtaInfoFromDriveDLtoBX
39 call Print_ErrorMessageFromAHifError ; AH=25h is not available on many BIOSes
40 jc SHORT .SkipAtaInfoSinceError
41
42 ; Print Drive Name
43 call Print_NameFromAtaInfoInBX
44
45 ; Print Drive P-CHS parameters
46 call DisplayPCHSusingAtaInfoFromDSBX
47
48 ; Print Drive CHS sector count
49 test WORD [bx+ATA1.wFields], A1_wFields_54to58
50 jz SHORT .SkipChsSectors
51 call DisplayPCHSsectorCountUsingAtaInfoFromDXBX
52.SkipChsSectors:
53
54 ; Print Drive LBA28 sector count
55 test WORD [bx+ATA1.wCaps], A1_wCaps_LBA
56 jz SHORT .SkipLBA28
57 call DisplayLBA28sectorCountUsingAtaInfoFromDSBX
58.SkipLBA28:
59
60 ; Print Drive LBA48 sector count
61 test WORD [bx+ATA6.wSetSup83], A6_wSetSup83_LBA48
62 jz SHORT .SkipLBA48
63 call DisplayLBA48sectorCountUsingAtaInfoFromDSBX
64.SkipLBA48:
65
66 ; Print block mode information
67 call DisplayBlockModeInformationUsingAtaInfoFromDSBX
68
69 ; Print PIO mode information
70 call DisplayPioModeInformationUsingAtaInfoFromDSBX
71
72 ; Print L-CHS generated by XTIDE Universal BIOS
73 call DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX
74
75.SkipAtaInfoSinceError:
76 pop dx
77 pop cx
78 ret
79
80
81;--------------------------------------------------------------------
82; DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX
83; Parameters:
84; BX: Offset to ATA Information
85; Returns:
86; Nothing
87; Corrupts registers:
88; AX, CX, DX, BP, SI, DI
89;--------------------------------------------------------------------
90DisplayPCHSusingAtaInfoFromDSBX:
91 mov si, bx ; DS == ES
92 call AtaGeometry_GetPCHStoAXBLBHfromAtaInfoInESSI
93 xchg cx, ax
94 eMOVZX dx, bl
95 eMOVZX ax, bh
96 call Print_CHSfromCXDXAX
97 mov bx, si ; Restore BX
98 ret
99
100
101;--------------------------------------------------------------------
102; DisplayPCHSsectorCountUsingAtaInfoFromDXBX
103; Parameters:
104; BX: Offset to ATA Information
105; Returns:
106; Nothing
107; Corrupts registers:
108; AX, DX, BP, SI, DI
109;--------------------------------------------------------------------
110DisplayPCHSsectorCountUsingAtaInfoFromDXBX:
111 mov si, g_szChsSectors
112 call Print_NullTerminatedStringFromSI
113
114 mov si, bx
115 mov ax, [si+ATA1.dwCurSCnt]
116 mov dx, [si+ATA1.dwCurSCnt+2]
117 xor bx, bx
118 call Print_TotalSectorsFromBXDXAX
119 mov bx, si ; Restore BX
120 ret
121
122
123;--------------------------------------------------------------------
124; DisplayLBA28sectorCountUsingAtaInfoFromDSBX
125; Parameters:
126; BX: Offset to ATA Information
127; Returns:
128; Nothing
129; Corrupts registers:
130; AX, DX, BP, SI, DI
131;--------------------------------------------------------------------
132DisplayLBA28sectorCountUsingAtaInfoFromDSBX:
133 mov si, g_szLBA28
134 call Print_NullTerminatedStringFromSI
135
136 mov si, bx
137 mov ax, [si+ATA1.dwLBACnt]
138 mov dx, [si+ATA1.dwLBACnt+2]
139 xor bx, bx
140 call Print_TotalSectorsFromBXDXAX
141 mov bx, si ; Restore BX
142 ret
143
144
145;--------------------------------------------------------------------
146; DisplayLBA48sectorCountUsingAtaInfoFromDSBX
147; Parameters:
148; BX: Offset to ATA Information
149; Returns:
150; Nothing
151; Corrupts registers:
152; AX, DX, BP, SI, DI
153;--------------------------------------------------------------------
154DisplayLBA48sectorCountUsingAtaInfoFromDSBX:
155 mov si, g_szLBA48
156 call Print_NullTerminatedStringFromSI
157
158 mov si, bx
159 mov ax, [si+ATA6.qwLBACnt]
160 mov dx, [si+ATA6.qwLBACnt+2]
161 mov bx, [si+ATA6.qwLBACnt+4]
162 call Print_TotalSectorsFromBXDXAX
163 mov bx, si ; Restore BX
164 ret
165
166
167;--------------------------------------------------------------------
168; DisplayBlockModeInformationUsingAtaInfoFromDSBX
169; Parameters:
170; BX: Offset to ATA Information
171; Returns:
172; Nothing
173; Corrupts registers:
174; AX, DX, BP, SI, DI
175;--------------------------------------------------------------------
176DisplayBlockModeInformationUsingAtaInfoFromDSBX:
177 eMOVZX ax, [bx+ATA1.bBlockSel] ; ATA2+ has flag on high word
178 cwd
179 mov dl, [bx+ATA1.bBlckSize]
180 mov si, g_szBlockMode
181 jmp Print_FormatStringFromSIwithParametersInAXDX
182
183
184;--------------------------------------------------------------------
185; DisplayPioModeInformationUsingAtaInfoFromDSBX
186; Parameters:
187; BX: Offset to ATA Information
188; Returns:
189; Nothing
190; Corrupts registers:
191; AX, CX, DX, BP, SI, DI
192;--------------------------------------------------------------------
193DisplayPioModeInformationUsingAtaInfoFromDSBX:
194 ; Load standard timings (up to PIO-2)
195 mov ax, [bx+ATA1.bPioMode]
196 mov si, ax
197 shl si, 1 ; Shift for WORD lookup
198 mov dx, [si+.rgwStandardPioTimings] ; Load min cycle time
199 mov cx, -1 ; IORDY not supported
200
201 ; Replace with advanced mode timings (PIO-3 and up)
202 test BYTE [bx+ATA2.wFields], A2_wFields_64to70
203 jz SHORT .NoAdvancedPioModesSupported
204
205 mov si, [bx+ATA2.bPIOSupp] ; Advanced mode flags
206.IncrementPioMode:
207 inc ax
208 shr si, 1
209 jnz SHORT .IncrementPioMode
210 mov dx, [bx+ATA2.wPIOMinCy]
211 mov cx, [bx+ATA2.wPIOMinCyF]
212
213.NoAdvancedPioModesSupported:
214 mov si, g_szPIO
215 jmp Print_FormatStringFromSIwithParametersInAXDXCX
216
217.rgwStandardPioTimings:
218 dw PIO_0_MIN_CYCLE_TIME_NS
219 dw PIO_1_MIN_CYCLE_TIME_NS
220 dw PIO_2_MIN_CYCLE_TIME_NS
221
222
223;--------------------------------------------------------------------
224; DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX
225; Parameters:
226; BX: Offset to ATA Information
227; Returns:
228; Nothing
229; Corrupts registers:
230; AX, BX, CX, DX, BP, SI, DI
231;--------------------------------------------------------------------
232DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX:
233 ; Display header
234 mov ax, g_szXTUBversion
235 mov si, g_szXTUB
236 call Print_FormatStringFromSIwithParameterInAX
237
238 ; Display translation mode and L-CHS
239 mov si, bx ; DS == ES
240 mov dx, TRANSLATEMODE_AUTO
241 call AtaGeometry_GetLCHStoAXBLBHfromAtaInfoInESSIandTranslateModeInDX
242 dec ax ; Reserve diagnostics cylinder
243 MIN_U ax, MAX_LCHS_CYLINDERS
244 jmp Print_ModeFromDLandCHSfromAXLBH
Note: See TracBrowser for help on using the repository browser.