Changes in trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HStatus.asm [28:10] in xtideuniversalbios
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HStatus.asm
r28 r10 2 2 ; Project name : IDE BIOS 3 3 ; Created date : 15.12.2009 4 ; Last update : 1.8.20104 ; Last update : 25.5.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 [ bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN28 jnz SHORT .PollRdySinceI nterruptsAreDisabled27 test BYTE [di+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN 28 jnz SHORT .PollRdySinceIrqsAreDisabled 29 29 jmp HIRQ_WaitIRQ 30 31 ALIGN JUMP_ALIGN 32 .PollRdySinceInterruptsAreDisabled: 30 ALIGN JUMP_ALIGN 31 .PollRdySinceIrqsAreDisabled: 32 call HStatus_ReadAndIgnoreAlternateStatus 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 from 40 ; reading status before it is valid. 41 ; 42 ; HStatus_ReadAndIgnoreAlternateStatus 43 ; Parameters: 44 ; DS:BX: Ptr to DPT 45 ; Returns: 46 ; Nothing 47 ; Corrupts registers: 48 ; AL, CX, DX 49 ;-------------------------------------------------------------------- 50 ALIGN JUMP_ALIGN 51 HStatus_ReadAndIgnoreAlternateStatus: 52 mov cx, bx ; Backup BX 53 eMOVZX bx, BYTE [bx+DPT.bIdeOff] ; CS:BX now points to IDEVARS 54 mov dx, [cs:bx+IDEVARS.wPortCtrl] ; DX = Control Block base port 55 add dx, BYTE REGR_IDEC_AST ; DX = Alternate Status Register address 56 in al, dx ; Read Alternate Status Register 57 mov bx, cx ; Restore BX 58 ret 59 60 61 ;-------------------------------------------------------------------- 38 62 ; Waits until Hard Disk is ready to transfer data. 39 63 ; … … 50 74 ALIGN JUMP_ALIGN 51 75 HStatus_WaitIrqOrDrq: 52 test BYTE [bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN53 jnz SHORT .PollDrqSinceInterruptsAreDisabled54 jmp HIRQ_WaitIRQ55 56 ALIGN JUMP_ALIGN57 .PollDrqSinceInterruptsAreDisabled:58 76 push dx 59 77 push cx 78 79 ; Check if interrupts are enabled 80 test BYTE [bx+DPT.bDrvCtrl], FLG_IDE_CTRL_nIEN 81 jnz SHORT .PollDRQ ; Poll DRQ if IRQ disabled 82 call HIRQ_WaitIRQ ; Wait for IRQ 83 jmp SHORT .Return 84 85 ALIGN JUMP_ALIGN 86 .PollDRQ: 87 call HStatus_ReadAndIgnoreAlternateStatus 60 88 call HStatus_WaitDrqDefTime 89 ALIGN JUMP_ALIGN 90 .Return: 61 91 pop cx 62 92 pop dx … … 159 189 ; IDE Status register polling. 160 190 ; This function first waits until controller is not busy. 161 ; When not busy, IDE Status Register is polled until wanted flag is set. 191 ; When not busy, IDE Status Register is polled until wanted 192 ; flag (HBIT_ST_DRDY or HBIT_ST_DRQ) is set. 162 193 ; 163 194 ; HStatus_PollBusyAndFlg … … 176 207 ALIGN JUMP_ALIGN 177 208 HStatus_PollBsyAndFlg: 178 call SoftDelay_InitTimeout ; Initialize timeout counter 179 in al, dx ; Discard contents for first read 180 ; (should read Alternate Status Register) 209 call SoftDelay_InitTimeout ; Initialize timeout counter 181 210 ALIGN JUMP_ALIGN 182 211 .PollLoop: 183 in al, dx 184 test al, FLG_IDE_ST_BSY 185 jnz SHORT .UpdateTimeout 186 test al, ah 187 jnz SHORT GetErrorCodeFromPollingToAH; If set, break loop212 in al, dx ; Load IDE Status Register 213 test al, FLG_IDE_ST_BSY ; Controller busy? 214 jnz SHORT .UpdateTimeout ; If so, jump to timeout update 215 test al, ah ; Test secondary flag 216 jnz SHORT HStatus_PollCompleted ; If set, break loop 188 217 ALIGN JUMP_ALIGN 189 218 .UpdateTimeout: 190 call SoftDelay_UpdTimeout ; Update timeout counter 191 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 192 jmp HError_ProcessTimeoutAfterPollingBSYandSomeOtherStatusBit 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 193 224 194 225 ;-------------------------------------------------------------------- … … 210 241 ALIGN JUMP_ALIGN 211 242 HStatus_PollBsy: 212 call SoftDelay_InitTimeout ; Initialize timeout counter 213 in al, dx ; Discard contents for first read 214 ; (should read Alternate Status Register) 243 call SoftDelay_InitTimeout ; Initialize timeout counter 215 244 ALIGN JUMP_ALIGN 216 245 .PollLoop: 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 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
Note: See TracChangeset
for help on using the changeset viewer.