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

Last change on this file since 99 was 99, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

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