diff options
Diffstat (limited to 'src/mame/machine/ps2dma.cpp')
-rw-r--r-- | src/mame/machine/ps2dma.cpp | 67 |
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 */ |