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

Last change on this file since 368 was 294, checked in by krille_n_@…, 13 years ago

Commit 2/2 (BIOS):

  • Fixed a bug in AH1h_HStatus.asm.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 5.6 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;--------------------------------------------------------------------
111ALIGN JUMP_ALIGN
112FloppyDrive_GetType:
113 mov ah, 08h ; Get Drive Parameters
114 xor bx, bx ; FLOPPY_TYPE_525_OR_35_DD when function not supported
[152]115 int BIOS_DISKETTE_INTERRUPT_40h
[3]116 ret
117
118
119;--------------------------------------------------------------------
120; Returns number of Floppy Drives in system.
121;
[258]122; FloppyDrive_GetCountToAX
[3]123; Parameters:
[258]124; DS: RAMVARS Segment
[3]125; Returns:
[258]126; AX: Number of Floppy Drives
[3]127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
[294]129FloppyDrive_GetCountToAX:
[258]130%ifdef MODULE_SERIAL_FLOPPY
131 call RamVars_UnpackFlopCntAndFirstToAL
[270]132 js .UseBIOSorBDA ; We didn't add in any drives, counts here are not valid
[294]133
134 adc al,1 ; adds in the drive count bit, and adds 1 for count vs. 0-index,
[270]135 jmp .FinishCalc ; need to clear AH on the way out, and add in minimum drive numbers
[258]136
[294]137.UseBIOSorBDA:
[99]138%endif
[258]139 call FloppyDrive_GetCountFromBIOS_or_BDA
[270]140
[294]141.FinishCalc:
[258]142 mov ah, [cs:ROMVARS.bMinFddCnt]
143 MAX_U al, ah
144 cbw
[294]145
[3]146 ret
147
[294]148ALIGN JUMP_ALIGN
[258]149FloppyDrive_GetCountFromBIOS_or_BDA:
150 push es
[3]151
152;--------------------------------------------------------------------
153; Reads Floppy Drive Count from BIOS.
[294]154; Does not work on most XT systems. Call .GetCountFromBDA
[3]155; if this function fails.
156;
[294]157; .GetCountFromBIOS
[3]158; Parameters:
159; Nothing
160; Returns:
[274]161; AL: Number of Floppy Drives
[294]162; CF: Cleared if successful
[3]163; Set if BIOS function not supported
164; Corrupts registers:
[274]165; ES
[3]166;--------------------------------------------------------------------
[99]167%ifdef USE_AT
[3]168ALIGN JUMP_ALIGN
[258]169.GetCountFromBIOS:
[3]170 push di
[274]171 push bx
172 push cx
[3]173 push dx
174
175 mov ah, 08h ; Get Drive Parameters
[86]176 cwd ; Floppy Drive 00h
[152]177 int BIOS_DISKETTE_INTERRUPT_40h
[258]178 mov al, dl ; Number of Floppy Drives to AL
[3]179
[274]180 pop dx
181 pop cx
[3]182 pop bx
183 pop di
[99]184%endif
[3]185
186;--------------------------------------------------------------------
187; Reads Floppy Drive Count (0...4) from BIOS Data Area.
[294]188; This function should be used only if .GetCountFromBIOS fails.
[3]189;
[294]190; .GetCountFromBDA
[3]191; Parameters:
192; Nothing
193; Returns:
[294]194; AL: Number of Floppy Drives
[3]195; Corrupts registers:
[294]196; AH, ES
[3]197;--------------------------------------------------------------------
[99]198%ifndef USE_AT
[3]199ALIGN JUMP_ALIGN
[258]200.GetCountFromBDA:
201 LOAD_BDA_SEGMENT_TO es, ax
202 mov al, [es:BDA.wEquipment] ; Load Equipment WORD low byte
[294]203 mov ah, al ; Copy it to AH
[258]204 and ax, 0C001h ; Leave bits 15..14 and 0
205 eROL_IM ah, 2 ; EW low byte bits 7..6 to 1..0
[294]206 add al, ah ; AL = Floppy Drive count
[258]207%endif
208
209 pop es
[3]210 ret
Note: See TracBrowser for help on using the repository browser.