source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Initialization/FloppyDrive.asm @ 39

Last change on this file since 39 was 39, checked in by aitotat, 14 years ago
  • Better INT 40h handler detection to fix floppy drive detection with AMI 286 BIOS.
File size: 5.5 KB
Line 
1; File name     :   FloppyDrive.asm
2; Project name  :   IDE BIOS
3; Created date  :   25.3.2010
4; Last update   :   13.9.2010
5; Author        :   Tomi Tilli
6; Description   :   Various floppy drive related functions that
7;                   Boot Menu uses.
8
9; Section containing code
10SECTION .text
11
12;--------------------------------------------------------------------
13; Checks is floppy drive handler installed to interrupt vector 40h.
14;
15; FloppyDrive_IsInt40hInstalled
16;   Parameters:
17;       ES:     BDA and Interrupt Vector segment (zero)
18;   Returns:
19;       CF:     Set if INT 40h is installed
20;               Cleared if INT 40h is not installed
21;   Corrupts registers:
22;       BX, CX, DI
23;--------------------------------------------------------------------   
24;ALIGN JUMP_ALIGN
25FloppyDrive_IsInt40hInstalled:
26    cmp     WORD [es:INTV_FLOPPY_FUNC*4+2], 0C000h  ; Any ROM segment?
27    jb      SHORT .Int40hHandlerIsNotInstalled
28    call    .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
29.Int40hHandlerIsNotInstalled:
30    cmc
31    ret
32
33;--------------------------------------------------------------------
34; .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
35;   Parameters:
36;       Nothing
37;   Returns:
38;       CF:     Cleared if INT 40h is installed
39;               Set if INT 40h is not installed
40;   Corrupts registers:
41;       BX, CX, DI
42;--------------------------------------------------------------------   
43;ALIGN JUMP_ALIGN
44.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
45    push    es
46    push    dx
47    push    ax
48
49    call    .LoadInt40hVerifyParameters
50    int     INTV_DISK_FUNC
51    jc      SHORT .AH08hNotSupported    ; AH=08h not supported on XTs but that doesn't
52    push    es                          ; matter since INT 40h does not need to be verified
53    push    di                          ; on XTs
54
55    call    .LoadInt40hVerifyParameters
56    int     INTV_FLOPPY_FUNC
57
58    pop     dx
59    pop     cx
60    cmp     dx, di                      ; Difference in offsets?
61    jne     SHORT .Int40hNotInstalled
62    mov     dx, es
63    cmp     cx, dx                      ; Difference in segments?
64    jne     SHORT .Int40hNotInstalled
65.AH08hNotSupported:
66    clc
67    jmp     SHORT .Int40hIsInstalled
68.Int40hNotInstalled:
69    stc
70.Int40hIsInstalled:
71    pop     ax
72    pop     dx
73    pop     es
74    ret
75
76;--------------------------------------------------------------------
77; .LoadInt40hVerifyParameters
78;   Parameters:
79;       Nothing
80;   Returns:
81;       AH:     08h (Get Drive Parameters)
82;       DL:     00h (floppy drive)
83;       ES:DI:  0:0h (to guard against BIOS bugs)
84;   Corrupts registers:
85;       DH
86;--------------------------------------------------------------------   
87;ALIGN JUMP_ALIGN
88.LoadInt40hVerifyParameters:
89    xor     dx, dx              ; Floppy drive 0
90    mov     di, dx
91    mov     es, dx              ; ES:DI = 0000:0000h to guard against BIOS bugs
92    mov     ah, 08h             ; Get Drive Parameters
93    ret
94
95
96;--------------------------------------------------------------------
97; Returns floppy drive type.
98; PC/XT system do not support AH=08h but FLOPPY_TYPE_525_OR_35_DD
99; is still returned for them.
100;
101; FloppyDrive_GetType
102;   Parameters:
103;       DL:     Floppy Drive number
104;   Returns:
105;       BX:     Floppy Drive Type:
106;                   FLOPPY_TYPE_525_OR_35_DD
107;                   FLOPPY_TYPE_525_DD
108;                   FLOPPY_TYPE_525_HD
109;                   FLOPPY_TYPE_35_DD
110;                   FLOPPY_TYPE_35_HD
111;                   FLOPPY_TYPE_35_ED
112;       CF:     Set if AH=08h not supported (XT systems) or error
113;               Cleared if type read correctly (AT systems)
114;   Corrupts registers:
115;       AX, CX, DX, DI, ES
116;--------------------------------------------------------------------
117ALIGN JUMP_ALIGN
118FloppyDrive_GetType:
119    mov     ah, 08h         ; Get Drive Parameters
120    xor     bx, bx          ; FLOPPY_TYPE_525_OR_35_DD when function not supported
121    int     INTV_FLOPPY_FUNC
122    ret
123
124
125;--------------------------------------------------------------------
126; Returns number of Floppy Drives in system.
127;
128; FloppyDrive_GetCount
129;   Parameters:
130;       Nothing
131;   Returns:
132;       CX:     Number of Floppy Drives
133;   Corrupts registers:
134;       Nothing
135;--------------------------------------------------------------------
136ALIGN JUMP_ALIGN
137FloppyDrive_GetCount:
138    push    es
139    call    FloppyDrive_GetCountFromBIOS
140    jnc     SHORT .CompareToUserMinimum
141    call    FloppyDrive_GetCountFromBDA
142ALIGN JUMP_ALIGN
143.CompareToUserMinimum:
144    MAX_U   cl, [cs:ROMVARS.bMinFddCnt]
145    xor     ch, ch
146    pop     es
147    ret
148
149
150;--------------------------------------------------------------------
151; Reads Floppy Drive Count from BIOS.
152; Does not work on most XT systems. Call FloppyDrive_GetCountFromBDA
153; if this function fails.
154;
155; FloppyDrive_GetCountFromBIOS
156;   Parameters:
157;       Nothing
158;   Returns:
159;       CL:     Number of Floppy Drives
160;       CF:     Cleared if successfull
161;               Set if BIOS function not supported
162;   Corrupts registers:
163;       CH, ES
164;--------------------------------------------------------------------
165ALIGN JUMP_ALIGN
166FloppyDrive_GetCountFromBIOS:
167    push    di
168    push    dx
169    push    bx
170    push    ax
171
172    mov     ah, 08h                 ; Get Drive Parameters
173    xor     dx, dx                  ; Floppy Drive 00h
174    int     INTV_FLOPPY_FUNC
175    mov     cl, dl                  ; Number of Floppy Drives to CL
176
177    pop     ax
178    pop     bx
179    pop     dx
180    pop     di
181    ret
182
183
184;--------------------------------------------------------------------
185; Reads Floppy Drive Count (0...4) from BIOS Data Area.
186; This function should be used only if FloppyDrive_GetCountFromBIOS fails.
187;
188; FloppyDrive_GetCountFromBDA
189;   Parameters:
190;       Nothing
191;   Returns:
192;       CL:     Number of Floppy Drives
193;   Corrupts registers:
194;       CH, ES
195;--------------------------------------------------------------------
196ALIGN JUMP_ALIGN
197FloppyDrive_GetCountFromBDA:
198    LOAD_BDA_SEGMENT_TO es, cx
199    mov     cl, [es:BDA.wEquipment]         ; Load Equipment WORD low byte
200    mov     ch, cl                          ; Copy it to CH
201    and     cx, 0C001h                      ; Leave bits 15..14 and 0
202    eROL_IM ch, 2                           ; EW low byte bits 7..6 to 1..0
203    add     cl, ch                          ; CL = Floppy Drive count
204    ret
Note: See TracBrowser for help on using the repository browser.