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

Last change on this file since 33 was 33, checked in by Tomi Tilli, 15 years ago

Interrupt controllers are now unmasked during drive reset.

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