summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/ps2sif.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/ps2sif.cpp')
-rw-r--r--src/mame/machine/ps2sif.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mame/machine/ps2sif.cpp b/src/mame/machine/ps2sif.cpp
index fbe5b3ba9a5..3160103f9b5 100644
--- a/src/mame/machine/ps2sif.cpp
+++ b/src/mame/machine/ps2sif.cpp
@@ -97,7 +97,7 @@ WRITE32_MEMBER(ps2_sif_device::ee_w)
m_sm_flag &= ~data;
break;
case 8:
- logerror("%s: ee_w: SIF control = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ logerror("%s: ee_w: SIF set control = %08x & %08x\n", machine().describe_context(), data, mem_mask);
if (BIT(data, 8))
m_ctrl |= (1 << 8);
else
@@ -151,6 +151,10 @@ WRITE32_MEMBER(ps2_sif_device::iop_w)
logerror("%s: iop_w: SIF slave->master mailbox (%08x & %08x)\n", machine().describe_context(), data, mem_mask);
m_sm_mailbox = data;
break;
+ case 8:
+ logerror("%s: iop_w: SIF clear master->slave flag (%08x & %08x)\n", machine().describe_context(), data, mem_mask);
+ m_ms_flag &= ~data;
+ break;
case 12:
logerror("%s: iop_w: SIF set slave->master flag (%08x & %08x)\n", machine().describe_context(), data, mem_mask);
m_sm_flag |= data;
@@ -158,6 +162,11 @@ WRITE32_MEMBER(ps2_sif_device::iop_w)
case 16:
logerror("%s: iop_w: SIF set control (%08x & %08x)\n", machine().describe_context(), data, mem_mask);
m_ctrl ^= data & 0xf0;
+ if (data & 0x80 || data & 0x20)
+ {
+ m_ctrl &= ~0xf000;
+ m_ctrl |= 0x2000;
+ }
break;
default:
logerror("%s: iop_w: Unknown write %08x = %08x & %08x\n", machine().describe_context(), 0x1d000000 + (offset << 2), data, mem_mask);
@@ -175,8 +184,10 @@ uint32_t ps2_sif_device::fifo_pop(uint32_t channel)
{
assert(channel < 2);
assert(m_fifo_curr[channel] > 0);
+ uint32_t ret = m_fifo[channel][0];
m_fifo_curr[channel]--;
- return m_fifo[channel][m_fifo_curr[channel]];
+ memcpy(&m_fifo[channel][0], &m_fifo[channel][1], sizeof(uint32_t) * m_fifo_curr[channel]);
+ return ret;
}
void ps2_sif_device::fifo_push(uint32_t channel, uint32_t value)