diff options
author | 2020-09-02 23:20:24 +0300 | |
---|---|---|
committer | 2020-09-02 23:20:38 +0300 | |
commit | dd52821ceb079901c9a73dbb41f950cd30cacacb (patch) | |
tree | 16ee097b32b24012d446d0ed296045fc71071684 | |
parent | fd99568b8cf343953eb2f7bbe142cde470bd6c59 (diff) |
wd33c93: handle 'polled DMA' in vme_hcpu30 (nw)
-rw-r--r-- | src/devices/machine/wd33c9x.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/devices/machine/wd33c9x.cpp b/src/devices/machine/wd33c9x.cpp index 7c84c86f72d..89d89e30051 100644 --- a/src/devices/machine/wd33c9x.cpp +++ b/src/devices/machine/wd33c9x.cpp @@ -901,8 +901,8 @@ void wd33c9x_base_device::step(bool timeout) set_scsi_state(FINISHED); irq_fifo_push(SCSI_STATUS_SELECT_TRANSFER_SUCCESS); } else { - // Makes very little sense, but the previous code did it and warzard seems to need it - XXX - m_regs[CONTROL] |= CONTROL_EDI; + set_scsi_state(FINISHED); + irq_fifo_push(SCSI_STATUS_DISCONNECT); } break; @@ -1164,6 +1164,8 @@ void wd33c9x_base_device::step(bool timeout) delay(send_byte()); } else if ((m_regs[CONTROL] & CONTROL_DM) == CONTROL_DM_POLLED) { m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR; + } else { + delay(1); } break; @@ -1208,9 +1210,13 @@ void wd33c9x_base_device::step(bool timeout) if (!data_fifo_full()) { // if it's the last message byte, ACK remains asserted, terminate with function_complete() //state = (m_xfr_phase == S_PHASE_MSG_IN && (!dma_command || tcounter == 1)) ? INIT_XFR_RECV_BYTE_NACK : INIT_XFR_RECV_BYTE_ACK; - scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ); - set_scsi_state((RECV_WAIT_REQ_1 << SUB_SHIFT) | INIT_XFR_RECV_BYTE_ACK); - step(false); + if (m_drq_state) { + delay(1); + } else { + scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ); + set_scsi_state((RECV_WAIT_REQ_1 << SUB_SHIFT) | INIT_XFR_RECV_BYTE_ACK); + step(false); + } } break; |