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
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    AH8h_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;--------------------------------------------------------------------
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
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.
159; So we return fixed values out of the ROM for callers who might be expecting this information.
160;
161; On AT systems, we return the information for a 1.44 MB disk,
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
172                                    ;           DMA used (although it actually is not, but is more restrictive)
173    db      25h                     ; Offset 2: Inactivity motor turn-off delay,
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
195    db      08h                     ; Offset A: Wait for motor startup time
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.