source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm@ 614

Last change on this file since 614 was 612, checked in by Krister Nordvall, 3 years ago

Changes:

  • BIOSDRVS builds again (broken since r609). Also removed the last remnants of RESERVE_DIAGNOSTIC_CYLINDER from BIOSDRVS that I missed in r606.
  • Put in a limit on the P-CHS cylinder count in an attempt to improve compatibility with some CF cards that violates the ATA specification. The limit applies only to the BIOS. BIOSDRVS will continue to show the true cylinder count since we might want to add code later to warn the user when encountering incompatible drives like these.
  • Optimized the bug fix in r611.
  • Updated the copyright notices in XTIDECFG and BIOSDRVS.
File size: 6.5 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=8h, Read Disk Drive Parameters.
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;--------------------------------------------------------------------
25; Int 13h function AH=8h, Read Disk Drive Parameters.
26;
27; AH8h_HandlerForReadDiskDriveParameters
28; Parameters:
29; DL: Translated Drive number
30; DS:DI: Ptr to DPT (in RAMVARS segment)
31; SS:BP: Ptr to IDEPACK
32; Returns with INTPACK:
33; BL: Drive Type (for serial floppies only)
34; CH: Maximum cylinder number, bits 7...0
35; CL: Bits 7...6: Cylinder number bits 9...8
36; Bits 5...0: Maximum sector number (1...63)
37; DH: Maximum head number (0...254)
38; DL: Number of drives!!!
39; ES:DI: Floppy DPT (for serial floppies only)
40; AH: Int 13h/40h floppy return status
41; CF: 0 if successful, 1 if error
42;--------------------------------------------------------------------
43AH8h_HandlerForReadDiskDriveParameters:
44 test di, di
45 jz SHORT .NotOurDrive
46
47 call AH8h_GetDriveParameters
48
49%ifdef MODULE_SERIAL_FLOPPY
50 push cs ; setup registers if we are a floppy drive, in all cases
51 pop es ; if it is not a floppy drive, these values will not be put in INTPACK
52 mov di, AH8h_FloppyDPT
53%endif
54 ;; fall-through
55
56.MidGame:
57 call RamVars_GetCountOfKnownDrivesToAX ; assume hard disk for now, will discard if for floppies
58
59 test BYTE [bp+IDEPACK.intpack+INTPACK.dl], 80h
60 jnz SHORT .CalledForHardDrive
61
62 mov [bp+IDEPACK.intpack+INTPACK.bl], bl
63 mov [bp+IDEPACK.intpack+INTPACK.es], es
64 mov [bp+IDEPACK.intpack+INTPACK.di], di
65
66 call FloppyDrive_GetCountToAX
67
68.CalledForHardDrive:
69 mov ah, dh
70
71 mov [bp+IDEPACK.intpack+INTPACK.cx], cx
72 xchg [bp+IDEPACK.intpack+INTPACK.dx], ax ; recover DL for BDA last status byte determination
73
74 xor ah, ah
75%ifdef MODULE_SERIAL_FLOPPY
76 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber
77%else
78 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
79%endif
80
81.NotOurDrive:
82 call Int13h_CallPreviousInt13hHandler
83 jnc SHORT .MidGame
84 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
85
86
87;--------------------------------------------------------------------
88; Returns L-CHS parameters for drive and total hard disk count.
89;
90; AH8h_GetDriveParameters
91; Parameters:
92; DS:DI: Ptr to DPT (in RAMVARS segment)
93; Returns:
94; BL: Drive Type (for serial floppies only)
95; CH: Maximum cylinder number, bits 7...0
96; CL: Bits 7...6: Cylinder number bits 9...8
97; Bits 5...0: Maximum sector number (1...63)
98; DH: Maximum head number (0...254)
99; Corrupts registers:
100; AX, BH
101;--------------------------------------------------------------------
102AH8h_GetDriveParameters:
103 call AccessDPT_GetLCHStoAXBLBH
104 call AtaGeometry_LimitAXtoMaximumLCylinders
105 ; Fall to .PackReturnValues
106
107;--------------------------------------------------------------------
108; Packs L-CHS values to INT 13h, AH=08h return values.
109;
110; .PackReturnValues
111; Parameters:
112; AX: Number of L-CHS cylinders available (1...1024)
113; BL: Number of L-CHS heads (1...255)
114; BH: Number of L-CHS sectors per track (1...63)
115; DS: RAMVARS segment
116; Returns:
117; BL: Drive Type (for serial floppies only)
118; CH: Maximum cylinder number, bits 7...0
119; CL: Bits 7...6: Cylinder number bits 9...8
120; Bits 5...0: Maximum sector number (1...63)
121; DH: Maximum head number (0...254)
122; Corrupts registers:
123; AX, BH
124;--------------------------------------------------------------------
125.PackReturnValues:
126 dec ax ; AX = Number of last cylinder
127 dec bx ; BL = Number of last head
128 xchg cx, ax
129 xchg cl, ch ; CH = Last cylinder bits 0...7
130 eROR_IM cl, 2 ; CL bits 6...7 = Last cylinder bits 8...9
131 or cl, bh ; CL bits 0...5 = Sectors per track
132 mov dh, bl ; DH = Maximum head number
133
134%ifdef MODULE_SERIAL_FLOPPY
135 mov bl, [di+DPT.bFlagsHigh]
136 eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
137%endif
138 ret
139
140
141%ifdef MODULE_SERIAL_FLOPPY
142;
143; Floppy Disk Parameter Table. There is no way to specify more than one of these
144; for any given system, so no way to make this drive or media specific.
145; So we return fixed values out of the ROM for callers who might be expecting this information.
146;
147; On AT systems, we return the information for a 1.44 MB disk,
148; and on XT systems, we return the information for a 360 KB disk.
149;
150AH8h_FloppyDPT:
151%ifdef USE_AT
152 db 0ah << 4 | 0fh ; Offset 0: Drive timings, 1.44MB values
153%else
154 db 0dh << 4 | 0fh ; Offset 0: Drive timings, 360KB values
155%endif
156
157 db 1h << 1 | 0 ; Offset 1: Typical values of 1 for head load time
158 ; DMA used (although it actually is not, but is more restrictive)
159 db 25h ; Offset 2: Inactivity motor turn-off delay,
160 ; Typical value of 25h for 2 second delay
161 db 02h ; Offset 3: Sector size, always 512
162
163%ifdef USE_AT
164 db 12h ; Offset 4: Sectors per track, 1.44MB value
165 db 1bh ; Offset 5: Sector gap, 1.44MB value
166%else
167 db 09h ; Offset 4: Sectors per track, 360KB value
168 db 2ah ; Offset 5: Sector gap, 360KB value
169%endif
170
171 db 0ffh ; Offset 6: Data length
172
173%ifdef USE_AT
174 db 6ch ; Offset 7: Format gap length, 1.44MB value
175%else
176 db 50h ; Offset 7: Format gap length, 360KB value
177%endif
178
179 db 0f6h ; Offset 8: Fill byte for format
180 db 0fh ; Offset 9: Head setting time
181 db 08h ; Offset A: Wait for motor startup time
182
183%ifdef USE_AT
184 db 79 ; Offset B: Maximum track number, 1.44MB value
185 db 0 ; Offset C: Data transfer rate, 1.44MB value
186 db 4 ; Offset D: Diskette CMOS drive type, 1.44MB value
187%else
188 db 39 ; Offset B: Maximum track number, 360KB value
189 db 80h ; Offset C: Data transfer rate, 360KB value
190 db 1 ; Offset D: Diskette CMOS drive type, 360KB value
191%endif
192%endif
Note: See TracBrowser for help on using the repository browser.