summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2010-04-30 17:00:12 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2010-04-30 17:00:12 +0000
commit14cd363caf716d3bb379b5da12b1b1afe28d5768 (patch)
tree67824d2b8a60a9768d796eb7a81acd1a2e018529
parent315559a40603a0c11463e9f3cc0c3af56aa945b7 (diff)
Improved CH-2 DMA behaviour
-rw-r--r--src/mame/machine/dc.c86
1 files changed, 47 insertions, 39 deletions
diff --git a/src/mame/machine/dc.c b/src/mame/machine/dc.c
index 714806d19c4..3dc41875c57 100644
--- a/src/mame/machine/dc.c
+++ b/src/mame/machine/dc.c
@@ -215,6 +215,13 @@ static TIMER_CALLBACK( maple_dma_irq )
dc_update_interrupt_status(machine);
}
+static TIMER_CALLBACK( ch2_dma_irq )
+{
+ dc_sysctrl_regs[SB_C2DLEN]=0;
+ dc_sysctrl_regs[SB_C2DST]=0;
+ dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_CH2;
+}
+
static void wave_dma_execute(const address_space *space)
{
UINT32 src,dst,size;
@@ -633,48 +640,49 @@ WRITE64_HANDLER( dc_sysctrl_w )
switch (reg)
{
case SB_C2DST:
- address=dc_sysctrl_regs[SB_C2DSTAT];
- ddtdata.destination=address;
- /* 0 rounding size = 16 Mbytes */
- if(dc_sysctrl_regs[SB_C2DLEN] == 0)
- ddtdata.length = 0x1000000;
- else
- ddtdata.length = dc_sysctrl_regs[SB_C2DLEN];
- ddtdata.size=1;
- ddtdata.direction=0;
- ddtdata.channel=2;
- ddtdata.mode=25; //011001
- sh4_dma_ddt(devtag_get_device(space->machine, "maincpu"),&ddtdata);
- #if DEBUG_SYSCTRL
- if ((address >= 0x11000000) && (address <= 0x11FFFFFF))
- if (dc_sysctrl_regs[SB_LMMODE0])
- printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1
+ if(((old & 1) == 0) && (dat & 1)) // 0 -> 1
+ {
+ address=(dc_sysctrl_regs[SB_C2DSTAT] & 0x03ffffe0) | 0x10000000;
+ if(dc_sysctrl_regs[SB_C2DSTAT] & 0x1f)
+ printf("C2DSTAT just used to reserved bits %02x\n",dc_sysctrl_regs[SB_C2DSTAT] & 0x1f);
+
+ ddtdata.destination=address;
+ /* 0 rounding size = 16 Mbytes */
+ if(dc_sysctrl_regs[SB_C2DLEN] == 0)
+ ddtdata.length = 0x1000000;
else
- mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0
- else if ((address >= 0x13000000) && (address <= 0x13FFFFFF))
- if (dc_sysctrl_regs[SB_LMMODE1])
- printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1
+ ddtdata.length = dc_sysctrl_regs[SB_C2DLEN];
+ ddtdata.size=1;
+ ddtdata.direction=0;
+ ddtdata.channel=2;
+ ddtdata.mode=25; //011001
+ sh4_dma_ddt(devtag_get_device(space->machine, "maincpu"),&ddtdata);
+ #if DEBUG_SYSCTRL
+ if ((address >= 0x11000000) && (address <= 0x11FFFFFF))
+ if (dc_sysctrl_regs[SB_LMMODE0])
+ printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1
+ else
+ mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0
+ else if ((address >= 0x13000000) && (address <= 0x13FFFFFF))
+ if (dc_sysctrl_regs[SB_LMMODE1])
+ printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1
+ else
+ mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0
+ else if ((address >= 0x10800000) && (address <= 0x10ffffff))
+ mame_printf_verbose("SYSCTRL: Ch2 YUV dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
+ else if ((address >= 0x10000000) && (address <= 0x107fffff))
+ mame_printf_verbose("SYSCTRL: Ch2 TA Display List dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
else
- mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0
- else if ((address >= 0x10800000) && (address <= 0x10ffffff))
- mame_printf_verbose("SYSCTRL: Ch2 YUV dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
- else if ((address >= 0x10000000) && (address <= 0x107fffff))
- mame_printf_verbose("SYSCTRL: Ch2 TA Display List dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
- else
- mame_printf_verbose("SYSCTRL: Ch2 unknown dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
- #endif
- if ((address >= 0x10000000) && (address <= 0x10ffffff))
- {
- dc_sysctrl_regs[SB_C2DSTAT]=address;
- }
- else
- {
- dc_sysctrl_regs[SB_C2DSTAT]=address+ddtdata.length;
- }
+ mame_printf_verbose("SYSCTRL: Ch2 unknown dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]);
+ #endif
- dc_sysctrl_regs[SB_C2DLEN]=0;
- dc_sysctrl_regs[SB_C2DST]=0;
- dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_CH2;
+ if ((!(address & 0x01000000)))
+ dc_sysctrl_regs[SB_C2DSTAT]=address;
+ else //direct texture path
+ dc_sysctrl_regs[SB_C2DSTAT]=address+ddtdata.length;
+
+ timer_set(space->machine, ATTOTIME_IN_USEC(200), NULL, 0, ch2_dma_irq);
+ }
break;
case SB_ISTNRM: