diff options
Diffstat (limited to 'src/devices/machine/cxd1185.cpp')
-rw-r--r-- | src/devices/machine/cxd1185.cpp | 84 |
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; |