summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/cxd1185.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/cxd1185.cpp')
-rw-r--r--src/devices/machine/cxd1185.cpp84
1 files changed, 49 insertions, 35 deletions
diff --git a/src/devices/machine/cxd1185.cpp b/src/devices/machine/cxd1185.cpp
index 369053aa69d..8b24126b662 100644
--- a/src/devices/machine/cxd1185.cpp
+++ b/src/devices/machine/cxd1185.cpp
@@ -9,7 +9,6 @@
*
* TODO:
* - target mode
- * - pio mode testing
* - cq/aq variants
* - synchronous mode
*/
@@ -17,7 +16,6 @@
#include "emu.h"
#include "cxd1185.h"
-#define LOG_GENERAL (1U << 0)
#define LOG_CMD (1U << 1)
#define LOG_REG (1U << 2)
#define LOG_STATE (1U << 3)
@@ -75,10 +73,6 @@ void cxd1185_device::map(address_map &map)
void cxd1185_device::device_start()
{
- m_irq_out_cb.resolve_safe();
- m_drq_out_cb.resolve_safe();
- m_port_out_cb.resolve_safe();
-
save_item(NAME(m_state));
save_item(NAME(m_irq_asserted));
save_item(NAME(m_drq_asserted));
@@ -101,7 +95,7 @@ void cxd1185_device::device_start()
save_item(NAME(m_scsi_ctrl));
save_item(NAME(m_ioport));
- m_state_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cxd1185_device::state_timer), this));
+ m_state_timer = timer_alloc(FUNC(cxd1185_device::state_timer), this);
m_state = IDLE;
m_irq_asserted = false;
@@ -169,10 +163,15 @@ u8 cxd1185_device::scsi_data_r()
if (!m_pio_data_mode)
{
- data = m_fifo.dequeue();
+ if (!machine().side_effects_disabled())
+ {
+ data = m_fifo.dequeue();
- if (m_state != IDLE && !m_state_timer->enabled())
- m_state_timer->adjust(attotime::zero);
+ if (m_state != IDLE && !m_state_timer->enabled())
+ m_state_timer->adjust(attotime::zero);
+ }
+ else
+ data = m_fifo.peek();
}
else
data = scsi_bus->data_r();
@@ -186,10 +185,13 @@ template <unsigned Register> u8 cxd1185_device::int_req_r()
{
u8 const data = m_int_req[Register];
- LOGMASKED(LOG_REG, "int_req_r<%d> 0x%02x\n", Register, data);
+ if (!machine().side_effects_disabled())
+ {
+ LOGMASKED(LOG_REG, "int_req_r<%d> 0x%02x\n", Register, data);
- m_int_req[Register] = 0;
- int_check();
+ m_int_req[Register] = 0;
+ int_check();
+ }
return data;
}
@@ -475,7 +477,7 @@ void cxd1185_device::ioport_w(u8 data)
m_port_out_cb(0, m_ioport & mask, mask);
}
-void cxd1185_device::state_timer(void *ptr, s32 param)
+void cxd1185_device::state_timer(s32 param)
{
// step state machine
int delay = state_step();
@@ -595,7 +597,7 @@ int cxd1185_device::state_step()
break;
case XFR_INFO:
- LOGMASKED(LOG_STATE, "transfer: count %d waiting for REQ\n", m_count);
+ LOGMASKED(LOG_STATE, "transfer: count %d waiting for REQ\n", (m_command & TRBE) ? m_count : 1);
if (scsi_bus->ctrl_r() & S_REQ)
m_state = scsi_bus->ctrl_r() & S_INP ? XFR_IN : XFR_OUT;
break;
@@ -625,10 +627,12 @@ int cxd1185_device::state_step()
case XFR_IN_NEXT:
if (!(scsi_bus->ctrl_r() & S_REQ))
{
- LOGMASKED(LOG_STATE, "transfer in: count %d\n", m_count);
- if (!m_count)
+ LOGMASKED(LOG_STATE, "transfer in: count %d\n", (m_command & TRBE) ? m_count : 0);
+ if (!(m_command & TRBE) || !m_count)
{
- m_status |= TRBZ;
+ if (m_command & TRBE)
+ m_status |= TRBZ;
+
m_state = XFR_IN_DRAIN;
}
else
@@ -641,24 +645,23 @@ int cxd1185_device::state_step()
break;
case XFR_IN_REQ:
if (scsi_bus->ctrl_r() & S_REQ)
- m_state = XFR_IN;
- break;
- case XFR_IN_DRAIN:
- // TODO: not sure whether commands complete before fifo is empty
-#if 0
- if (!m_fifo.empty())
{
- delay = -1;
- if (m_command & DMA)
- set_drq(true);
+ // check if target changed phase
+ if (m_int_req[1] & PHC)
+ {
+ if (m_command & DMA)
+ set_drq(false);
+
+ m_state = XFR_INFO_DONE;
+ }
+ else
+ m_state = XFR_IN;
}
- else
- m_state = XFR_INFO_DONE;
-#else
+ break;
+ case XFR_IN_DRAIN:
if (!m_fifo.empty() && (m_command & DMA))
set_drq(true);
m_state = XFR_INFO_DONE;
-#endif
break;
case XFR_OUT:
if (!m_fifo.empty() || (m_command & CMD) == (CMD_XFR_PAD & CMD))
@@ -682,7 +685,7 @@ int cxd1185_device::state_step()
case XFR_OUT_NEXT:
if (!(scsi_bus->ctrl_r() & S_REQ))
{
- LOGMASKED(LOG_STATE, "transfer out: data accepted\n");
+ LOGMASKED(LOG_STATE, "transfer out: data ACK\n");
if (m_command & TRBE)
{
if (!--m_count)
@@ -702,9 +705,20 @@ int cxd1185_device::state_step()
}
break;
case XFR_OUT_REQ:
- LOGMASKED(LOG_STATE, "transfer out: waiting for REQ\n");
+ LOGMASKED(LOG_STATE, "transfer out: count %d waiting for REQ\n", m_count);
if (scsi_bus->ctrl_r() & S_REQ)
- m_state = XFR_OUT;
+ {
+ // check if target changed phase
+ if (m_int_req[1] & PHC)
+ {
+ if (m_command & DMA)
+ set_drq(false);
+
+ m_state = XFR_INFO_DONE;
+ }
+ else
+ m_state = XFR_OUT;
+ }
break;
case XFR_INFO_DONE:
LOGMASKED(LOG_STATE, "transfer: complete\n");
@@ -883,7 +897,7 @@ void cxd1185_device::port_w(u8 data)
{
u8 const mask = ~(PCN | ((m_ioport & PCN) >> 4));
- LOGMASKED(LOG_GENERAL, "port_w 0x%02x mask 0x%02x\n", data, mask);
+ LOG("port_w 0x%02x mask 0x%02x\n", data, mask);
m_ioport &= ~mask;
m_ioport |= data & mask;