Changeset 150 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AHDh_HReset.asm
- Timestamp:
- Apr 29, 2011, 7:04:13 PM (14 years ago)
- google:author:
- aitotat
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AHDh_HReset.asm
r148 r150 12 12 ; DL: Translated Drive number 13 13 ; DS:DI: Ptr to DPT (in RAMVARS segment) 14 ; SS:BP: Ptr to I NTPACK15 ; Returns with INTPACK in SS:BP:14 ; SS:BP: Ptr to IDEPACK 15 ; Returns with INTPACK: 16 16 ; AH: Int 13h return status 17 17 ; CF: 0 if succesfull, 1 if error … … 35 35 ; DL: Drive number 36 36 ; DS: RAMVARS segment 37 ; SS:BP: Ptr to IDEPACK 37 38 ; Returns: 38 39 ; AH: Int 13h return status 39 40 ; CF: 0 if succesfull, 1 if error 40 41 ; Corrupts registers: 41 ; AL, CX, DI42 ; AL, CX, SI, DI 42 43 ;-------------------------------------------------------------------- 43 44 ALIGN JUMP_ALIGN … … 48 49 call FindDPT_ForDriveNumber ; DS:DI now points to DPT 49 50 call Interrupts_UnmaskInterruptControllerForDriveInDSDI 50 call AHDh_ResetMasterAndSlave51 call Device_ResetMasterAndSlaveController 51 52 ;jc SHORT .ReturnError ; CF would be set if slave drive present without master 52 53 ; (error register has special values after reset) 53 54 54 55 ; Initialize Master and Slave drives 55 mov dx, [RAMVARS.wIdeBase] ; Load base port address 56 call AHDh_InitializeMasterAndSlave 56 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset] 57 mov dx, [cs:bx+IDEVARS.wPort] 58 call InitializeMasterAndSlaveDriveFromPortInDX 57 59 58 60 pop bx … … 62 64 63 65 ;-------------------------------------------------------------------- 64 ; Resets Master and Slave drives at wanted port. 65 ; Both IDE drives will be reset. It is not possible to reset 66 ; Master or Slave only. 67 ; 68 ; AHDh_ResetMasterAndSlave 69 ; Parameters: 70 ; DS:DI: Ptr to DPT for Master or Slave drive 71 ; Returns: 72 ; CF: 0 if reset succesfull 73 ; 1 if any error 74 ; Corrupts registers: 75 ; AX, BX, CX, DX 76 ;-------------------------------------------------------------------- 77 ALIGN JUMP_ALIGN 78 AHDh_ResetMasterAndSlave: 79 ; Reset controller 80 ; HSR0: Set_SRST 81 mov al, [di+DPT.bDrvCtrl] ; Load value for ACR 82 or al, FLG_IDE_CTRL_SRST ; Set Reset bit 83 call HDrvSel_OutputDeviceControlByte 84 mov ax, 5 ; Delay at least 5us 85 call HTimer_DelayMicrosecondsFromAX 86 87 ; HSR1: Clear_wait 88 mov al, [di+DPT.bDrvCtrl] ; Load value for ACR 89 out dx, al ; End Reset 90 mov ax, 2000 ; Delay at least 2ms 91 call HTimer_DelayMicrosecondsFromAX 92 93 ; HSR2: Check_status 94 mov cl, B_TIMEOUT_RESET ; Reset timeout delay 95 jmp HStatus_WaitBsy 96 97 98 ;-------------------------------------------------------------------- 99 ; Initializes Master and Slave drive. 100 ; 101 ; AHDh_InitializeMasterAndSlave 66 ; InitializeMasterAndSlaveDriveFromPortInDX 102 67 ; Parameters: 103 68 ; DX: IDE Base Port address 69 ; SS:BP: Ptr to IDEPACK 104 70 ; Returns: 105 71 ; AH: Error code … … 107 73 ; 1 if any error 108 74 ; Corrupts registers: 109 ; AL, BX, CX, DX, DI75 ; AL, BX, CX, DX, SI, DI 110 76 ;-------------------------------------------------------------------- 111 77 ALIGN JUMP_ALIGN 112 AHDh_InitializeMasterAndSlave:78 InitializeMasterAndSlaveDriveFromPortInDX: 113 79 push dx ; Store base port address 114 80 xor cx, cx ; Assume no errors 115 call FindDPT_ ForIdeMasterAtPort81 call FindDPT_ToDSDIForIdeMasterAtPortDX 116 82 jnc SHORT .InitializeSlave ; Master drive not present 117 83 call AH9h_InitializeDriveForUse … … 119 85 .InitializeSlave: 120 86 pop dx ; Restore base port address 121 call FindDPT_ ForIdeSlaveAtPort87 call FindDPT_ToDSDIForIdeSlaveAtPortDX 122 88 jnc SHORT .CombineErrors ; Slave drive not present 123 89 call AH9h_InitializeDriveForUse
Note:
See TracChangeset
for help on using the changeset viewer.