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

Last change on this file since 606 was 606, checked in by krille_n_, 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.