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

Last change on this file since 566 was 545, checked in by aitotat@…, 11 years ago

Changes to XTIDE Universal BIOS:

  • Integrated XT-CFv3 support by James Pearce.
  • XT-CFv2 memory mapped I/O and DMA modes are no longer supported (but PIO mode is).
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:
[258]33; BL: Drive Type (for 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!!!
[258]39; ES:DI: Floppy DPT (for 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
59 test byte [bp+IDEPACK.intpack+INTPACK.dl], 080h
[545]60 jnz SHORT .CalledForHardDrive
[294]61
[258]62 mov [bp+IDEPACK.intpack+INTPACK.bl], bl
63
64 mov [bp+IDEPACK.intpack+INTPACK.es], es
[294]65 mov [bp+IDEPACK.intpack+INTPACK.di], di
[258]66
67 call FloppyDrive_GetCountToAX
68
[545]69.CalledForHardDrive:
[258]70 mov ah, dh
[294]71
[150]72 mov [bp+IDEPACK.intpack+INTPACK.cx], cx
[258]73 xchg [bp+IDEPACK.intpack+INTPACK.dx], ax ; recover DL for BDA last status byte determination
74
[148]75 xor ah, ah
[258]76%ifdef MODULE_SERIAL_FLOPPY
[294]77 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber
[258]78%else
[148]79 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[258]80%endif
[3]81
[332]82.NotOurDrive:
83 call Int13h_CallPreviousInt13hHandler
84 jnc SHORT .MidGame
85 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[32]86
[332]87
[3]88;--------------------------------------------------------------------
89; Returns L-CHS parameters for drive and total hard disk count.
90;
[28]91; AH8h_GetDriveParameters
[3]92; Parameters:
[148]93; DS:DI: Ptr to DPT (in RAMVARS segment)
[3]94; Returns:
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:
[148]100; AX, BX
[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:
117; CH: Maximum cylinder number, bits 7...0
118; CL: Bits 7...6: Cylinder number bits 9...8
119; Bits 5...0: Maximum sector number (1...63)
[285]120; DH: Maximum head number (0...254)
[3]121; Corrupts registers:
122; AX, BX
123;--------------------------------------------------------------------
[148]124.PackReturnValues:
[227]125 dec ax ; AX = Number of last cylinder
126 dec bx ; BL = Number of last head
127 xchg cx, ax
128 xchg cl, ch ; CH = Last cylinder bits 0...7
129 eROR_IM cl, 2 ; CL bits 6...7 = Last cylinder bits 8...9
130 or cl, bh ; CL bits 0...5 = Sectors per track
131 mov dh, bl ; DH = Maximum head number
[285]132
[258]133%ifdef MODULE_SERIAL_FLOPPY
[332]134 mov bl, [di+DPT.bFlagsHigh]
135 eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
[261]136%endif
[258]137 ret
138
[543]139
140;--------------------------------------------------------------------
141; AH8h_LimitAXtoMaximumLCylinders
142; Parameters:
143; AX: Number of total L-CHS cylinders (1...1027)
144; Returns:
145; AX: Number of usable L-CHS cylinders (1...1024)
146; Corrupts registers:
147; Nothing
148;--------------------------------------------------------------------
149AH8h_LimitAXtoMaximumLCylinders:
150%ifdef RESERVE_DIAGNOSTIC_CYLINDER
151 dec ax
152%endif
153 MIN_U ax, MAX_LCHS_CYLINDERS
154 ret
155
156
[258]157%ifdef MODULE_SERIAL_FLOPPY
158;
159; Floppy Disk Parameter Table. There is no way to specify more than one of these
160; for any given system, so no way to make this drive or media specific.
[261]161; So we return fixed values out of the ROM for callers who might be expecting this information.
[258]162;
[294]163; On AT systems, we return the information for a 1.44 MB disk,
[258]164; and on XT systems, we return the information for a 360 KB disk.
165;
166AH8h_FloppyDPT:
167%ifdef USE_AT
168 db 0ah << 4 | 0fh ; Offset 0: Drive timings, 1.44MB values
169%else
170 db 0dh << 4 | 0fh ; Offset 0: Drive timings, 360KB values
171%endif
172
173 db 1h << 1 | 0 ; Offset 1: Typical values of 1 for head load time
[294]174 ; DMA used (although it actually is not, but is more restrictive)
175 db 25h ; Offset 2: Inactivity motor turn-off delay,
[258]176 ; Typical value of 25h for 2 second delay
177 db 02h ; Offset 3: Sector size, always 512
178
179%ifdef USE_AT
180 db 12h ; Offset 4: Sectors per track, 1.44MB value
181 db 1bh ; Offset 5: Sector gap, 1.44MB value
182%else
183 db 09h ; Offset 4: Sectors per track, 360KB value
184 db 2ah ; Offset 5: Sector gap, 360KB value
185%endif
186
187 db 0ffh ; Offset 6: Data length
188
189%ifdef USE_AT
190 db 6ch ; Offset 7: Format gap length, 1.44MB value
191%else
192 db 50h ; Offset 7: Format gap length, 360KB value
193%endif
194
195 db 0f6h ; Offset 8: Fill byte for format
196 db 0fh ; Offset 9: Head setting time
[294]197 db 08h ; Offset A: Wait for motor startup time
[258]198
199%ifdef USE_AT
200 db 79 ; Offset B: Maximum track number, 1.44MB value
201 db 0 ; Offset C: Data transfer rate, 1.44MB value
202 db 4 ; Offset D: Diskette CMOS drive type, 1.44MB value
203%else
204 db 39 ; Offset B: Maximum track number, 360KB value
205 db 80h ; Offset C: Data transfer rate, 360KB value
206 db 1 ; Offset D: Diskette CMOS drive type, 360KB value
207%endif
208%endif
Note: See TracBrowser for help on using the repository browser.