summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/ps2dma.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/ps2dma.cpp')
-rw-r--r--src/mame/machine/ps2dma.cpp67
1 files changed, 36 insertions, 31 deletions
diff --git a/src/mame/machine/ps2dma.cpp b/src/mame/machine/ps2dma.cpp
index b342445176a..5d331fb69d0 100644
--- a/src/mame/machine/ps2dma.cpp
+++ b/src/mame/machine/ps2dma.cpp
@@ -129,26 +129,29 @@ void ps2_dmac_device::transfer_vif1()
if (count)
{
//logerror("%s: DMAC VIF1 quadword count: %08x\n", machine().describe_context(), count);
- uint32_t addr = channel.addr();
- if (BIT(addr, 31))
- addr -= 0x10000000;
- address_space &space = m_ee->space(AS_PROGRAM);
- uint32_t words[4] = { 0, 0, 0, 0 };
- for (int word = 0; word < 4; word++)
+ if (m_vif1->fifo_available(4))
{
- words[word] = space.read_dword(addr);
- addr += 4;
+ uint32_t addr = channel.addr();
+ if (BIT(addr, 31))
+ addr -= 0x10000000;
+ address_space &space = m_ee->space(AS_PROGRAM);
+ uint32_t words[4] = { 0, 0, 0, 0 };
+ for (int word = 0; word < 4; word++)
+ {
+ words[word] = space.read_dword(addr);
+ addr += 4;
+ }
+ m_vif1->dma_write(((uint64_t)words[3] << 32) | words[2], ((uint64_t)words[1] << 32) | words[0]);
+ channel.set_addr(channel.addr() + 0x10);
+ channel.set_quadword_count(count - 1);
}
- m_vif1->dma_write(((uint64_t)words[3] << 32) | words[2], ((uint64_t)words[1] << 32) | words[0]);
- channel.set_addr(channel.addr() + 0x10);
- channel.set_quadword_count(count - 1);
}
else if (channel.end_tag())
{
logerror("%s: DMAC VIF1 end tag\n", machine().describe_context());
transfer_finish(VIF1);
}
- else
+ else if (m_vif1->fifo_available(2))
{
logerror("%s: DMAC VIF1 following source tag\n", machine().describe_context());
uint32_t tag_addr = channel.tag_addr();
@@ -232,7 +235,7 @@ void ps2_dmac_device::transfer_sif0()
}
else if (channel.end_tag())
{
- logerror("%s: SIF0 end tag, finishing transfer\n", machine().describe_context());
+ //logerror("%s: SIF0 end tag, finishing transfer\n", machine().describe_context());
transfer_finish(SIF0);
}
else if (m_sif->fifo_depth(0) >= 2)
@@ -240,7 +243,7 @@ void ps2_dmac_device::transfer_sif0()
const uint32_t hi = m_sif->fifo_pop(0);
const uint32_t lo = m_sif->fifo_pop(0);
const uint32_t tag = hi;
- logerror("%s: SIF0 chaining tag, tag %08x %08x\n", machine().describe_context(), hi, lo);
+ //logerror("%s: SIF0 chaining tag, tag %08x %08x\n", machine().describe_context(), hi, lo);
channel.set_addr(lo);
channel.set_tag_addr(channel.tag_addr() + 0x10);
channel.set_quadword_count(tag & 0x0000ffff);
@@ -280,12 +283,12 @@ void ps2_dmac_device::transfer_sif1()
}
else if (channel.end_tag())
{
- logerror("%s: DMAC SIF1 end tag\n", machine().describe_context());
+ //logerror("%s: DMAC SIF1 end tag\n", machine().describe_context());
transfer_finish(SIF1);
}
else
{
- logerror("%s: DMAC SIF1 following source tag\n", machine().describe_context());
+ //logerror("%s: DMAC SIF1 following source tag\n", machine().describe_context());
follow_source_tag(SIF1);
}
}
@@ -301,7 +304,8 @@ void ps2_dmac_device::follow_source_tag(uint32_t chan)
const uint64_t lo = space.read_dword(tag_addr + 8);
const uint32_t tag = (uint32_t)hi;
const uint32_t addr = (uint32_t)(hi >> 32) & ~0xf;
- logerror("Trying to follow tag: %08x|%08x %08x|%08x\n", (uint32_t)(hi >> 32), (uint32_t)hi, (uint32_t)(lo >> 32), (uint32_t)lo);
+ if (chan != GIF && chan != VIF1)
+ logerror("Trying to follow tag: %08x|%08x %08x|%08x\n", (uint32_t)(hi >> 32), (uint32_t)hi, (uint32_t)(lo >> 32), (uint32_t)lo);
channel.set_chcr((channel.chcr() & 0x0000ffff) | (tag & 0xffff0000));
channel.set_quadword_count(tag & 0x0000ffff);
@@ -338,6 +342,7 @@ void ps2_dmac_device::follow_source_tag(uint32_t chan)
logerror("%s: Unknown DMAtag ID: %d\n", machine().describe_context(), id);
break;
}
+
if (irq && channel.irq_enable())
{
channel.set_end_tag(true);
@@ -521,15 +526,15 @@ READ32_MEMBER(ps2_dmac_device::channel_r)
break;
case 0xc000/8: /* SIF0_CHCR */
ret = m_channels[SIF0].chcr();
- logerror("%s: dmac_channel_r: SIF0_CHCR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
+ //logerror("%s: dmac_channel_r: SIF0_CHCR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
break;
case 0xc010/8: /* SIF0_MADR */
ret = m_channels[SIF0].addr();
- logerror("%s: dmac_channel_r: SIF0_MADR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
+ //logerror("%s: dmac_channel_r: SIF0_MADR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
break;
case 0xc020/8: /* SIF0_QWC */
ret = m_channels[SIF0].quadword_count();
- logerror("%s: dmac_channel_r: SIF0_QWC (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
+ //logerror("%s: dmac_channel_r: SIF0_QWC (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
break;
case 0xc400/8: /* SIF1_CHCR */
ret = m_channels[SIF1].chcr();
@@ -537,11 +542,11 @@ READ32_MEMBER(ps2_dmac_device::channel_r)
break;
case 0xc410/8: /* SIF1_MADR */
ret = m_channels[SIF1].addr();
- logerror("%s: dmac_channel_r: SIF1_MADR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
+ //logerror("%s: dmac_channel_r: SIF1_MADR (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
break;
case 0xc420/8: /* SIF1_QWC */
ret = m_channels[SIF1].quadword_count();
- logerror("%s: dmac_channel_r: SIF1_QWC (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
+ //logerror("%s: dmac_channel_r: SIF1_QWC (%08x & %08x)\n", machine().describe_context(), ret, mem_mask);
break;
case 0xc430/8: /* SIF1_TADR */
ret = m_channels[SIF1].tag_addr();
@@ -682,33 +687,33 @@ WRITE32_MEMBER(ps2_dmac_device::channel_w)
logerror("%s: dmac_channel_w: D4_TADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
break;
case 0xc000/8: /* SIF0_CHCR */
- logerror("%s: dmac_channel_w: SIF0_CHCR = %08x & %08x (DIR=%s Memory, MOD=%s, ASP=%d, TTE=%s DMAtag, \n", machine().describe_context(), data, mem_mask, BIT(data, 0) ? "From" : "To", mode_strings[(data >> 2) & 3], (data >> 4) & 3, BIT(data, 6) ? "Transfers" : "Does not transfer");
- logerror("%s: TIE=%d, START=%d, TAG=%04x\n", machine().describe_context(), BIT(data, 7), BIT(data, 8), data >> 16);
+ //logerror("%s: dmac_channel_w: SIF0_CHCR = %08x & %08x (DIR=%s Memory, MOD=%s, ASP=%d, TTE=%s DMAtag, \n", machine().describe_context(), data, mem_mask, BIT(data, 0) ? "From" : "To", mode_strings[(data >> 2) & 3], (data >> 4) & 3, BIT(data, 6) ? "Transfers" : "Does not transfer");
+ //logerror("%s: TIE=%d, START=%d, TAG=%04x\n", machine().describe_context(), BIT(data, 7), BIT(data, 8), data >> 16);
m_channels[SIF0].set_chcr(data);
break;
case 0xc010/8: /* SIF0_MADR */
- logerror("%s: dmac_channel_w: SIF0_MADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: dmac_channel_w: SIF0_MADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_channels[SIF0].set_addr(data);
break;
case 0xc020/8: /* SIF0_QWC */
- logerror("%s: dmac_channel_w: SIF0_QWC = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: dmac_channel_w: SIF0_QWC = %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_channels[SIF0].set_quadword_count(data);
break;
case 0xc400/8: /* D6_CHCR */
- logerror("%s: dmac_channel_w: SIF1_CHCR = %08x & %08x (DIR=%s Memory, MOD=%s, ASP=%d, TTE=%s DMAtag, \n", machine().describe_context(), data, mem_mask, BIT(data, 0) ? "From" : "To", mode_strings[(data >> 2) & 3], (data >> 4) & 3, BIT(data, 6) ? "Transfers" : "Does not transfer");
- logerror("%s: TIE=%d, START=%d, TAG=%04x\n", machine().describe_context(), BIT(data, 7), BIT(data, 8), data >> 16);
+ //logerror("%s: dmac_channel_w: SIF1_CHCR = %08x & %08x (DIR=%s Memory, MOD=%s, ASP=%d, TTE=%s DMAtag, \n", machine().describe_context(), data, mem_mask, BIT(data, 0) ? "From" : "To", mode_strings[(data >> 2) & 3], (data >> 4) & 3, BIT(data, 6) ? "Transfers" : "Does not transfer");
+ //logerror("%s: TIE=%d, START=%d, TAG=%04x\n", machine().describe_context(), BIT(data, 7), BIT(data, 8), data >> 16);
m_channels[SIF1].set_chcr(data);
break;
case 0xc410/8: /* D6_MADR */
- logerror("%s: dmac_channel_w: SIF1_MADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: dmac_channel_w: SIF1_MADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_channels[SIF1].set_addr(data);
break;
case 0xc420/8: /* D6_QWC */
- logerror("%s: dmac_channel_w: SIF1_QWC = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: dmac_channel_w: SIF1_QWC = %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_channels[SIF1].set_quadword_count(data);
break;
case 0xc430/8: /* D6_TADR */
- logerror("%s: dmac_channel_w: SIF1_TADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: dmac_channel_w: SIF1_TADR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_channels[SIF1].set_tag_addr(data);
break;
case 0xc800/8: /* D7_CHCR */