X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fspu.c;h=228267da54a82e718536b51527615ff0cf5f9116;hp=f9c13d4b3cef7de1d627a912c755c81a6c553324;hb=90f1d26c2e771993c1a563f4c0ea81432bd9fc5e;hpb=3fc2a4c27be8c8cd5f8cf53a0d56c263275b8501 diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index f9c13d4b..228267da 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -656,6 +656,53 @@ ENDX: ; } } + // advance "stopped" channels that can cause irqs + // (all chans are always playing on the real thing..) + if(!bIRQReturn && (spuCtrl&CTRL_IRQ)) + for(ch=0;ch pSpuIrq && s_chan[ch].pLoop > pSpuIrq) + continue; + + if(s_chan[ch].iActFreq!=s_chan[ch].iUsedFreq) // new psx frequency? + VoiceChangeFrequency(ch); + + s_chan[ch].spos += s_chan[ch].sinc * NSSIZE; + while(s_chan[ch].spos >= 28 * 0x10000) + { + unsigned char *start=s_chan[ch].pCurr; + int flags = start[1]; + + // Tron Bonne hack, probably wrong (could be wrong memory contents..) + if(flags & ~7) flags = 0; + + if(start == pSpuIrq) + { + do_irq(); + bIRQReturn = 1; + } + else if((flags & 1) && start == s_chan[ch].pLoop) + { + // looping on self + s_chan[ch].pCurr=(unsigned char *)-1; + break; + } + + if((flags&4) && !s_chan[ch].bIgnoreLoop) + s_chan[ch].pLoop=start; + + s_chan[ch].pCurr += 16; + + if(flags & 1) + s_chan[ch].pCurr = s_chan[ch].pLoop; + + s_chan[ch].spos -= 28 * 0x10000; + } + } + if(bIRQReturn && iSPUIRQWait) // special return for "spu irq - wait for cpu action" { iSpuAsyncWait=1; @@ -1028,4 +1075,24 @@ char * SPUgetLibInfos(void) } */ +// debug +void spu_get_debug_info(int *chans_out, int *fmod_chans_out, int *noise_chans_out) +{ + int ch = 0, fmod_chans = 0, noise_chans = 0; + + for(;ch