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

Last change on this file since 100 was 99, checked in by Tomi Tilli, 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.