X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfsound%2Fdma.c;h=eb85a7316d31b8eb55c0e3b272aa4e32c263a5f3;hb=4b22d9501e7de7b7991e5cf3163e4b48806a0913;hp=8d647ff34664181b8875cca1fed92aa2a9671deb;hpb=63a4f6b6a3b0315590cd3009df2c92480ed2d98b;p=pcsx_rearmed.git diff --git a/plugins/dfsound/dma.c b/plugins/dfsound/dma.c index 8d647ff3..eb85a731 100644 --- a/plugins/dfsound/dma.c +++ b/plugins/dfsound/dma.c @@ -20,6 +20,7 @@ #define _IN_DMA #include "externals.h" +#include "registers.h" //////////////////////////////////////////////////////////////////////// // READ DMA (one value) @@ -27,9 +28,10 @@ unsigned short CALLBACK SPUreadDMA(void) { - unsigned short s=spu.spuMem[spu.spuAddr>>1]; - spu.spuAddr+=2; - if(spu.spuAddr>0x7ffff) spu.spuAddr=0; + unsigned short s = *(unsigned short *)(spu.spuMemC + spu.spuAddr); + check_irq_io(spu.spuAddr); + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; return s; } @@ -41,36 +43,39 @@ unsigned short CALLBACK SPUreadDMA(void) void CALLBACK SPUreadDMAMem(unsigned short *pusPSXMem, int iSize, unsigned int cycles) { - int i; + unsigned int addr = spu.spuAddr, irq_addr = regAreaGet(H_SPUirqAddr) << 3; + int i, irq; do_samples_if_needed(cycles, 1); - - for(i=0;i>1]; // spu addr got by writeregister - spu.spuAddr+=2; // inc spu addr - if(spu.spuAddr>0x7ffff) spu.spuAddr=0; // wrap - } + irq = addr <= irq_addr && irq_addr < addr + iSize*2; + + for(i = 0; i < iSize; i++) + { + *pusPSXMem++ = *(unsigned short *)(spu.spuMemC + addr); + addr += 2; + addr &= 0x7fffe; + } + if (irq && (spu.spuCtrl & CTRL_IRQ)) + log_unhandled("rdma spu irq: %x/%x+%x\n", irq_addr, spu.spuAddr, iSize * 2); + spu.spuAddr = addr; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// -// to investigate: do sound data updates by writedma affect spu -// irqs? Will an irq be triggered, if new data is written to -// the memory irq address? - //////////////////////////////////////////////////////////////////////// // WRITE DMA (one value) //////////////////////////////////////////////////////////////////////// void CALLBACK SPUwriteDMA(unsigned short val) { - spu.spuMem[spu.spuAddr>>1] = val; // spu addr got by writeregister + *(unsigned short *)(spu.spuMemC + spu.spuAddr) = val; - spu.spuAddr+=2; // inc spu addr - if(spu.spuAddr>0x7ffff) spu.spuAddr=0; // wrap + check_irq_io(spu.spuAddr); + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; + spu.bMemDirty = 1; } //////////////////////////////////////////////////////////////////////// @@ -80,23 +85,31 @@ void CALLBACK SPUwriteDMA(unsigned short val) void CALLBACK SPUwriteDMAMem(unsigned short *pusPSXMem, int iSize, unsigned int cycles) { - int i; + unsigned int addr = spu.spuAddr, irq_addr = regAreaGet(H_SPUirqAddr) << 3; + int i, irq; do_samples_if_needed(cycles, 1); - - if(spu.spuAddr + iSize*2 < 0x80000) - { - memcpy(&spu.spuMem[spu.spuAddr>>1], pusPSXMem, iSize*2); - spu.spuAddr += iSize*2; - return; - } - - for(i=0;i>1] = *pusPSXMem++; // spu addr got by writeregister - spu.spuAddr+=2; // inc spu addr - spu.spuAddr&=0x7ffff; // wrap + *(unsigned short *)(spu.spuMemC + addr) = *pusPSXMem++; + addr += 2; + addr &= 0x7fffe; } + } + if (irq && (spu.spuCtrl & CTRL_IRQ)) // unhandled because need to implement delay + log_unhandled("wdma spu irq: %x/%x+%x\n", irq_addr, spu.spuAddr, iSize * 2); + spu.spuAddr = addr; } ////////////////////////////////////////////////////////////////////////