Improved CH-2 DMA behaviour

This commit is contained in:
Angelo Salese 2010-04-30 17:00:12 +00:00
parent 315559a406
commit 14cd363caf

View File

@ -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,7 +640,12 @@ WRITE64_HANDLER( dc_sysctrl_w )
switch (reg)
{
case SB_C2DST:
address=dc_sysctrl_regs[SB_C2DSTAT];
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)
@ -663,18 +675,14 @@ WRITE64_HANDLER( dc_sysctrl_w )
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;
}
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: