Changes in trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HStatus.asm [10:28] in xtideuniversalbios
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HStatus.asm
r10 r28 2 2 ; Project name : IDE BIOS 3 3 ; Created date : 15.12.2009 4 ; Last update : 25.5.20104 ; Last update : 1.8.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : IDE Status Register polling functions. … … 25 25 ALIGN JUMP_ALIGN 26 26 HStatus_WaitIrqOrRdy: 27 test BYTE [ di+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN28 jnz SHORT .PollRdySinceI rqsAreDisabled27 test BYTE [bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN 28 jnz SHORT .PollRdySinceInterruptsAreDisabled 29 29 jmp HIRQ_WaitIRQ 30 ALIGN JUMP_ALIGN 31 .PollRdySinceIrqsAreDisabled: 32 call HStatus_ReadAndIgnoreAlternateStatus 30 31 ALIGN JUMP_ALIGN 32 .PollRdySinceInterruptsAreDisabled: 33 33 mov cl, B_TIMEOUT_DRQ ; Load DRQ (not RDY) timeout 34 34 jmp SHORT HStatus_WaitRdy ; Jump to poll RDY … … 36 36 37 37 ;-------------------------------------------------------------------- 38 ; Reads Alternate Status Register and ignores result.39 ; Alternate Status Register is read to prevent polling host from40 ; reading status before it is valid.41 ;42 ; HStatus_ReadAndIgnoreAlternateStatus43 ; Parameters:44 ; DS:BX: Ptr to DPT45 ; Returns:46 ; Nothing47 ; Corrupts registers:48 ; AL, CX, DX49 ;--------------------------------------------------------------------50 ALIGN JUMP_ALIGN51 HStatus_ReadAndIgnoreAlternateStatus:52 mov cx, bx ; Backup BX53 eMOVZX bx, BYTE [bx+DPT.bIdeOff] ; CS:BX now points to IDEVARS54 mov dx, [cs:bx+IDEVARS.wPortCtrl] ; DX = Control Block base port55 add dx, BYTE REGR_IDEC_AST ; DX = Alternate Status Register address56 in al, dx ; Read Alternate Status Register57 mov bx, cx ; Restore BX58 ret59 60 61 ;--------------------------------------------------------------------62 38 ; Waits until Hard Disk is ready to transfer data. 63 39 ; … … 74 50 ALIGN JUMP_ALIGN 75 51 HStatus_WaitIrqOrDrq: 52 test BYTE [bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN 53 jnz SHORT .PollDrqSinceInterruptsAreDisabled 54 jmp HIRQ_WaitIRQ 55 56 ALIGN JUMP_ALIGN 57 .PollDrqSinceInterruptsAreDisabled: 76 58 push dx 77 59 push cx 78 79 ; Check if interrupts are enabled80 test BYTE [bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN81 jnz SHORT .PollDRQ ; Poll DRQ if IRQ disabled82 call HIRQ_WaitIRQ ; Wait for IRQ83 jmp SHORT .Return84 85 ALIGN JUMP_ALIGN86 .PollDRQ:87 call HStatus_ReadAndIgnoreAlternateStatus88 60 call HStatus_WaitDrqDefTime 89 ALIGN JUMP_ALIGN90 .Return:91 61 pop cx 92 62 pop dx … … 189 159 ; IDE Status register polling. 190 160 ; This function first waits until controller is not busy. 191 ; When not busy, IDE Status Register is polled until wanted 192 ; flag (HBIT_ST_DRDY or HBIT_ST_DRQ) is set. 161 ; When not busy, IDE Status Register is polled until wanted flag is set. 193 162 ; 194 163 ; HStatus_PollBusyAndFlg … … 207 176 ALIGN JUMP_ALIGN 208 177 HStatus_PollBsyAndFlg: 209 call SoftDelay_InitTimeout ; Initialize timeout counter 178 call SoftDelay_InitTimeout ; Initialize timeout counter 179 in al, dx ; Discard contents for first read 180 ; (should read Alternate Status Register) 210 181 ALIGN JUMP_ALIGN 211 182 .PollLoop: 212 in al, dx ; Load IDE Status Register213 test al, FLG_IDE_ST_BSY ; Controller busy?214 jnz SHORT .UpdateTimeout ; If so, jump to timeout update215 test al, ah ; Test secondary flag216 jnz SHORT HStatus_PollCompleted; If set, break loop183 in al, dx ; Load IDE Status Register 184 test al, FLG_IDE_ST_BSY ; Controller busy? 185 jnz SHORT .UpdateTimeout ; If so, jump to timeout update 186 test al, ah ; Test secondary flag 187 jnz SHORT GetErrorCodeFromPollingToAH ; If set, break loop 217 188 ALIGN JUMP_ALIGN 218 189 .UpdateTimeout: 219 call SoftDelay_UpdTimeout ; Update timeout counter 220 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 221 mov ah, RET_HD_TIMEOUT ; Load error code for timeout 222 ret 223 190 call SoftDelay_UpdTimeout ; Update timeout counter 191 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 192 jmp HError_ProcessTimeoutAfterPollingBSYandSomeOtherStatusBit 224 193 225 194 ;-------------------------------------------------------------------- … … 241 210 ALIGN JUMP_ALIGN 242 211 HStatus_PollBsy: 243 call SoftDelay_InitTimeout ; Initialize timeout counter 212 call SoftDelay_InitTimeout ; Initialize timeout counter 213 in al, dx ; Discard contents for first read 214 ; (should read Alternate Status Register) 244 215 ALIGN JUMP_ALIGN 245 216 .PollLoop: 246 in al, dx ; Load IDE Status Reg 247 test al, FLG_IDE_ST_BSY ; Controller busy? (clears CF) 248 jz SHORT HStatus_PollCompleted ; If not, jump to check errors 249 call SoftDelay_UpdTimeout ; Update timeout counter 250 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 251 mov ah, RET_HD_TIMEOUT ; Load error code for timeout 252 ret 253 254 ALIGN JUMP_ALIGN 255 HStatus_PollCompleted: 256 test al, FLG_IDE_ST_DF | FLG_IDE_ST_ERR 257 jnz SHORT .GetErrorCode ; If errors, jump to get error code 258 xor ah, ah ; Zero AH and clear CF 259 ret 260 .GetErrorCode: 261 jmp HError_GetErrorCodeForStatusReg 217 in al, dx ; Load IDE Status Reg 218 test al, FLG_IDE_ST_BSY ; Controller busy? 219 jz SHORT GetErrorCodeFromPollingToAH ; If not, jump to check errors 220 call SoftDelay_UpdTimeout ; Update timeout counter 221 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 222 ALIGN JUMP_ALIGN 223 GetErrorCodeFromPollingToAH: 224 jmp HError_ProcessErrorsAfterPollingBSY
Note: See TracChangeset
for help on using the changeset viewer.