source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HError.asm@ 34

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

OS hooks are now enabled for all builds.
IRQ waiting no longer uses HLT instruction to fix some EMM386 and VCPI issues.

File size: 5.1 KB
Line 
1; File name : HError.asm
2; Project name : IDE BIOS
3; Created date : 30.11.2007
4; Last update : 23.8.2010
5; Author : Tomi Tilli
6; Description : Error checking functions for BIOS Hard disk functions.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; HError_ProcessTimeoutAfterPollingBSYandSomeOtherStatusBit
13; HError_ProcessErrorsAfterPollingBSY
14; Parameters:
15; DS: RAMVARS segment
16; Returns:
17; AH: BIOS error code
18; CF: Set if error
19; Cleared if no error
20; Corrupts registers:
21; AL
22;--------------------------------------------------------------------
23ALIGN JUMP_ALIGN
24HError_ProcessTimeoutAfterPollingBSYandSomeOtherStatusBit:
25 push ds
26 push dx
27
28 call HError_GetStatusAndErrorRegistersToAXandStoreThemToBDA
29 call GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX
30 jc SHORT StoreErrorCodeFromAHtoBDA
31 mov ah, RET_HD_TIMEOUT ; Force timeout since no actual error...
32 stc ; ...but wanted bit was never set
33 jmp SHORT StoreErrorCodeFromAHtoBDA
34
35
36ALIGN JUMP_ALIGN
37HError_ProcessErrorsAfterPollingBSY:
38 push ds
39 push dx
40
41 call HError_GetStatusAndErrorRegistersToAXandStoreThemToBDA
42 call GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX
43StoreErrorCodeFromAHtoBDA:
44 mov [BDA.bHDLastSt], ah ; Store BIOS error code to BDA
45
46 pop dx
47 pop ds
48 ret
49
50
51;--------------------------------------------------------------------
52; HError_GetStatusAndErrorRegistersToAXandStoreThemToBDA
53; Parameters:
54; DS: RAMVARS segment
55; Returns:
56; AL: IDE Status Register contents
57; AH: IDE Error Register contents
58; DS: BDA segment
59; Corrupts registers:
60; DX
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
63HError_GetStatusAndErrorRegistersToAXandStoreThemToBDA:
64 mov dx, [RAMVARS.wIdeBase] ; Load IDE base port address
65 inc dx ; Increment to Error Register
66 in al, dx ; Read Error Register...
67 mov ah, al ; ...and copy it to AH
68 add dx, BYTE REGR_IDE_ST - REGR_IDE_ERROR
69 in al, dx ; Read Status Register to AL
70 ; Fall to .StoreStatusAndErrorRegistersFromAXtoBDA
71
72;--------------------------------------------------------------------
73; .StoreStatusAndErrorRegistersFromAXtoBDA
74; Parameters:
75; AL: IDE Status Register contents
76; AH: IDE Error Register contents
77; Returns:
78; DS: BDA segment (zero)
79; Corrupts registers:
80; DX
81;--------------------------------------------------------------------
82.StoreStatusAndErrorRegistersFromAXtoBDA:
83 LOAD_BDA_SEGMENT_TO ds, dx
84 mov [HDBDA.wHDStAndErr], ax
85 ret
86
87
88;--------------------------------------------------------------------
89; GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX
90; Parameters:
91; AL: IDE Status Register contents
92; AH: IDE Error Register contents
93; Returns:
94; AH: BIOS INT 13h error code
95; CF: Set if error
96; Cleared if no error
97; Corrupts registers:
98; Nothing
99;--------------------------------------------------------------------
100ALIGN JUMP_ALIGN
101GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX:
102 test al, FLG_IDE_ST_BSY
103 jz SHORT .CheckErrorBitsFromStatusRegisterInAL
104 mov ah, RET_HD_TIMEOUT
105 jmp SHORT .ReturnBiosErrorCodeInAH
106
107ALIGN JUMP_ALIGN
108.CheckErrorBitsFromStatusRegisterInAL:
109 test al, FLG_IDE_ST_DF | FLG_IDE_ST_CORR | FLG_IDE_ST_ERR
110 jnz SHORT .ProcessErrorFromStatusRegisterInAL
111 xor ah, ah ; No errors, zero AH and CF
112 ret
113
114.ProcessErrorFromStatusRegisterInAL:
115 test al, FLG_IDE_ST_ERR ; Error specified in Error register?
116 jnz SHORT .ConvertBiosErrorToAHfromErrorRegisterInAH
117 mov ah, RET_HD_ECC ; Assume ECC corrected error
118 test al, FLG_IDE_ST_CORR ; ECC corrected error?
119 jnz SHORT .ReturnBiosErrorCodeInAH
120 mov ah, RET_HD_CONTROLLER ; Must be Device Fault
121 jmp SHORT .ReturnBiosErrorCodeInAH
122
123.ConvertBiosErrorToAHfromErrorRegisterInAH:
124 push bx
125 mov bx, .rgbRetCodeLookup
126.ErrorBitLoop:
127 rcr ah, 1 ; Set CF if error bit set
128 jc SHORT .LookupErrorCode
129 inc bx
130 cmp bx, .rgbRetCodeLookup + 8
131 jb SHORT .ErrorBitLoop ; Loop until all bits checked
132.LookupErrorCode:
133 mov ah, [cs:bx+.rgbRetCodeLookup]
134 pop bx
135
136.ReturnBiosErrorCodeInAH:
137 stc ; Set CF since error
138 ret
139
140.rgbRetCodeLookup:
141 db RET_HD_ADDRMARK ; Bit0=AMNF, Address Mark Not Found
142 db RET_HD_SEEK_FAIL ; Bit1=TK0NF, Track 0 Not Found
143 db RET_HD_INVALID ; Bit2=ABRT, Aborted Command
144 db RET_HD_NOTLOCKED ; Bit3=MCR, Media Change Requested
145 db RET_HD_NOT_FOUND ; Bit4=IDNF, ID Not Found
146 db RET_HD_LOCKED ; Bit5=MC, Media Changed
147 db RET_HD_UNCORRECC ; Bit6=UNC, Uncorrectable Data Error
148 db RET_HD_BADSECTOR ; Bit7=BBK, Bad Block Detected
149 db RET_HD_STATUSERR ; When Error Register is zero
150
151
152;--------------------------------------------------------------------
153; HError_StoreBiosErrorCodeFromAHtoBDA
154; Parameters:
155; AH: BIOS error code
156; Returns:
157; Nothing
158; Corrupts registers:
159; DI
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162HError_StoreBiosErrorCodeFromAHtoBDA:
163 push ds
164 mov di, 0 ; Zero DI and preserve FLAGS
165 mov ds, di ; Copy BDA segment to DS
166 mov [BDA.bHDLastSt], ah
167 pop ds
168 ret
Note: See TracBrowser for help on using the repository browser.