Changeset 238 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeCommand.asm
- Timestamp:
- Feb 5, 2012, 12:59:20 PM (13 years ago)
- google:author:
- aitotat@gmail.com
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeCommand.asm
r218 r238 15 15 ; AL, BX, CX, DX 16 16 ;-------------------------------------------------------------------- 17 I deCommand_ResetMasterAndSlaveController:17 IDEDEVICE%+Command_ResetMasterAndSlaveController: 18 18 ; HSR0: Set_SRST 19 19 call AccessDPT_GetDeviceControlByteToAL 20 20 or al, FLG_DEVCONTROL_SRST | FLG_DEVCONTROL_nIEN ; Set Reset bit 21 mov dl, DEVICE_CONTROL_REGISTER_out 22 call IdeIO_OutputALtoIdeControlBlockRegisterInDL 21 OUTPUT_AL_TO_IDE_CONTROL_BLOCK_REGISTER DEVICE_CONTROL_REGISTER_out 23 22 mov ax, HSR0_RESET_WAIT_US 24 23 call Timer_DelayMicrosecondsFromAX … … 28 27 or al, FLG_DEVCONTROL_nIEN 29 28 and al, ~FLG_DEVCONTROL_SRST ; Clear reset bit 30 mov dl, DEVICE_CONTROL_REGISTER_out 31 call IdeIO_OutputALtoIdeControlBlockRegisterInDL 29 OUTPUT_AL_TO_IDE_CONTROL_BLOCK_REGISTER DEVICE_CONTROL_REGISTER_out 32 30 mov ax, HSR1_RESET_WAIT_US 33 31 call Timer_DelayMicrosecondsFromAX … … 35 33 ; HSR2: Check_status 36 34 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_MOTOR_STARTUP, FLG_STATUS_BSY) 37 jmp I deWait_PollStatusFlagInBLwithTimeoutInBH35 jmp IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 38 36 39 37 … … 51 49 ; AL, BL, CX, DX, SI, DI, ES 52 50 ;-------------------------------------------------------------------- 53 I deCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH:51 IDEDEVICE%+Command_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH: 54 52 ; Create fake DPT to be able to use Device.asm functions 55 53 call FindDPT_ForNewDriveToDSDI … … 66 64 jnz SHORT .SkipLongWaitSinceDriveIsNotPrimaryMaster 67 65 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_MOTOR_STARTUP, FLG_STATUS_BSY) 68 call I deWait_PollStatusFlagInBLwithTimeoutInBH66 call IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 69 67 .SkipLongWaitSinceDriveIsNotPrimaryMaster: 70 68 … … 100 98 ;-------------------------------------------------------------------- 101 99 ALIGN JUMP_ALIGN 102 I deCommand_OutputWithParameters:100 IDEDEVICE%+Command_OutputWithParameters: 103 101 push bx ; Store status register bits to poll 104 102 105 103 ; Select Master or Slave drive and output head number or LBA28 top bits 106 call I deCommand_SelectDrive104 call IDEDEVICE%+Command_SelectDrive 107 105 jc SHORT .DriveNotReady 108 106 … … 119 117 pop ds 120 118 .DoNotSetInterruptInServiceFlag: 121 mov dl, DEVICE_CONTROL_REGISTER_out 122 call IdeIO_OutputALtoIdeControlBlockRegisterInDL 119 OUTPUT_AL_TO_IDE_CONTROL_BLOCK_REGISTER DEVICE_CONTROL_REGISTER_out 123 120 124 121 ; Output Feature Number 125 mov dl, FEATURES_REGISTER_out126 122 mov al, [bp+IDEPACK.bFeatures] 127 call IdeIO_OutputALtoIdeRegisterInDL123 OUTPUT_AL_TO_IDE_REGISTER FEATURES_REGISTER_out 128 124 129 125 ; Output Sector Address High (only used by LBA48) … … 138 134 139 135 ; Output command 140 mov dl, COMMAND_REGISTER_out141 136 mov al, [bp+IDEPACK.bCommand] 142 call IdeIO_OutputALtoIdeRegisterInDL137 OUTPUT_AL_TO_IDE_REGISTER COMMAND_REGISTER_out 143 138 144 139 ; Wait until command completed 145 140 pop bx ; Pop status and timeout for polling 146 141 cmp bl, FLG_STATUS_DRQ ; Data transfer started? 147 je SHORT I deTransfer_StartWithCommandInAL142 je SHORT IDEDEVICE%+Transfer_StartWithCommandInAL 148 143 test BYTE [bp+IDEPACK.bDeviceControl], FLG_DEVCONTROL_nIEN 149 144 jz SHORT .WaitForIrqOrRdy 150 jmp I deWait_PollStatusFlagInBLwithTimeoutInBH145 jmp IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 151 146 152 147 ALIGN JUMP_ALIGN 153 148 .WaitForIrqOrRdy: 154 jmp I deWait_IRQorStatusFlagInBLwithTimeoutInBH149 jmp IDEDEVICE%+Wait_IRQorStatusFlagInBLwithTimeoutInBH 155 150 156 151 .DriveNotReady: 157 152 pop bx ; Clean stack 158 ReturnSinceTimeoutWhenPollingBusy:153 IDEDEVICE%+ReturnSinceTimeoutWhenPollingBusy: 159 154 ret 160 155 … … 172 167 ;-------------------------------------------------------------------- 173 168 ALIGN JUMP_ALIGN 174 I deCommand_SelectDrive:169 IDEDEVICE%+Command_SelectDrive: 175 170 ; Wait until neither Master or Slave Drive is busy 176 171 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY) 177 172 cmp BYTE [bp+IDEPACK.bCommand], COMMAND_IDENTIFY_DEVICE 178 173 eCMOVE bh, TIMEOUT_IDENTIFY_DEVICE 179 call I deWait_PollStatusFlagInBLwithTimeoutInBH180 jc SHORT ReturnSinceTimeoutWhenPollingBusy174 call IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 175 jc SHORT IDEDEVICE%+ReturnSinceTimeoutWhenPollingBusy 181 176 182 177 ; Select Master or Slave Drive 183 mov dl, DRIVE_AND_HEAD_SELECT_REGISTER184 178 mov al, [bp+IDEPACK.bDrvAndHead] 185 call IdeIO_OutputALtoIdeRegisterInDL179 OUTPUT_AL_TO_IDE_REGISTER DRIVE_AND_HEAD_SELECT_REGISTER 186 180 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRDY, FLG_STATUS_DRDY) 187 181 cmp BYTE [bp+IDEPACK.bCommand], COMMAND_IDENTIFY_DEVICE 188 182 eCMOVE bh, TIMEOUT_IDENTIFY_DEVICE 189 jmp I deWait_PollStatusFlagInBLwithTimeoutInBH183 jmp IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 190 184 191 185 … … 203 197 ; AL, BX, DX 204 198 ;-------------------------------------------------------------------- 199 %ifdef ASSEMBLE_SHARED_IDE_DEVICE_FUNCTIONS 205 200 ALIGN JUMP_ALIGN 206 201 OutputSectorCountAndAddress: 207 mov dl, SECTOR_COUNT_REGISTER 208 call IdeIO_OutputALtoIdeRegisterInDL 202 OUTPUT_AL_TO_IDE_REGISTER SECTOR_COUNT_REGISTER 209 203 210 204 mov al, ah 211 mov dl, LBA_LOW_REGISTER 212 call IdeIO_OutputALtoIdeRegisterInDL 205 OUTPUT_AL_TO_IDE_REGISTER LBA_LOW_REGISTER 213 206 214 207 mov al, cl 215 mov dl, LBA_MIDDLE_REGISTER 216 call IdeIO_OutputALtoIdeRegisterInDL 208 OUTPUT_AL_TO_IDE_REGISTER LBA_MIDDLE_REGISTER 217 209 218 210 mov al, ch 219 mov dl,LBA_HIGH_REGISTER220 jmp IdeIO_OutputALtoIdeRegisterInDL 211 JUMP_TO_OUTPUT_AL_TO_IDE_REGISTER LBA_HIGH_REGISTER 212 %endif
Note:
See TracChangeset
for help on using the changeset viewer.