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

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

Changes:

  • Fixed a bug in the new BIOS Drive Information Tool.
  • Very small changes to improve speed (I hope).
  • Changed AH48h_GetExtendedDriveParameters.asm to allow AT builds with USE_386 (won't affect any other builds).
  • Verified that most define combinations can be built and changed Strings.asm accordingly. "Most" meaning with or without any combination of EBIOS and/or Serial code defines.
File size: 5.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 13h function AH=8h, Read Disk Drive Parameters.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Int 13h function AH=8h, Read Disk Drive Parameters.
9;
10; AH8h_HandlerForReadDiskDriveParameters
11;   Parameters:
12;       DL:     Translated Drive number
13;       DS:DI:  Ptr to DPT (in RAMVARS segment)
14;       SS:BP:  Ptr to IDEPACK
15;   Returns with INTPACK:
16;       BL:     Drive Type (for floppies only)
17;       CH:     Maximum cylinder number, bits 7...0
18;       CL:     Bits 7...6: Cylinder number bits 9...8
19;               Bits 5...0: Maximum sector number (1...63)
20;       DH:     Maximum head number (0...254)
21;       DL:     Number of drives
22;       ES:DI:  Floppy DPT (for floppies only)
23;       AH:     Int 13h/40h floppy return status
24;       CF:     0 if successful, 1 if error
25;--------------------------------------------------------------------
26AH8h_HandlerForReadDiskDriveParameters:
27    test    di, di
28    jz      SHORT .NotOurDrive
29
30    call    AH8h_GetDriveParameters
31
32%ifdef MODULE_SERIAL_FLOPPY
33    push    cs                          ; setup registers if we are a floppy drive, in all cases
34    pop     es                          ; if it is not a floppy drive, these values will not be put in INTPACK
35    mov     di, AH8h_FloppyDPT
36%endif
37    ;; fall-through
38
39.MidGame:
40    call    RamVars_GetCountOfKnownDrivesToAX       ; assume hard disk for now, will discard if for floppies
41
42    test    byte [bp+IDEPACK.intpack+INTPACK.dl], 080h
43    jnz     .Done
44
45    mov     [bp+IDEPACK.intpack+INTPACK.bl], bl
46
47    mov     [bp+IDEPACK.intpack+INTPACK.es], es
48    mov     [bp+IDEPACK.intpack+INTPACK.di], di
49
50    call    FloppyDrive_GetCountToAX
51
52.Done:
53    mov     ah, dh
54
55    mov     [bp+IDEPACK.intpack+INTPACK.cx], cx
56    xchg    [bp+IDEPACK.intpack+INTPACK.dx], ax     ; recover DL for BDA last status byte determination
57
58    xor     ah, ah
59%ifdef MODULE_SERIAL_FLOPPY
60    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber
61%else
62    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
63%endif
64
65.NotOurDrive:
66    call    Int13h_CallPreviousInt13hHandler
67    jnc     SHORT .MidGame
68    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
69
70
71;--------------------------------------------------------------------
72; Returns L-CHS parameters for drive and total hard disk count.
73;
74; AH8h_GetDriveParameters
75;   Parameters:
76;       DS:DI:  Ptr to DPT (in RAMVARS segment)
77;   Returns:
78;       CH:     Maximum cylinder number, bits 7...0
79;       CL:     Bits 7...6: Cylinder number bits 9...8
80;               Bits 5...0: Maximum sector number (1...63)
81;       DH:     Maximum head number (0...254)
82;   Corrupts registers:
83;       AX, BX
84;--------------------------------------------------------------------
85AH8h_GetDriveParameters:
86    call    AccessDPT_GetLCHStoAXBLBH
87    ; Fall to .PackReturnValues
88
89;--------------------------------------------------------------------
90; Packs L-CHS values to INT 13h, AH=08h return values.
91;
92; .PackReturnValues
93;   Parameters:
94;       AX:     Number of L-CHS cylinders available (1...1024)
95;       BL:     Number of L-CHS heads (1...255)
96;       BH:     Number of L-CHS sectors per track (1...63)
97;       DS:     RAMVARS segment
98;   Returns:
99;       CH:     Maximum cylinder number, bits 7...0
100;       CL:     Bits 7...6: Cylinder number bits 9...8
101;               Bits 5...0: Maximum sector number (1...63)
102;       DH:     Maximum head number (0...254)
103;   Corrupts registers:
104;       AX, BX
105;--------------------------------------------------------------------
106.PackReturnValues:
107    dec     ax                      ; AX = Number of last cylinder
108    dec     bx                      ; BL = Number of last head
109    xchg    cx, ax
110    xchg    cl, ch                  ; CH = Last cylinder bits 0...7
111    eROR_IM cl, 2                   ; CL bits 6...7 = Last cylinder bits 8...9
112    or      cl, bh                  ; CL bits 0...5 = Sectors per track
113    mov     dh, bl                  ; DH = Maximum head number
114
115%ifdef MODULE_SERIAL_FLOPPY
116    mov     bl, [di+DPT.bFlagsHigh]
117%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS             ; not sure why this is needed for preprocessor-only
118    eSHR_IM bl, FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION
119%endif
120%endif
121    ret
122
123%ifdef MODULE_SERIAL_FLOPPY
124;
125; Floppy Disk Parameter Table.  There is no way to specify more than one of these
126; for any given system, so no way to make this drive or media specific.
127; So we return fixed values out of the ROM for callers who might be expecting this information.
128;
129; On AT systems, we return the information for a 1.44 MB disk,
130; and on XT systems, we return the information for a 360 KB disk.
131;
132AH8h_FloppyDPT:
133%ifdef USE_AT
134    db      0ah << 4 | 0fh          ; Offset 0: Drive timings, 1.44MB values
135%else
136    db      0dh << 4 | 0fh          ; Offset 0: Drive timings, 360KB values
137%endif
138
139    db      1h << 1 | 0             ; Offset 1: Typical values of 1 for head load time
140                                    ;           DMA used (although it actually is not, but is more restrictive)
141    db      25h                     ; Offset 2: Inactivity motor turn-off delay,
142                                    ;           Typical value of 25h for 2 second delay
143    db      02h                     ; Offset 3: Sector size, always 512
144
145%ifdef USE_AT
146    db      12h                     ; Offset 4: Sectors per track, 1.44MB value
147    db      1bh                     ; Offset 5: Sector gap, 1.44MB value
148%else
149    db      09h                     ; Offset 4: Sectors per track, 360KB value
150    db      2ah                     ; Offset 5: Sector gap, 360KB value
151%endif
152
153    db      0ffh                    ; Offset 6: Data length
154
155%ifdef USE_AT
156    db      6ch                     ; Offset 7: Format gap length, 1.44MB value
157%else
158    db      50h                     ; Offset 7: Format gap length, 360KB value
159%endif
160
161    db      0f6h                    ; Offset 8: Fill byte for format
162    db      0fh                     ; Offset 9: Head setting time
163    db      08h                     ; Offset A: Wait for motor startup time
164
165%ifdef USE_AT
166    db      79                      ; Offset B: Maximum track number, 1.44MB value
167    db      0                       ; Offset C: Data transfer rate, 1.44MB value
168    db      4                       ; Offset D: Diskette CMOS drive type, 1.44MB value
169%else
170    db      39                      ; Offset B: Maximum track number, 360KB value
171    db      80h                     ; Offset C: Data transfer rate, 360KB value
172    db      1                       ; Offset D: Diskette CMOS drive type, 360KB value
173%endif
174%endif
Note: See TracBrowser for help on using the repository browser.