source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h.asm@ 75

Last change on this file since 75 was 43, checked in by Tomi Tilli, 14 years ago

Errors are now being checked when calling previous INT 13h handler on AH=08h Read Disk Drive Parameters. This fixes infinite drive checking loop on unofficial MS-DOS 7.10 installer.

File size: 10.7 KB
RevLine 
[3]1; File name : Int13h_Jump.asm
2; Project name : IDE BIOS
3; Created date : 21.9.2007
[35]4; Last update : 24.8.2010
[3]5; Author : Tomi Tilli
6; Description : Int 13h BIOS functions (Floppy and Hard disk).
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Macro that prints drive and function number.
13; Used only for debugging.
14;
15; DEBUG_PRINT_DRIVE_AND_FUNCTION
16; Parameters:
17; AH: INT 13h function number
18; DL: Drive number
19; Returns:
20; Nothing
21; Corrupts registers:
22; Nothing
23;--------------------------------------------------------------------
24%macro DEBUG_PRINT_DRIVE_AND_FUNCTION 0
25 push dx
26 push ax
27 mov al, dl
28 call Print_IntHexW
29 pop ax
30 pop dx
31%endmacro
32
33
34;--------------------------------------------------------------------
35; Int 13h software interrupt handler.
36; Jumps to specific function defined in AH.
37;
38; Int13h_Jump
39; Parameters:
40; AH: Bios function
41; DL: Drive number
42; Returns:
43; Depends on function
44; Corrupts registers:
45; Flags
46;--------------------------------------------------------------------
47ALIGN JUMP_ALIGN
48Int13h_DiskFunctions:
49 ; Save registers
50 sti ; Enable interrupts
51 push ds ; Store DS
52 push di ; Store DI
53
54 ;DEBUG_PRINT_DRIVE_AND_FUNCTION
55 call RamVars_GetSegmentToDS
56 call DriveXlate_WhenEnteringInt13h
57 call RamVars_IsFunctionHandledByThisBIOS
58 jnc SHORT Int13h_DirectCallToAnotherBios
[28]59 ;DEBUG_PRINT_DRIVE_AND_FUNCTION
[3]60
61 ; Jump to correct BIOS function
62 cmp ah, 25h ; Valid BIOS function?
63 ja SHORT Int13h_UnsupportedFunction
64 mov di, ax
65 eSHR_IM di, 7 ; Shift function to DI...
66 and di, BYTE 7Eh ; ...and prepare for word lookup
67 jmp [cs:di+g_rgw13hFuncJump] ; Jump to BIOS function
68
69
70;--------------------------------------------------------------------
71; Directs call to another INT13h function whose pointer is
72; stored to RAMVARS.
73;
74; Int13h_DirectCallToAnotherBios
75; Parameters:
76; AH: Bios function
77; DL: Drive number
78; DS: RAMVARS segment
79; DI: Corrupted
80; Stack from top to down:
81; Original DI
82; Original DS
83; Returns:
84; Depends on function
85; Corrupts registers:
86; Flags
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89Int13h_UnsupportedFunction:
90Int13h_DirectCallToAnotherBios:
[27]91 ; Temporarily store original DI and DS from stack to RAMVARS
[3]92 pop WORD [RAMVARS.wI13hDI]
93 pop WORD [RAMVARS.wI13hDS]
94
95 ; Special return processing required if target function
96 ; returns something in DL
[35]97 mov di, Int13h_ReturnFromAnotherBiosWithValueInDL
[3]98 call DriveXlate_DoesFunctionReturnSomethingInDL
99 jc SHORT .PushIretAddress
[35]100 add di, BYTE Int13h_ReturnFromAnotherBios - Int13h_ReturnFromAnotherBiosWithValueInDL
[3]101.PushIretAddress:
102 pushf ; Push FLAGS to simulate INT
103 push cs ; Push return segment
104 push di ; Push return offset
105
106 ; "Return" to another INT 13h with original DI and DS
107 push WORD [RAMVARS.fpOldI13h+2] ; Segment
108 push WORD [RAMVARS.fpOldI13h] ; Offset
109 lds di, [RAMVARS.dwI13DIDS]
110 cli ; Disable interrupts as INT would
111 retf
112
113
114;--------------------------------------------------------------------
[32]115; Int13h_CallPreviousInt13hHandler
116; Parameters:
117; AH: Bios function
118; DS: RAMVARS segment
119; Other: Depends on function to call
120; Returns:
121; Depends on function to call
122; Corrupts registers:
[43]123; Nothing
[32]124;--------------------------------------------------------------------
125ALIGN JUMP_ALIGN
126Int13h_CallPreviousInt13hHandler:
127 pushf ; Push flags to simulate INT
128 cli ; Disable interrupts since INT does that
129 call FAR [RAMVARS.fpOldI13h]
130 sti
131 ret
132
133
134;--------------------------------------------------------------------
[35]135; Int13h_ReturnFromAnotherBiosWithValueInDL
[3]136; Int13h_ReturnFromAnotherBios
137; Parameters:
138; AH: Error code
139; DL: Drive number (only on Int13h_ReturnFromAnotherBios)
140; CF: Error status
141; Returns:
142; Depends on function
143; Corrupts registers:
144; Nothing (not even FLAGS)
145;--------------------------------------------------------------------
146ALIGN JUMP_ALIGN
[35]147Int13h_ReturnFromAnotherBiosWithValueInDL:
[3]148 push ds
149 push di
150 pushf ; Store return flags
151 call RamVars_GetSegmentToDS
[35]152 call DriveXlate_WhenLeavingInt13hWithReturnValueInDL
[3]153 jmp SHORT Int13h_Leave
[35]154
[3]155ALIGN JUMP_ALIGN
156Int13h_ReturnFromAnotherBios:
157 push ds
158 push di
159 pushf ; Store return flags
160 call RamVars_GetSegmentToDS
161 call DriveXlate_WhenLeavingInt13h
162 jmp SHORT Int13h_Leave
163
164
165;--------------------------------------------------------------------
166; Returns from any BIOS function implemented by this BIOS.
167;
[35]168; Int13h_ReturnWithValueInDL
[3]169; Int13h_PopXRegsAndReturn
170; Int13h_PopDiDsAndReturn
171; Parameters:
172; DL: Drive number (not Int13h_ReturnWithoutSwappingDrives)
173; DS: RAMVARS segment
174; Returns:
175; Depends on function
176; Corrupts registers:
177; Nothing (not even FLAGS)
178;--------------------------------------------------------------------
179ALIGN JUMP_ALIGN
[35]180Int13h_ReturnWithValueInDL:
[3]181 pushf
[35]182 call DriveXlate_WhenLeavingInt13hWithReturnValueInDL
183 jmp SHORT Int13h_LeaveAfterStoringErrorCodeToBDA
[28]184
[3]185ALIGN JUMP_ALIGN
186Int13h_PopXRegsAndReturn:
187 pop bx ; Pop old AX to BX
188 mov al, bl ; Restore AL
189 pop bx
190 pop cx
191 pop dx
[35]192 ; Fall to Int13h_PopDiDsAndReturn
193
[3]194ALIGN JUMP_ALIGN
195Int13h_PopDiDsAndReturn:
196 pushf
197 call DriveXlate_WhenLeavingInt13h
[35]198 ; Fall to Int13h_LeaveAfterStoringErrorCodeToBDA
199
200Int13h_LeaveAfterStoringErrorCodeToBDA:
201 LOAD_BDA_SEGMENT_TO ds, di
202 mov [BDA.bHDStatus], ah
203 ; Fall to Int13h_Leave
204
[3]205Int13h_Leave:
206 popf
207 pop di
208 pop ds
209 retf 2
210
211
212; Jump table for correct BIOS function
213ALIGN WORD_ALIGN
214g_rgw13hFuncJump:
215 dw AH0h_HandlerForDiskControllerReset ; 00h, Disk Controller Reset (All)
216 dw AH1h_HandlerForReadDiskStatus ; 01h, Read Disk Status (All)
217 dw AH2h_HandlerForReadDiskSectors ; 02h, Read Disk Sectors (All)
218 dw AH3h_HandlerForWriteDiskSectors ; 03h, Write Disk Sectors (All)
219 dw AH4h_HandlerForVerifyDiskSectors ; 04h, Verify Disk Sectors (All)
220 dw AH5h_HandlerForFormatDiskTrack ; 05h, Format Disk Track (XT, AT, EISA)
221 dw Int13h_UnsupportedFunction ; 06h, Format Disk Track with Bad Sectors (XT)
222 dw Int13h_UnsupportedFunction ; 07h, Format Multiple Cylinders (XT)
223 dw AH8h_HandlerForReadDiskDriveParameters ; 08h, Read Disk Drive Parameters (All)
224 dw AH9h_HandlerForInitializeDriveParameters ; 09h, Initialize Drive Parameters (All)
225 dw Int13h_UnsupportedFunction ; 0Ah, Read Disk Sectors with ECC (XT, AT, EISA)
226 dw Int13h_UnsupportedFunction ; 0Bh, Write Disk Sectors with ECC (XT, AT, EISA)
227 dw AHCh_HandlerForSeek ; 0Ch, Seek (All)
228 dw AHDh_HandlerForResetHardDisk ; 0Dh, Alternate Disk Reset (All)
229 dw Int13h_UnsupportedFunction ; 0Eh, Read Sector Buffer (XT, PS/1), ESDI Undocumented Diagnostic (PS/2)
230 dw Int13h_UnsupportedFunction ; 0Fh, Write Sector Buffer (XT, PS/1), ESDI Undocumented Diagnostic (PS/2)
231 dw AH10h_HandlerForCheckDriveReady ; 10h, Check Drive Ready (All)
232 dw AH11h_HandlerForRecalibrate ; 11h, Recalibrate (All)
233 dw Int13h_UnsupportedFunction ; 12h, Controller RAM Diagnostic (XT)
234 dw Int13h_UnsupportedFunction ; 13h, Drive Diagnostic (XT)
235 dw AH14h_HandlerForControllerInternalDiagnostic ; 14h, Controller Internal Diagnostic (All)
236 dw AH15h_HandlerForReadDiskDriveSize ; 15h, Read Disk Drive Size (AT+)
237 dw Int13h_UnsupportedFunction ; 16h,
238 dw Int13h_UnsupportedFunction ; 17h,
239 dw Int13h_UnsupportedFunction ; 18h,
240 dw Int13h_UnsupportedFunction ; 19h, Park Heads (PS/2)
241 dw Int13h_UnsupportedFunction ; 1Ah, Format ESDI Drive (PS/2)
242 dw Int13h_UnsupportedFunction ; 1Bh, Get ESDI Manufacturing Header (PS/2)
243 dw Int13h_UnsupportedFunction ; 1Ch, ESDI Special Functions (PS/2)
244 dw Int13h_UnsupportedFunction ; 1Dh,
245 dw Int13h_UnsupportedFunction ; 1Eh,
246 dw Int13h_UnsupportedFunction ; 1Fh,
247 dw Int13h_UnsupportedFunction ; 20h,
248 dw Int13h_UnsupportedFunction ; 21h, Read Disk Sectors, Multiple Blocks (PS/1)
249 dw Int13h_UnsupportedFunction ; 22h, Write Disk Sectors, Multiple Blocks (PS/1)
250 dw AH23h_HandlerForSetControllerFeatures ; 23h, Set Controller Features Register (PS/1)
251 dw AH24h_HandlerForSetMultipleBlocks ; 24h, Set Multiple Blocks (PS/1)
252 dw AH25h_HandlerForGetDriveInformation ; 25h, Get Drive Information (PS/1)
253; dw Int13h_UnsupportedFunction ; 26h,
254; dw Int13h_UnsupportedFunction ; 27h,
255; dw Int13h_UnsupportedFunction ; 28h,
256; dw Int13h_UnsupportedFunction ; 29h,
257; dw Int13h_UnsupportedFunction ; 2Ah,
258; dw Int13h_UnsupportedFunction ; 2Bh,
259; dw Int13h_UnsupportedFunction ; 2Ch,
260; dw Int13h_UnsupportedFunction ; 2Dh,
261; dw Int13h_UnsupportedFunction ; 2Eh,
262; dw Int13h_UnsupportedFunction ; 2Fh,
263; dw Int13h_UnsupportedFunction ; 30h,
264; dw Int13h_UnsupportedFunction ; 31h,
265; dw Int13h_UnsupportedFunction ; 32h,
266; dw Int13h_UnsupportedFunction ; 33h,
267; dw Int13h_UnsupportedFunction ; 34h,
268; dw Int13h_UnsupportedFunction ; 35h,
269; dw Int13h_UnsupportedFunction ; 36h,
270; dw Int13h_UnsupportedFunction ; 37h,
271; dw Int13h_UnsupportedFunction ; 38h,
272; dw Int13h_UnsupportedFunction ; 39h,
273; dw Int13h_UnsupportedFunction ; 3Ah,
274; dw Int13h_UnsupportedFunction ; 3Bh,
275; dw Int13h_UnsupportedFunction ; 3Ch,
276; dw Int13h_UnsupportedFunction ; 3Dh,
277; dw Int13h_UnsupportedFunction ; 3Eh,
278; dw Int13h_UnsupportedFunction ; 3Fh,
279; dw Int13h_UnsupportedFunction ; 40h,
280; dw Int13h_UnsupportedFunction ; 41h, Check if Extensions Present (EBIOS)
281; dw Int13h_UnsupportedFunction ; 42h, Extended Read Sectors (EBIOS)
282; dw Int13h_UnsupportedFunction ; 43h, Extended Write Sectors (EBIOS)
283; dw Int13h_UnsupportedFunction ; 44h, Extended Verify Sectors (EBIOS)
284; dw Int13h_UnsupportedFunction ; 45h, Lock and Unlock Drive (EBIOS)
285; dw Int13h_UnsupportedFunction ; 46h, Eject Media Request (EBIOS)
286; dw Int13h_UnsupportedFunction ; 47h, Extended Seek (EBIOS)
287; dw Int13h_UnsupportedFunction ; 48h, Get Extended Drive Parameters (EBIOS)
288; dw Int13h_UnsupportedFunction ; 49h, Get Extended Disk Change Status (EBIOS)
289; dw Int13h_UnsupportedFunction ; 4Ah, Initiate Disk Emulation (Bootable CD-ROM)
290; dw Int13h_UnsupportedFunction ; 4Bh, Terminate Disk Emulation (Bootable CD-ROM)
291; dw Int13h_UnsupportedFunction ; 4Ch, Initiate Disk Emulation and Boot (Bootable CD-ROM)
292; dw Int13h_UnsupportedFunction ; 4Dh, Return Boot Catalog (Bootable CD-ROM)
293; dw Int13h_UnsupportedFunction ; 4Eh, Set Hardware Configuration (EBIOS)
Note: See TracBrowser for help on using the repository browser.