summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Sergey Svishchev <shattered@users.noreply.github.com>2020-09-02 23:20:24 +0300
committer Sergey Svishchev <shattered@users.noreply.github.com>2020-09-02 23:20:38 +0300
commitdd52821ceb079901c9a73dbb41f950cd30cacacb (patch)
tree16ee097b32b24012d446d0ed296045fc71071684
parentfd99568b8cf343953eb2f7bbe142cde470bd6c59 (diff)
wd33c93: handle 'polled DMA' in vme_hcpu30 (nw)
-rw-r--r--src/devices/machine/wd33c9x.cpp16
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;