summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/mb87030.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/mb87030.cpp')
-rw-r--r--src/devices/machine/mb87030.cpp61
1 files changed, 30 insertions, 31 deletions
diff --git a/src/devices/machine/mb87030.cpp b/src/devices/machine/mb87030.cpp
index 0e0f641ebff..6de5bc862b4 100644
--- a/src/devices/machine/mb87030.cpp
+++ b/src/devices/machine/mb87030.cpp
@@ -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)