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

Last change on this file since 374 was 369, checked in by gregli@…, 13 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 5.5 KB
Line 
1; Project name : XTIDE Universal 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:BIOS_DISKETTE_INTERRUPT_40h*4+2], 0C000h ; Any ROM segment?
22%ifdef USE_AT ; No need to verify on XT systems.
23 jb SHORT .Int40hHandlerIsNotInstalled
24 call .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
25.Int40hHandlerIsNotInstalled:
26%endif
27 cmc
28 ret
29
30;--------------------------------------------------------------------
31; .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
32; Parameters:
33; Nothing
34; Returns:
35; CF: Cleared if INT 40h is installed
36; Set if INT 40h is not installed
37; Corrupts registers:
38; BX, CX, DI
39;--------------------------------------------------------------------
40%ifdef USE_AT
41.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
42 push es
43 push dx
44 push ax
45
46 call .LoadInt40hVerifyParameters
47 int BIOS_DISK_INTERRUPT_13h
48 jc SHORT .Int40hIsInstalled ; Maybe there are not any floppy drives at all
49 push es
50 push di
51
52 call .LoadInt40hVerifyParameters
53 int BIOS_DISKETTE_INTERRUPT_40h
54
55 pop dx
56 pop cx
57 cmp dx, di ; Difference in offsets?
58 jne SHORT .Int40hNotInstalled
59 mov dx, es
60 cmp cx, dx ; Difference in segments?
61 je SHORT .Int40hIsInstalled
62.Int40hNotInstalled:
63 stc
64.Int40hIsInstalled:
65 pop ax
66 pop dx
67 pop es
68 ret
69
70;--------------------------------------------------------------------
71; .LoadInt40hVerifyParameters
72; Parameters:
73; Nothing
74; Returns:
75; AH: 08h (Get Drive Parameters)
76; DL: 00h (floppy drive)
77; ES:DI: 0:0h (to guard against BIOS bugs)
78; Corrupts registers:
79; DH
80;--------------------------------------------------------------------
81.LoadInt40hVerifyParameters:
82 mov ah, 08h ; Get Drive Parameters
83 cwd ; Floppy drive 0
84 mov di, dx
85 mov es, dx ; ES:DI = 0000:0000h to guard against BIOS bugs
86 ret
87%endif
88
89
90;--------------------------------------------------------------------
91; Returns floppy drive type.
92; PC/XT system do not support AH=08h but FLOPPY_TYPE_525_OR_35_DD
93; is still returned for them.
94;
95; FloppyDrive_GetType
96; Parameters:
97; DL: Floppy Drive number
98; Returns:
99; BX: Floppy Drive Type:
100; FLOPPY_TYPE_525_OR_35_DD
101; FLOPPY_TYPE_525_DD
102; FLOPPY_TYPE_525_HD
103; FLOPPY_TYPE_35_DD
104; FLOPPY_TYPE_35_HD
105; FLOPPY_TYPE_35_ED
106; CF: Set if AH=08h not supported (XT systems) or error
107; Cleared if type read correctly (AT systems)
108; Corrupts registers:
109; AX, CX, DX, DI, ES
110;--------------------------------------------------------------------
111FloppyDrive_GetType:
112 mov ah, 08h ; Get Drive Parameters
113 xor bx, bx ; FLOPPY_TYPE_525_OR_35_DD when function not supported
114 int BIOS_DISKETTE_INTERRUPT_40h
115 ret
116
117
118;--------------------------------------------------------------------
119; Returns number of Floppy Drives in system.
120;
121; FloppyDrive_GetCountToAX
122; Parameters:
123; DS: RAMVARS Segment
124; Returns:
125; AX: Number of Floppy Drives
126;--------------------------------------------------------------------
127FloppyDrive_GetCountToAX:
128%ifdef MODULE_SERIAL_FLOPPY
129 call RamVars_UnpackFlopCntAndFirstToAL
130 js .UseBIOSorBDA ; We didn't add in any drives, counts here are not valid
131
132 adc al,1 ; adds in the drive count bit, and adds 1 for count vs. 0-index,
133 jmp .FinishCalc ; need to clear AH on the way out, and add in minimum drive numbers
134
135.UseBIOSorBDA:
136%endif
137 call FloppyDrive_GetCountFromBIOS_or_BDA
138
139.FinishCalc:
140 mov ah, [cs:ROMVARS.bMinFddCnt]
141 MAX_U al, ah
142 cbw
143
144 ret
145
146FloppyDrive_GetCountFromBIOS_or_BDA:
147 push es
148
149;--------------------------------------------------------------------
150; Reads Floppy Drive Count from BIOS.
151; Does not work on most XT systems. Call .GetCountFromBDA
152; if this function fails.
153;
154; .GetCountFromBIOS
155; Parameters:
156; Nothing
157; Returns:
158; AL: Number of Floppy Drives
159; CF: Cleared if successful
160; Set if BIOS function not supported
161; Corrupts registers:
162; ES
163;--------------------------------------------------------------------
164%ifdef USE_AT
165.GetCountFromBIOS:
166 push di
167 push bx
168 push cx
169 push dx
170
171 mov ah, 08h ; Get Drive Parameters
172 cwd ; Floppy Drive 00h
173 int BIOS_DISKETTE_INTERRUPT_40h
174 mov al, dl ; Number of Floppy Drives to AL
175
176 pop dx
177 pop cx
178 pop bx
179 pop di
180%endif
181
182;--------------------------------------------------------------------
183; Reads Floppy Drive Count (0...4) from BIOS Data Area.
184; This function should be used only if .GetCountFromBIOS fails.
185;
186; .GetCountFromBDA
187; Parameters:
188; Nothing
189; Returns:
190; AL: Number of Floppy Drives
191; Corrupts registers:
192; AH, ES
193;--------------------------------------------------------------------
194%ifndef USE_AT
195.GetCountFromBDA:
196 LOAD_BDA_SEGMENT_TO es, ax
197 mov al, [es:BDA.wEquipment] ; Load Equipment WORD low byte
198 mov ah, al ; Copy it to AH
199 and ax, 0C001h ; Leave bits 15..14 and 0
200 eROL_IM ah, 2 ; EW low byte bits 7..6 to 1..0
201 add al, ah ; AL = Floppy Drive count
202%endif
203
204 pop es
205 ret
Note: See TracBrowser for help on using the repository browser.