From d675000e4df7d16433ba6b5013659abf0622d8dd Mon Sep 17 00:00:00 2001 From: dxl <41547105+hp9k@users.noreply.github.com> Date: Sun, 25 Nov 2018 18:33:22 +0100 Subject: Fix MB87030 on HP9000/382 (#4336) * mb87030: deduplicate transfer count decrement (nw) * mb87030: move fifo queue/dequeue end of state machine (nw) This makes the HP9000/382 work with MB87030 SCSI. --- src/devices/machine/mb87030.cpp | 25 ++++++++++++++----------- src/devices/machine/mb87030.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/devices/machine/mb87030.cpp b/src/devices/machine/mb87030.cpp index 9edbec0f429..7606578dfbb 100644 --- a/src/devices/machine/mb87030.cpp +++ b/src/devices/machine/mb87030.cpp @@ -351,10 +351,7 @@ void mb87030_device::step(bool timeout) if (!m_tc || m_fifo.full()) break; - LOG("pushing read data: %02X\n", data); - m_fifo.enqueue(data); - m_tc--; - + m_bus_data = data; update_state(State::TransferSendAck, 10); break; @@ -362,7 +359,6 @@ void mb87030_device::step(bool timeout) m_hdb = data; m_hdb_loaded = true; update_state(State::TransferRecvDataDMAResp, 10); - m_tc--; m_dreq_handler(true); break; @@ -375,8 +371,7 @@ void mb87030_device::step(bool timeout) case State::TransferSendData: if (m_tc && !m_fifo.empty()) { - scsi_bus->data_w(scsi_refid, m_fifo.dequeue()); - m_tc--; + scsi_bus->data_w(scsi_refid, m_fifo.peek()); update_state(State::TransferSendAck, 10); break; } @@ -400,7 +395,6 @@ void mb87030_device::step(bool timeout) m_hdb_loaded = false; m_dreq_handler(false); scsi_bus->data_w(scsi_refid, m_hdb); - m_tc--; update_state(State::TransferSendAck, 10); break; @@ -408,9 +402,8 @@ void mb87030_device::step(bool timeout) if (!(m_scmd & SCMD_TERM_MODE) && !(ctrl & S_INP)) m_temp = data; - scsi_set_ctrl(S_ACK, S_ACK); - scsi_bus->ctrl_wait(scsi_refid, 0, S_REQ); - + scsi_set_ctrl(S_ACK, S_ACK); + scsi_bus->ctrl_wait(scsi_refid, 0, S_REQ); update_state(State::TransferWaitDeassertREQ, 10); break; @@ -420,6 +413,15 @@ void mb87030_device::step(bool timeout) break; case State::TransferDeassertACK: + m_tc--; + if (!m_dma_transfer) { + if (!(ctrl & S_INP)) { + m_fifo.dequeue(); + } else { + LOG("pushing read data: %02X\n", m_bus_data); + m_fifo.enqueue(m_bus_data); + } + } update_state(State::TransferWaitReq, 10); scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ); scsi_set_ctrl(0, S_ACK); @@ -458,6 +460,7 @@ void mb87030_device::device_start() save_item(NAME(m_scsi_phase)); save_item(NAME(m_scsi_ctrl)); save_item(NAME(m_dma_transfer)); + save_item(NAME(m_bus_data)); // save_item(NAME(m_state)); } diff --git a/src/devices/machine/mb87030.h b/src/devices/machine/mb87030.h index 7ce8c85c8e2..560e53c90c0 100644 --- a/src/devices/machine/mb87030.h +++ b/src/devices/machine/mb87030.h @@ -205,6 +205,7 @@ private: uint32_t m_tc; uint8_t m_exbf; + uint8_t m_bus_data; uint8_t m_hdb; bool m_hdb_loaded; bool m_send_atn_during_selection; -- cgit v1.2.3