void dc_state::g2_dma_execute(address_space &space, int channel) { UINT32 src,dst,size; dst = m_g2_dma[channel].g2_addr; src = m_g2_dma[channel].root_addr; size = 0; /* 0 rounding size = 32 Mbytes */ if (m_g2_dma[channel].size == 0) { m_g2_dma[channel].size = 0x200000; } if (m_g2_dma[channel].dir == 0) { for (; size<m_g2_dma[channel].size; size += 4) { space.write_dword(dst,space.read_dword(src)); src+=4; dst+=4; } } else { for (; size<m_g2_dma[channel].size; size += 4) { space.write_dword(src,space.read_dword(dst)); src+=4; dst+=4; } } /* update the params*/ m_g2_dma[channel].g2_addr = g2bus_regs[SB_ADSTAG + (channel * 8)] = dst; m_g2_dma[channel].root_addr = g2bus_regs[SB_ADSTAR + (channel * 8)] = src; m_g2_dma[channel].size = g2bus_regs[SB_ADLEN + (channel * 8)] = 0; m_g2_dma[channel].flag = (m_g2_dma[channel].indirect & 1) ? 1 : 0; /* Note: if you trigger an instant DMA IRQ trigger, sfz3upper doesn't play any bgm. */ /* TODO: timing of this */ machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(m_g2_dma[channel].size / 4), timer_expired_delegate(FUNC(dc_state::g2_dma_irq), this), channel); }