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

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

Minor size optimizations in various files.

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