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

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

Changes to XTIDE Universal BIOS:

  • Compatible DPTs can no longer have more than 1024 cylinders.
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
60    jnz     .Done
[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
[294]69.Done:
[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]
[261]135%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS             ; not sure why this is needed for preprocessor-only
[332]136    eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
[261]137%endif
[294]138%endif
[258]139    ret
140
[543]141
142;--------------------------------------------------------------------
143; AH8h_LimitAXtoMaximumLCylinders
144;   Parameters:
145;       AX:     Number of total L-CHS cylinders (1...1027)
146;   Returns:
147;       AX:     Number of usable L-CHS cylinders (1...1024)
148;   Corrupts registers:
149;       Nothing
150;--------------------------------------------------------------------
151AH8h_LimitAXtoMaximumLCylinders:
152%ifdef RESERVE_DIAGNOSTIC_CYLINDER
153    dec     ax
154%endif
155    MIN_U   ax, MAX_LCHS_CYLINDERS
156    ret
157
158
[258]159%ifdef MODULE_SERIAL_FLOPPY
160;
161; Floppy Disk Parameter Table.  There is no way to specify more than one of these
162; for any given system, so no way to make this drive or media specific.
[261]163; So we return fixed values out of the ROM for callers who might be expecting this information.
[258]164;
[294]165; On AT systems, we return the information for a 1.44 MB disk,
[258]166; and on XT systems, we return the information for a 360 KB disk.
167;
168AH8h_FloppyDPT:
169%ifdef USE_AT
170    db      0ah << 4 | 0fh          ; Offset 0: Drive timings, 1.44MB values
171%else
172    db      0dh << 4 | 0fh          ; Offset 0: Drive timings, 360KB values
173%endif
174
175    db      1h << 1 | 0             ; Offset 1: Typical values of 1 for head load time
[294]176                                    ;           DMA used (although it actually is not, but is more restrictive)
177    db      25h                     ; Offset 2: Inactivity motor turn-off delay,
[258]178                                    ;           Typical value of 25h for 2 second delay
179    db      02h                     ; Offset 3: Sector size, always 512
180
181%ifdef USE_AT
182    db      12h                     ; Offset 4: Sectors per track, 1.44MB value
183    db      1bh                     ; Offset 5: Sector gap, 1.44MB value
184%else
185    db      09h                     ; Offset 4: Sectors per track, 360KB value
186    db      2ah                     ; Offset 5: Sector gap, 360KB value
187%endif
188
189    db      0ffh                    ; Offset 6: Data length
190
191%ifdef USE_AT
192    db      6ch                     ; Offset 7: Format gap length, 1.44MB value
193%else
194    db      50h                     ; Offset 7: Format gap length, 360KB value
195%endif
196
197    db      0f6h                    ; Offset 8: Fill byte for format
198    db      0fh                     ; Offset 9: Head setting time
[294]199    db      08h                     ; Offset A: Wait for motor startup time
[258]200
201%ifdef USE_AT
202    db      79                      ; Offset B: Maximum track number, 1.44MB value
203    db      0                       ; Offset C: Data transfer rate, 1.44MB value
204    db      4                       ; Offset D: Diskette CMOS drive type, 1.44MB value
205%else
206    db      39                      ; Offset B: Maximum track number, 360KB value
207    db      80h                     ; Offset C: Data transfer rate, 360KB value
208    db      1                       ; Offset D: Diskette CMOS drive type, 360KB value
209%endif
210%endif
Note: See TracBrowser for help on using the repository browser.