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

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

Changes:

  • RESERVE_DIAGNOSTIC_CYLINDER has been completely removed as it wasted hard drive space, caused a compatibility problem with 32-bit disk access drivers under Windows 3.x and most importantly, it was in fact not needed since the same thing can be accomplished using the "User specified CHS" feature in XTIDECFG which is better because that applies only to that specific drive instead of all drives under XUB control.
  • In BIOS builds containing MODULE_EBIOS (i.e. all official builds except the Tiny build), drives with a cylinder count less than or equal to 1024 had CHS translation applied to them unnecessarily if CHS translation method was set to Auto (which is the default). This bug has been present for a long time and, as a side effect, made RESERVE_DIAGNOSTIC_CYLINDER useless since the idea behind that was to provide compatibility with other old BIOSes using NORMAL addressing mode. WARNING! With this bug now being fixed, upgrading to this revision of the BIOS will require repartitioning and reformatting any drives affected by this (BIOSDRVS.COM can be helpful in determining which drives are affected).
File size: 6.9 KB
RevLine 
[93]1; Project name : XTIDE Universal BIOS
[3]2; Description : Int 13h function AH=8h, Read Disk Drive Parameters.
3
[376]4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[526]12;
[376]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
[526]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[526]18;
[376]19
[3]20; Section containing code
21SECTION .text
22
[543]23
[3]24;--------------------------------------------------------------------
25; Int 13h function AH=8h, Read Disk Drive Parameters.
26;
27; AH8h_HandlerForReadDiskDriveParameters
28; Parameters:
[148]29; DL: Translated Drive number
30; DS:DI: Ptr to DPT (in RAMVARS segment)
[150]31; SS:BP: Ptr to IDEPACK
32; Returns with INTPACK:
[567]33; BL: Drive Type (for serial floppies only)
[3]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)
[285]37; DH: Maximum head number (0...254)
[434]38; DL: Number of drives!!!
[567]39; ES:DI: Floppy DPT (for serial floppies only)
[3]40; AH: Int 13h/40h floppy return status
[294]41; CF: 0 if successful, 1 if error
[3]42;--------------------------------------------------------------------
43AH8h_HandlerForReadDiskDriveParameters:
[332]44 test di, di
45 jz SHORT .NotOurDrive
[258]46
[3]47 call AH8h_GetDriveParameters
48
[258]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
[294]55
56.MidGame:
[258]57 call RamVars_GetCountOfKnownDrivesToAX ; assume hard disk for now, will discard if for floppies
58
[567]59 test BYTE [bp+IDEPACK.intpack+INTPACK.dl], 80h
[545]60 jnz SHORT .CalledForHardDrive
[294]61
[258]62 mov [bp+IDEPACK.intpack+INTPACK.bl], bl
63 mov [bp+IDEPACK.intpack+INTPACK.es], es
[294]64 mov [bp+IDEPACK.intpack+INTPACK.di], di
[258]65
66 call FloppyDrive_GetCountToAX
67
[545]68.CalledForHardDrive:
[258]69 mov ah, dh
[294]70
[150]71 mov [bp+IDEPACK.intpack+INTPACK.cx], cx
[258]72 xchg [bp+IDEPACK.intpack+INTPACK.dx], ax ; recover DL for BDA last status byte determination
73
[148]74 xor ah, ah
[258]75%ifdef MODULE_SERIAL_FLOPPY
[294]76 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber
[258]77%else
[148]78 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[258]79%endif
[3]80
[332]81.NotOurDrive:
82 call Int13h_CallPreviousInt13hHandler
83 jnc SHORT .MidGame
84 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[32]85
[332]86
[3]87;--------------------------------------------------------------------
88; Returns L-CHS parameters for drive and total hard disk count.
89;
[28]90; AH8h_GetDriveParameters
[3]91; Parameters:
[148]92; DS:DI: Ptr to DPT (in RAMVARS segment)
[3]93; Returns:
[567]94; BL: Drive Type (for serial floppies only)
[3]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)
[285]98; DH: Maximum head number (0...254)
[3]99; Corrupts registers:
[567]100; AX, BH
[3]101;--------------------------------------------------------------------
102AH8h_GetDriveParameters:
[227]103 call AccessDPT_GetLCHStoAXBLBH
[543]104 call AH8h_LimitAXtoMaximumLCylinders
[148]105 ; Fall to .PackReturnValues
[3]106
107;--------------------------------------------------------------------
108; Packs L-CHS values to INT 13h, AH=08h return values.
109;
[148]110; .PackReturnValues
[3]111; Parameters:
[227]112; AX: Number of L-CHS cylinders available (1...1024)
[285]113; BL: Number of L-CHS heads (1...255)
[227]114; BH: Number of L-CHS sectors per track (1...63)
[32]115; DS: RAMVARS segment
[3]116; Returns:
[567]117; BL: Drive Type (for serial floppies only)
[3]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)
[285]121; DH: Maximum head number (0...254)
[3]122; Corrupts registers:
[567]123; AX, BH
[3]124;--------------------------------------------------------------------
[148]125.PackReturnValues:
[227]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
[285]133
[258]134%ifdef MODULE_SERIAL_FLOPPY
[332]135 mov bl, [di+DPT.bFlagsHigh]
136 eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
[261]137%endif
[258]138 ret
139
[543]140
141;--------------------------------------------------------------------
142; AH8h_LimitAXtoMaximumLCylinders
143; Parameters:
144; AX: Number of total L-CHS cylinders (1...1027)
145; Returns:
146; AX: Number of usable L-CHS cylinders (1...1024)
147; Corrupts registers:
148; Nothing
149;--------------------------------------------------------------------
150AH8h_LimitAXtoMaximumLCylinders:
151 MIN_U ax, MAX_LCHS_CYLINDERS
152 ret
153
154
[258]155%ifdef MODULE_SERIAL_FLOPPY
156;
157; Floppy Disk Parameter Table. There is no way to specify more than one of these
158; for any given system, so no way to make this drive or media specific.
[261]159; So we return fixed values out of the ROM for callers who might be expecting this information.
[258]160;
[294]161; On AT systems, we return the information for a 1.44 MB disk,
[258]162; and on XT systems, we return the information for a 360 KB disk.
163;
164AH8h_FloppyDPT:
165%ifdef USE_AT
166 db 0ah << 4 | 0fh ; Offset 0: Drive timings, 1.44MB values
167%else
168 db 0dh << 4 | 0fh ; Offset 0: Drive timings, 360KB values
169%endif
170
171 db 1h << 1 | 0 ; Offset 1: Typical values of 1 for head load time
[567]172 ; DMA used (although it actually is not, but is more restrictive)
[294]173 db 25h ; Offset 2: Inactivity motor turn-off delay,
[258]174 ; Typical value of 25h for 2 second delay
175 db 02h ; Offset 3: Sector size, always 512
176
177%ifdef USE_AT
178 db 12h ; Offset 4: Sectors per track, 1.44MB value
179 db 1bh ; Offset 5: Sector gap, 1.44MB value
180%else
181 db 09h ; Offset 4: Sectors per track, 360KB value
182 db 2ah ; Offset 5: Sector gap, 360KB value
183%endif
184
185 db 0ffh ; Offset 6: Data length
186
187%ifdef USE_AT
188 db 6ch ; Offset 7: Format gap length, 1.44MB value
189%else
190 db 50h ; Offset 7: Format gap length, 360KB value
191%endif
192
193 db 0f6h ; Offset 8: Fill byte for format
194 db 0fh ; Offset 9: Head setting time
[294]195 db 08h ; Offset A: Wait for motor startup time
[258]196
197%ifdef USE_AT
198 db 79 ; Offset B: Maximum track number, 1.44MB value
199 db 0 ; Offset C: Data transfer rate, 1.44MB value
200 db 4 ; Offset D: Diskette CMOS drive type, 1.44MB value
201%else
202 db 39 ; Offset B: Maximum track number, 360KB value
203 db 80h ; Offset C: Data transfer rate, 360KB value
204 db 1 ; Offset D: Diskette CMOS drive type, 360KB value
205%endif
206%endif
Note: See TracBrowser for help on using the repository browser.