X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fdma.c;h=43019f1d9fccc059bd0be630f50d224d527a9ab4;hp=f92d06662422ae97e0a9eedff9f8e2af57d547df;hb=1e0eac2348343c8a046f7a75d460f087556cf7f6;hpb=ef79bbde537d6b9c745a7d86cb9df1d04c35590d diff --git a/plugins/dfsound/dma.c b/plugins/dfsound/dma.c index f92d0666..43019f1d 100644 --- a/plugins/dfsound/dma.c +++ b/plugins/dfsound/dma.c @@ -27,11 +27,9 @@ unsigned short CALLBACK SPUreadDMA(void) { - unsigned short s=spuMem[spuAddr>>1]; - spuAddr+=2; - if(spuAddr>0x7ffff) spuAddr=0; - - iSpuAsyncWait=0; + unsigned short s = *(unsigned short *)(spu.spuMemC + spu.spuAddr); + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; return s; } @@ -40,18 +38,19 @@ unsigned short CALLBACK SPUreadDMA(void) // READ DMA (many values) //////////////////////////////////////////////////////////////////////// -void CALLBACK SPUreadDMAMem(unsigned short * pusPSXMem,int iSize) +void CALLBACK SPUreadDMAMem(unsigned short *pusPSXMem, int iSize, + unsigned int cycles) { int i; + do_samples_if_needed(cycles, 1); + for(i=0;i>1]; // spu addr got by writeregister - spuAddr+=2; // inc spu addr - if(spuAddr>0x7ffff) spuAddr=0; // wrap + *pusPSXMem++ = *(unsigned short *)(spu.spuMemC + spu.spuAddr); + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; } - - iSpuAsyncWait=0; } //////////////////////////////////////////////////////////////////////// @@ -68,30 +67,38 @@ void CALLBACK SPUreadDMAMem(unsigned short * pusPSXMem,int iSize) void CALLBACK SPUwriteDMA(unsigned short val) { - spuMem[spuAddr>>1] = val; // spu addr got by writeregister + *(unsigned short *)(spu.spuMemC + spu.spuAddr) = val; - spuAddr+=2; // inc spu addr - if(spuAddr>0x7ffff) spuAddr=0; // wrap - - iSpuAsyncWait=0; + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; + spu.bMemDirty = 1; } //////////////////////////////////////////////////////////////////////// // WRITE DMA (many values) //////////////////////////////////////////////////////////////////////// -void CALLBACK SPUwriteDMAMem(unsigned short * pusPSXMem,int iSize) +void CALLBACK SPUwriteDMAMem(unsigned short *pusPSXMem, int iSize, + unsigned int cycles) { int i; + + do_samples_if_needed(cycles, 1); + spu.bMemDirty = 1; + + if(spu.spuAddr + iSize*2 < 0x80000) + { + memcpy(spu.spuMemC + spu.spuAddr, pusPSXMem, iSize*2); + spu.spuAddr += iSize*2; + return; + } for(i=0;i>1] = *pusPSXMem++; // spu addr got by writeregister - spuAddr+=2; // inc spu addr - if(spuAddr>0x7ffff) spuAddr=0; // wrap + *(unsigned short *)(spu.spuMemC + spu.spuAddr) = *pusPSXMem++; + spu.spuAddr += 2; + spu.spuAddr &= 0x7fffe; } - - iSpuAsyncWait=0; } ////////////////////////////////////////////////////////////////////////