mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
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:
parent
7e20a3d357
commit
d675000e4d
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user