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

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

Changes to XTIDE Universal BIOS:

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