mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
mb87030: support padding mode
This makes Pascal 3.25 boot/run from SCSI on hp9k_3xx. Pascal is now a fully running OS like BASIC on these machines. While at it also clean up a few style issues.
This commit is contained in:
parent
e7edb3d174
commit
295ac93d43
@ -168,10 +168,6 @@ void mb87030_device::scsi_disconnect()
|
||||
LOG("%s: m_tc %d\n", __FUNCTION__, m_tc);
|
||||
m_ssts &= ~(SSTS_INIT_CONNECTED|SSTS_TARG_CONNECTED|SSTS_SPC_BUSY|SSTS_XFER_IN_PROGRESS);
|
||||
m_ints = INTS_DISCONNECTED;
|
||||
if (m_pctl & PCTL_BUS_FREE_IE) {
|
||||
LOG("disconnect IE\n");
|
||||
m_ints |= INTS_DISCONNECTED;
|
||||
}
|
||||
update_ints();
|
||||
update_state(State::Idle);
|
||||
}
|
||||
@ -236,22 +232,20 @@ void mb87030_device::step(bool timeout)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ((m_ssts & SSTS_INIT_CONNECTED) && !(ctrl & S_BSY)) {
|
||||
LOG("SCSI disconnect\n");
|
||||
scsi_disconnect();
|
||||
scsi_set_ctrl(0, S_ALL);
|
||||
}
|
||||
|
||||
|
||||
switch(m_state) {
|
||||
switch (m_state) {
|
||||
case State::Idle:
|
||||
|
||||
if (ctrl == 0 && (m_pctl & PCTL_BUS_FREE_IE)) {
|
||||
m_ints |= INTS_DISCONNECTED;
|
||||
update_ints();
|
||||
}
|
||||
break;
|
||||
|
||||
case State::ArbitrationWaitBusFree:
|
||||
if (!(ctrl & (S_BSY|S_SEL)))
|
||||
update_state(State::ArbitrationAssertBSY, 1);
|
||||
@ -264,7 +258,6 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
|
||||
case State::ArbitrationWait:
|
||||
|
||||
for (int id = (2 << m_bdid); id <= 0x80; id <<= 1) {
|
||||
LOG("check %d\n", id);
|
||||
if (data & id) {
|
||||
@ -322,18 +315,13 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
|
||||
case State::TransferWaitReq:
|
||||
|
||||
|
||||
if (!m_tc && (m_fifo.empty() || m_dma_transfer)) {
|
||||
if (!m_tc && !(m_scmd & SCMD_TERM_MODE)) {
|
||||
LOG("TransferWaitReq: tc == 0\n");
|
||||
scsi_bus->data_w(scsi_refid, 0);
|
||||
scsi_command_complete();
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_tc < 0)
|
||||
break;
|
||||
|
||||
if (m_scsi_phase != (ctrl & S_PHASE_MASK)) {
|
||||
LOG("SCSI phase change during transfer\n");
|
||||
m_ints |= INTS_SERVICE_REQUIRED;
|
||||
@ -347,7 +335,7 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!m_dma_transfer) {
|
||||
if (!m_dma_transfer || (m_scmd & SCMD_TERM_MODE)) {
|
||||
update_state((ctrl & S_INP) ? State::TransferRecvData : State::TransferSendData, 1);
|
||||
} else {
|
||||
update_state((ctrl & S_INP) ? State::TransferRecvDataDMAReq : State::TransferSendDataDMAReq, 1);
|
||||
@ -355,6 +343,11 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
|
||||
case State::TransferRecvData:
|
||||
if (!m_tc && (m_scmd & SCMD_TERM_MODE)) {
|
||||
update_state(State::TransferSendAck, 10);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!m_tc || m_fifo.full())
|
||||
break;
|
||||
|
||||
@ -381,15 +374,18 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
|
||||
case State::TransferSendData:
|
||||
|
||||
if (m_tc < 0 || m_fifo.empty()) {
|
||||
LOG("fifo empty or m_tc(%d) zero\n", m_tc);
|
||||
if (m_tc && !m_fifo.empty()) {
|
||||
scsi_bus->data_w(scsi_refid, m_fifo.dequeue());
|
||||
m_tc--;
|
||||
update_state(State::TransferSendAck, 10);
|
||||
break;
|
||||
}
|
||||
|
||||
scsi_bus->data_w(scsi_refid, m_fifo.dequeue());
|
||||
m_tc--;
|
||||
update_state(State::TransferSendAck, 10);
|
||||
if (!m_tc && (m_scmd & SCMD_TERM_MODE)) {
|
||||
scsi_bus->data_w(scsi_refid, m_temp);
|
||||
update_state(State::TransferSendAck, 10);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case State::TransferSendDataDMAReq:
|
||||
@ -409,12 +405,11 @@ void mb87030_device::step(bool timeout)
|
||||
break;
|
||||
|
||||
case State::TransferSendAck:
|
||||
if (!(m_scmd & SCMD_TERM_MODE) && !(ctrl & S_INP))
|
||||
m_temp = data;
|
||||
|
||||
if (!(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;
|
||||
@ -539,10 +534,11 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
LOG("%s: %02X\n", __FUNCTION__, data);
|
||||
m_scmd = data;
|
||||
|
||||
switch(m_scmd & SCMD_CMD_MASK) {
|
||||
switch (m_scmd & SCMD_CMD_MASK) {
|
||||
case SCMD_CMD_BUS_RELEASE:
|
||||
LOG("%s: Bus release\n", __FUNCTION__);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_SELECT:
|
||||
LOG("%s: Select\n", __FUNCTION__);
|
||||
if (m_sctl & SCTL_ARBITRATION_ENABLE)
|
||||
@ -551,6 +547,7 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
update_state(State::SelectionWaitBusFree, 10);
|
||||
step(false);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_RESET_ATN:
|
||||
LOG("%s: Reset ATN\n", __FUNCTION__);
|
||||
// if (m_state == State::Idle)
|
||||
@ -558,6 +555,7 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
// else
|
||||
scsi_set_ctrl(0, S_ATN);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_SET_ATN:
|
||||
LOG("%s: Set ATN\n", __FUNCTION__);
|
||||
if (m_state == State::Idle)
|
||||
@ -565,6 +563,7 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
else
|
||||
scsi_set_ctrl(S_ATN, S_ATN);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_TRANSFER:
|
||||
if (!(m_ssts & (SSTS_INIT_CONNECTED|SSTS_TARG_CONNECTED)))
|
||||
break;
|
||||
@ -574,9 +573,11 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
m_ssts |= SSTS_SPC_BUSY|SSTS_XFER_IN_PROGRESS;
|
||||
update_state(State::TransferWaitReq, 5);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_TRANSFER_PAUSE:
|
||||
LOG("%s: Transfer Pause\n", __FUNCTION__);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_RESET_ACK_REQ:
|
||||
LOG("%s: Reset ACK/REQ\n", __FUNCTION__);
|
||||
if (m_ssts & SSTS_INIT_CONNECTED)
|
||||
@ -584,6 +585,7 @@ WRITE8_MEMBER(mb87030_device::scmd_w)
|
||||
if (m_ssts & SSTS_TARG_CONNECTED)
|
||||
scsi_set_ctrl(0, S_REQ);
|
||||
break;
|
||||
|
||||
case SCMD_CMD_SET_ACK_REQ:
|
||||
LOG("%s: Set ACK/REQ\n", __FUNCTION__);
|
||||
if (m_ssts & SSTS_INIT_CONNECTED) {
|
||||
@ -676,7 +678,6 @@ WRITE8_MEMBER(mb87030_device::pctl_w)
|
||||
m_scsi_phase = m_pctl & 7;
|
||||
if (m_pctl & PCTL_BUS_FREE_IE)
|
||||
step(false);
|
||||
|
||||
}
|
||||
|
||||
READ8_MEMBER(mb87030_device::mbc_r)
|
||||
@ -687,7 +688,6 @@ READ8_MEMBER(mb87030_device::mbc_r)
|
||||
|
||||
READ8_MEMBER(mb87030_device::dreg_r)
|
||||
{
|
||||
|
||||
step(false);
|
||||
if (!m_fifo.empty())
|
||||
m_dreg = m_fifo.dequeue();
|
||||
@ -709,7 +709,6 @@ READ8_MEMBER(mb87030_device::temp_r)
|
||||
step(false);
|
||||
LOG("%s: %02X\n", __FUNCTION__, m_temp);
|
||||
return m_temp;
|
||||
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(mb87030_device::temp_w)
|
||||
|
Loading…
Reference in New Issue
Block a user