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

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