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

Last change on this file since 372 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
RevLine 
[102]1; Project name : XTIDE Universal BIOS
[3]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
[86]19;--------------------------------------------------------------------
[3]20FloppyDrive_IsInt40hInstalled:
[152]21 cmp WORD [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], 0C000h ; Any ROM segment?
[102]22%ifdef USE_AT ; No need to verify on XT systems.
[39]23 jb SHORT .Int40hHandlerIsNotInstalled
24 call .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
[102]25.Int40hHandlerIsNotInstalled:
[99]26%endif
[27]27 cmc
[3]28 ret
29
[39]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
[86]39;--------------------------------------------------------------------
[99]40%ifdef USE_AT
[39]41.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
42 push es
43 push dx
44 push ax
[3]45
[39]46 call .LoadInt40hVerifyParameters
[152]47 int BIOS_DISK_INTERRUPT_13h
[99]48 jc SHORT .Int40hIsInstalled ; Maybe there are not any floppy drives at all
49 push es
50 push di
[39]51
52 call .LoadInt40hVerifyParameters
[152]53 int BIOS_DISKETTE_INTERRUPT_40h
[39]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?
[99]61 je SHORT .Int40hIsInstalled
[39]62.Int40hNotInstalled:
63 stc
64.Int40hIsInstalled:
65 pop ax
66 pop dx
67 pop es
68 ret
69
[3]70;--------------------------------------------------------------------
[39]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
[86]80;--------------------------------------------------------------------
[39]81.LoadInt40hVerifyParameters:
[86]82 mov ah, 08h ; Get Drive Parameters
83 cwd ; Floppy drive 0
[39]84 mov di, dx
85 mov es, dx ; ES:DI = 0000:0000h to guard against BIOS bugs
86 ret
[99]87%endif
[39]88
89
90;--------------------------------------------------------------------
[3]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
[152]114 int BIOS_DISKETTE_INTERRUPT_40h
[3]115 ret
116
117
118;--------------------------------------------------------------------
119; Returns number of Floppy Drives in system.
120;
[258]121; FloppyDrive_GetCountToAX
[3]122; Parameters:
[258]123; DS: RAMVARS Segment
[3]124; Returns:
[258]125; AX: Number of Floppy Drives
[3]126;--------------------------------------------------------------------
[294]127FloppyDrive_GetCountToAX:
[258]128%ifdef MODULE_SERIAL_FLOPPY
129 call RamVars_UnpackFlopCntAndFirstToAL
[270]130 js .UseBIOSorBDA ; We didn't add in any drives, counts here are not valid
[294]131
132 adc al,1 ; adds in the drive count bit, and adds 1 for count vs. 0-index,
[270]133 jmp .FinishCalc ; need to clear AH on the way out, and add in minimum drive numbers
[258]134
[294]135.UseBIOSorBDA:
[99]136%endif
[258]137 call FloppyDrive_GetCountFromBIOS_or_BDA
[270]138
[294]139.FinishCalc:
[258]140 mov ah, [cs:ROMVARS.bMinFddCnt]
141 MAX_U al, ah
142 cbw
[294]143
[3]144 ret
145
[258]146FloppyDrive_GetCountFromBIOS_or_BDA:
147 push es
[3]148
149;--------------------------------------------------------------------
150; Reads Floppy Drive Count from BIOS.
[294]151; Does not work on most XT systems. Call .GetCountFromBDA
[3]152; if this function fails.
153;
[294]154; .GetCountFromBIOS
[3]155; Parameters:
156; Nothing
157; Returns:
[274]158; AL: Number of Floppy Drives
[294]159; CF: Cleared if successful
[3]160; Set if BIOS function not supported
161; Corrupts registers:
[274]162; ES
[3]163;--------------------------------------------------------------------
[99]164%ifdef USE_AT
[258]165.GetCountFromBIOS:
[3]166 push di
[274]167 push bx
168 push cx
[3]169 push dx
170
171 mov ah, 08h ; Get Drive Parameters
[86]172 cwd ; Floppy Drive 00h
[152]173 int BIOS_DISKETTE_INTERRUPT_40h
[258]174 mov al, dl ; Number of Floppy Drives to AL
[3]175
[274]176 pop dx
177 pop cx
[3]178 pop bx
179 pop di
[99]180%endif
[3]181
182;--------------------------------------------------------------------
183; Reads Floppy Drive Count (0...4) from BIOS Data Area.
[294]184; This function should be used only if .GetCountFromBIOS fails.
[3]185;
[294]186; .GetCountFromBDA
[3]187; Parameters:
188; Nothing
189; Returns:
[294]190; AL: Number of Floppy Drives
[3]191; Corrupts registers:
[294]192; AH, ES
[3]193;--------------------------------------------------------------------
[99]194%ifndef USE_AT
[258]195.GetCountFromBDA:
196 LOAD_BDA_SEGMENT_TO es, ax
197 mov al, [es:BDA.wEquipment] ; Load Equipment WORD low byte
[294]198 mov ah, al ; Copy it to AH
[258]199 and ax, 0C001h ; Leave bits 15..14 and 0
200 eROL_IM ah, 2 ; EW low byte bits 7..6 to 1..0
[294]201 add al, ah ; AL = Floppy Drive count
[258]202%endif
203
204 pop es
[3]205 ret
Note: See TracBrowser for help on using the repository browser.