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.
This commit is contained in:
dxl 2018-11-25 18:33:22 +01:00 committed by ajrhacker
parent 7e20a3d357
commit d675000e4d
2 changed files with 15 additions and 11 deletions

View File

@ -351,10 +351,7 @@ void mb87030_device::step(bool timeout)
if (!m_tc || m_fifo.full()) if (!m_tc || m_fifo.full())
break; break;
LOG("pushing read data: %02X\n", data); m_bus_data = data;
m_fifo.enqueue(data);
m_tc--;
update_state(State::TransferSendAck, 10); update_state(State::TransferSendAck, 10);
break; break;
@ -362,7 +359,6 @@ void mb87030_device::step(bool timeout)
m_hdb = data; m_hdb = data;
m_hdb_loaded = true; m_hdb_loaded = true;
update_state(State::TransferRecvDataDMAResp, 10); update_state(State::TransferRecvDataDMAResp, 10);
m_tc--;
m_dreq_handler(true); m_dreq_handler(true);
break; break;
@ -375,8 +371,7 @@ void mb87030_device::step(bool timeout)
case State::TransferSendData: case State::TransferSendData:
if (m_tc && !m_fifo.empty()) { if (m_tc && !m_fifo.empty()) {
scsi_bus->data_w(scsi_refid, m_fifo.dequeue()); scsi_bus->data_w(scsi_refid, m_fifo.peek());
m_tc--;
update_state(State::TransferSendAck, 10); update_state(State::TransferSendAck, 10);
break; break;
} }
@ -400,7 +395,6 @@ void mb87030_device::step(bool timeout)
m_hdb_loaded = false; m_hdb_loaded = false;
m_dreq_handler(false); m_dreq_handler(false);
scsi_bus->data_w(scsi_refid, m_hdb); scsi_bus->data_w(scsi_refid, m_hdb);
m_tc--;
update_state(State::TransferSendAck, 10); update_state(State::TransferSendAck, 10);
break; break;
@ -410,7 +404,6 @@ void mb87030_device::step(bool timeout)
scsi_set_ctrl(S_ACK, S_ACK); scsi_set_ctrl(S_ACK, S_ACK);
scsi_bus->ctrl_wait(scsi_refid, 0, S_REQ); scsi_bus->ctrl_wait(scsi_refid, 0, S_REQ);
update_state(State::TransferWaitDeassertREQ, 10); update_state(State::TransferWaitDeassertREQ, 10);
break; break;
@ -420,6 +413,15 @@ void mb87030_device::step(bool timeout)
break; break;
case State::TransferDeassertACK: 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); update_state(State::TransferWaitReq, 10);
scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ); scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ);
scsi_set_ctrl(0, S_ACK); 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_phase));
save_item(NAME(m_scsi_ctrl)); save_item(NAME(m_scsi_ctrl));
save_item(NAME(m_dma_transfer)); save_item(NAME(m_dma_transfer));
save_item(NAME(m_bus_data));
// save_item(NAME(m_state)); // save_item(NAME(m_state));
} }

View File

@ -205,6 +205,7 @@ private:
uint32_t m_tc; uint32_t m_tc;
uint8_t m_exbf; uint8_t m_exbf;
uint8_t m_bus_data;
uint8_t m_hdb; uint8_t m_hdb;
bool m_hdb_loaded; bool m_hdb_loaded;
bool m_send_atn_during_selection; bool m_send_atn_during_selection;