X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfsound%2Fdma.c;h=533d95e90a572d3d026b95c1a3cb7a51f9b1b3f8;hb=20a3a441bc4176d91cd4d41f8dedf12a9f448abb;hp=f92d06662422ae97e0a9eedff9f8e2af57d547df;hpb=ef79bbde537d6b9c745a7d86cb9df1d04c35590d;p=pcsx_rearmed.git diff --git a/plugins/dfsound/dma.c b/plugins/dfsound/dma.c index f92d0666..533d95e9 100644 --- a/plugins/dfsound/dma.c +++ b/plugins/dfsound/dma.c @@ -20,78 +20,64 @@ #define _IN_DMA #include "externals.h" - -//////////////////////////////////////////////////////////////////////// -// READ DMA (one value) -//////////////////////////////////////////////////////////////////////// - -unsigned short CALLBACK SPUreadDMA(void) -{ - unsigned short s=spuMem[spuAddr>>1]; - spuAddr+=2; - if(spuAddr>0x7ffff) spuAddr=0; - - iSpuAsyncWait=0; - - return s; -} +#include "registers.h" //////////////////////////////////////////////////////////////////////// // 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; - - for(i=0;i>1]; // spu addr got by writeregister - spuAddr+=2; // inc spu addr - if(spuAddr>0x7ffff) spuAddr=0; // wrap - } - - iSpuAsyncWait=0; -} - -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// - -// 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) -{ - spuMem[spuAddr>>1] = val; // spu addr got by writeregister - - spuAddr+=2; // inc spu addr - if(spuAddr>0x7ffff) spuAddr=0; // wrap - - iSpuAsyncWait=0; + unsigned int addr = spu.spuAddr, irq_addr = regAreaGet(H_SPUirqAddr) << 3; + int i, irq; + + do_samples_if_needed(cycles, 1); + 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; } //////////////////////////////////////////////////////////////////////// // 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; - - 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 + addr) = *pusPSXMem++; + addr += 2; + addr &= 0x7fffe; } - - iSpuAsyncWait=0; + } + 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; } ////////////////////////////////////////////////////////////////////////