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

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 6.4 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-2012 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; Int 13h function AH=8h, Read Disk Drive Parameters.
25;
26; AH8h_HandlerForReadDiskDriveParameters
27;   Parameters:
28;       DL:     Translated Drive number
29;       DS:DI:  Ptr to DPT (in RAMVARS segment)
30;       SS:BP:  Ptr to IDEPACK
31;   Returns with INTPACK:
32;       BL:     Drive Type (for floppies only)
33;       CH:     Maximum cylinder number, bits 7...0
34;       CL:     Bits 7...6: Cylinder number bits 9...8
35;               Bits 5...0: Maximum sector number (1...63)
36;       DH:     Maximum head number (0...254)
37;       DL:     Number of drives
38;       ES:DI:  Floppy DPT (for floppies only)
39;       AH:     Int 13h/40h floppy return status
40;       CF:     0 if successful, 1 if error
41;--------------------------------------------------------------------
42AH8h_HandlerForReadDiskDriveParameters:
43    test    di, di
44    jz      SHORT .NotOurDrive
45
46    call    AH8h_GetDriveParameters
47
48%ifdef MODULE_SERIAL_FLOPPY
49    push    cs                          ; setup registers if we are a floppy drive, in all cases
50    pop     es                          ; if it is not a floppy drive, these values will not be put in INTPACK
51    mov     di, AH8h_FloppyDPT
52%endif
53    ;; fall-through
54
55.MidGame:
56    call    RamVars_GetCountOfKnownDrivesToAX       ; assume hard disk for now, will discard if for floppies
57
58    test    byte [bp+IDEPACK.intpack+INTPACK.dl], 080h
59    jnz     .Done
60
61    mov     [bp+IDEPACK.intpack+INTPACK.bl], bl
62
63    mov     [bp+IDEPACK.intpack+INTPACK.es], es
64    mov     [bp+IDEPACK.intpack+INTPACK.di], di
65
66    call    FloppyDrive_GetCountToAX
67
68.Done:
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;       CH:     Maximum cylinder number, bits 7...0
95;       CL:     Bits 7...6: Cylinder number bits 9...8
96;               Bits 5...0: Maximum sector number (1...63)
97;       DH:     Maximum head number (0...254)
98;   Corrupts registers:
99;       AX, BX
100;--------------------------------------------------------------------
101AH8h_GetDriveParameters:
102    call    AccessDPT_GetLCHStoAXBLBH
103    ; Fall to .PackReturnValues
104
105;--------------------------------------------------------------------
106; Packs L-CHS values to INT 13h, AH=08h return values.
107;
108; .PackReturnValues
109;   Parameters:
110;       AX:     Number of L-CHS cylinders available (1...1024)
111;       BL:     Number of L-CHS heads (1...255)
112;       BH:     Number of L-CHS sectors per track (1...63)
113;       DS:     RAMVARS segment
114;   Returns:
115;       CH:     Maximum cylinder number, bits 7...0
116;       CL:     Bits 7...6: Cylinder number bits 9...8
117;               Bits 5...0: Maximum sector number (1...63)
118;       DH:     Maximum head number (0...254)
119;   Corrupts registers:
120;       AX, BX
121;--------------------------------------------------------------------
122.PackReturnValues:
123    dec     ax                      ; AX = Number of last cylinder
124    dec     bx                      ; BL = Number of last head
125    xchg    cx, ax
126    xchg    cl, ch                  ; CH = Last cylinder bits 0...7
127    eROR_IM cl, 2                   ; CL bits 6...7 = Last cylinder bits 8...9
128    or      cl, bh                  ; CL bits 0...5 = Sectors per track
129    mov     dh, bl                  ; DH = Maximum head number
130
131%ifdef MODULE_SERIAL_FLOPPY
132    mov     bl, [di+DPT.bFlagsHigh]
133%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS             ; not sure why this is needed for preprocessor-only
134    eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
135%endif
136%endif
137    ret
138
139%ifdef MODULE_SERIAL_FLOPPY
140;
141; Floppy Disk Parameter Table.  There is no way to specify more than one of these
142; for any given system, so no way to make this drive or media specific.
143; So we return fixed values out of the ROM for callers who might be expecting this information.
144;
145; On AT systems, we return the information for a 1.44 MB disk,
146; and on XT systems, we return the information for a 360 KB disk.
147;
148AH8h_FloppyDPT:
149%ifdef USE_AT
150    db      0ah << 4 | 0fh          ; Offset 0: Drive timings, 1.44MB values
151%else
152    db      0dh << 4 | 0fh          ; Offset 0: Drive timings, 360KB values
153%endif
154
155    db      1h << 1 | 0             ; Offset 1: Typical values of 1 for head load time
156                                    ;           DMA used (although it actually is not, but is more restrictive)
157    db      25h                     ; Offset 2: Inactivity motor turn-off delay,
158                                    ;           Typical value of 25h for 2 second delay
159    db      02h                     ; Offset 3: Sector size, always 512
160
161%ifdef USE_AT
162    db      12h                     ; Offset 4: Sectors per track, 1.44MB value
163    db      1bh                     ; Offset 5: Sector gap, 1.44MB value
164%else
165    db      09h                     ; Offset 4: Sectors per track, 360KB value
166    db      2ah                     ; Offset 5: Sector gap, 360KB value
167%endif
168
169    db      0ffh                    ; Offset 6: Data length
170
171%ifdef USE_AT
172    db      6ch                     ; Offset 7: Format gap length, 1.44MB value
173%else
174    db      50h                     ; Offset 7: Format gap length, 360KB value
175%endif
176
177    db      0f6h                    ; Offset 8: Fill byte for format
178    db      0fh                     ; Offset 9: Head setting time
179    db      08h                     ; Offset A: Wait for motor startup time
180
181%ifdef USE_AT
182    db      79                      ; Offset B: Maximum track number, 1.44MB value
183    db      0                       ; Offset C: Data transfer rate, 1.44MB value
184    db      4                       ; Offset D: Diskette CMOS drive type, 1.44MB value
185%else
186    db      39                      ; Offset B: Maximum track number, 360KB value
187    db      80h                     ; Offset C: Data transfer rate, 360KB value
188    db      1                       ; Offset D: Diskette CMOS drive type, 360KB value
189%endif
190%endif
Note: See TracBrowser for help on using the repository browser.