src/mess/machine/fm_scsi.c
| r9543 | r9544 | |
| 87 | 87 | |
| 88 | 88 | // allocate read timer |
| 89 | 89 | m_transfer_timer = device_timer_alloc(*this,TIMER_TRANSFER); |
| 90 | m_phase_timer = device_timer_alloc(*this,TIMER_PHASE); |
| 90 | 91 | } |
| 91 | 92 | |
| 92 | 93 | void fmscsi_device::device_reset() |
| r9543 | r9544 | |
| 162 | 163 | devcb_call_write_line(&m_drq_func,1); |
| 163 | 164 | } |
| 164 | 165 | break; |
| 166 | case TIMER_PHASE: |
| 167 | set_phase(param); |
| 168 | break; |
| 165 | 169 | } |
| 166 | 170 | } |
| 167 | 171 | |
| r9543 | r9544 | |
| 196 | 200 | if(m_phase == SCSI_PHASE_MESSAGE_IN) |
| 197 | 201 | { |
| 198 | 202 | m_data = 0; // command complete message |
| 199 | | set_phase(SCSI_PHASE_BUS_FREE); |
| 203 | timer_adjust_oneshot(m_phase_timer,ATTOTIME_IN_NSEC(800),SCSI_PHASE_BUS_FREE); |
| 200 | 204 | m_command_index = 0; |
| 201 | 205 | return m_data; |
| 202 | 206 | } |
| 203 | 207 | |
| 204 | 208 | if(m_phase == SCSI_PHASE_STATUS) |
| 205 | 209 | { |
| 206 | | m_data = 0; // no errors |
| 210 | m_data = 0; // GOOD status |
| 207 | 211 | // no command complete message? |
| 208 | | set_phase(SCSI_PHASE_BUS_FREE); |
| 212 | timer_adjust_oneshot(m_phase_timer,ATTOTIME_IN_NSEC(800),SCSI_PHASE_BUS_FREE); |
| 209 | 213 | m_command_index = 0; |
| 210 | 214 | //set_input_line(FMSCSI_LINE_REQ,1); // raise REQ yet again |
| 211 | 215 | return m_data; |
| r9543 | r9544 | |
| 248 | 252 | SCSISetCommand(m_SCSIdevices[m_target],m_command,m_command_index); |
| 249 | 253 | SCSIExecCommand(m_SCSIdevices[m_target],&m_result_length); |
| 250 | 254 | SCSIGetPhase(m_SCSIdevices[m_target],&phase); |
| 251 | | set_phase(phase); |
| 252 | 255 | if(m_command[0] == 1) // rezero unit command - not implemented in SCSI code |
| 253 | | set_phase(SCSI_PHASE_STATUS); |
| 256 | timer_adjust_oneshot(m_phase_timer,ATTOTIME_IN_NSEC(800),SCSI_PHASE_STATUS); |
| 257 | else |
| 258 | timer_adjust_oneshot(m_phase_timer,ATTOTIME_IN_NSEC(800),phase); |
| 259 | |
| 254 | 260 | if(phase == SCSI_PHASE_STATUS) |
| 255 | 261 | set_input_line(FMSCSI_LINE_REQ,1); |
| 256 | 262 | if(phase == SCSI_PHASE_DATAIN) |
| r9543 | r9544 | |
| 336 | 342 | { |
| 337 | 343 | if(state != 0 && !(m_input_lines & FMSCSI_LINE_REQ)) // low to high |
| 338 | 344 | { |
| 339 | | if(m_output_lines & FMSCSI_LINE_IMSK && m_phase == SCSI_PHASE_COMMAND) |
| 345 | if(m_output_lines & FMSCSI_LINE_IMSK && m_phase != SCSI_PHASE_DATAIN && m_phase != SCSI_PHASE_DATAOUT) |
| 340 | 346 | { |
| 341 | | //set_input_line(FMSCSI_LINE_INT,1); |
| 347 | set_input_line(FMSCSI_LINE_INT,1); |
| 342 | 348 | devcb_call_write_line(&m_irq_func,1); |
| 343 | 349 | } |
| 344 | 350 | } |
| 345 | 351 | if(state == 0 && (m_input_lines & FMSCSI_LINE_REQ)) // high to low |
| 346 | 352 | { |
| 347 | | if(m_output_lines & FMSCSI_LINE_IMSK && m_phase == SCSI_PHASE_COMMAND) |
| 353 | if(m_output_lines & FMSCSI_LINE_IMSK && m_phase != SCSI_PHASE_DATAIN && m_phase != SCSI_PHASE_DATAOUT) |
| 348 | 354 | { |
| 349 | | //set_input_line(FMSCSI_LINE_INT,0); |
| 355 | set_input_line(FMSCSI_LINE_INT,0); |
| 350 | 356 | devcb_call_write_line(&m_irq_func,0); |
| 351 | 357 | } |
| 352 | 358 | } |
| r9543 | r9544 | |
| 380 | 386 | { |
| 381 | 387 | if (image->exists()) // if device is mounted |
| 382 | 388 | { |
| 383 | | set_phase(SCSI_PHASE_COMMAND); |
| 389 | timer_adjust_oneshot(m_phase_timer,ATTOTIME_IN_NSEC(800),SCSI_PHASE_COMMAND); |
| 384 | 390 | m_data = 0x08; |
| 385 | 391 | } |
| 386 | 392 | } |