trunk/src/mess/machine/fm_scsi.c
| r30855 | r30856 | |
| 71 | 71 | m_target = 0; |
| 72 | 72 | m_result_length = 0; |
| 73 | 73 | m_result_index = 0; |
| 74 | stop_transfer(); |
| 75 | set_input_line(FMSCSI_LINE_INT,0); |
| 76 | m_irq_handler(0); |
| 74 | 77 | |
| 75 | 78 | m_phase = SCSI_PHASE_BUS_FREE; |
| 76 | 79 | } |
| r30855 | r30856 | |
| 109 | 112 | } |
| 110 | 113 | } |
| 111 | 114 | |
| 115 | void fmscsi_device::stop_transfer() |
| 116 | { |
| 117 | m_transfer_timer->adjust(attotime::never); // stop timer |
| 118 | m_phase_timer->adjust(attotime::from_usec(800),SCSI_PHASE_STATUS); |
| 119 | if(m_output_lines & FMSCSI_LINE_DMAE) |
| 120 | { |
| 121 | m_drq_handler(0); |
| 122 | } |
| 123 | logerror("FMSCSI: Stopping transfer : (%i/%i)\n",m_result_index,m_result_length); |
| 124 | } |
| 125 | |
| 112 | 126 | UINT8 fmscsi_device::fmscsi_data_r(void) |
| 113 | 127 | { |
| 114 | 128 | // read from data bus |
| r30855 | r30856 | |
| 126 | 140 | if(m_result_index >= m_result_length) |
| 127 | 141 | { |
| 128 | 142 | // end of data transfer |
| 129 | | m_transfer_timer->adjust(attotime::never); // stop timer |
| 130 | | m_phase_timer->adjust(attotime::from_usec(800),SCSI_PHASE_STATUS); |
| 131 | | if(m_output_lines & FMSCSI_LINE_DMAE) |
| 132 | | { |
| 133 | | m_drq_handler(0); |
| 134 | | } |
| 135 | | logerror("FMSCSI: Stopping transfer : (%i/%i)\n",m_result_index,m_result_length); |
| 143 | stop_transfer(); |
| 136 | 144 | } |
| 137 | 145 | return m_data; |
| 138 | 146 | } |
| r30855 | r30856 | |
| 147 | 155 | |
| 148 | 156 | if(m_phase == SCSI_PHASE_STATUS) |
| 149 | 157 | { |
| 150 | | m_data = 0; // GOOD status |
| 158 | m_data = get_status(); |
| 151 | 159 | // no command complete message? |
| 152 | 160 | m_phase_timer->adjust(attotime::from_usec(800),SCSI_PHASE_MESSAGE_IN); |
| 153 | 161 | m_command_index = 0; |
| r30855 | r30856 | |
| 210 | 218 | send_command(m_command,m_command_index); |
| 211 | 219 | m_result_length = get_length(); |
| 212 | 220 | phase = legacy_scsi_host_adapter::get_phase(); |
| 213 | | if(m_command[0] == 1) // rezero unit command - not implemented in SCSI code |
| 214 | | m_phase_timer->adjust(attotime::from_usec(800),SCSI_PHASE_STATUS); |
| 215 | | else |
| 216 | | m_phase_timer->adjust(attotime::from_usec(800),phase); |
| 221 | m_phase_timer->adjust(attotime::from_usec(800),phase); |
| 217 | 222 | |
| 218 | 223 | logerror("FMSCSI: Command %02x sent, result length = %i\n",m_command[0],m_result_length); |
| 219 | 224 | } |
| r30855 | r30856 | |
| 264 | 269 | m_transfer_timer->adjust(attotime::zero,0,attotime::from_hz(3000000)); // arbitrary value for now |
| 265 | 270 | read_data(m_buffer,512); |
| 266 | 271 | m_result_index = 0; |
| 267 | | logerror("FMSCSI: Starting transfer (%i)\n",m_result_length); |
| 272 | logerror("FMSCSI: Starting transfer in (%i)\n",m_result_length); |
| 268 | 273 | break; |
| 269 | 274 | case SCSI_PHASE_DATAOUT: |
| 270 | 275 | set_input_line(FMSCSI_LINE_CD,0); |
| r30855 | r30856 | |
| 274 | 279 | // start transfer timer |
| 275 | 280 | m_transfer_timer->adjust(attotime::zero,0,attotime::from_hz(3000000)); // arbitrary value for now |
| 276 | 281 | m_result_index = 0; |
| 277 | | logerror("FMSCSI: Starting transfer (%i)\n",m_result_length); |
| 282 | logerror("FMSCSI: Starting transfer out (%i)\n",m_result_length); |
| 278 | 283 | break; |
| 279 | 284 | case SCSI_PHASE_MESSAGE_IN: |
| 280 | 285 | set_input_line(FMSCSI_LINE_CD,1); |