diff options
author | notaz | 2014-12-21 00:36:00 +0200 |
---|---|---|
committer | notaz | 2014-12-21 02:31:24 +0200 |
commit | c4c66b22ae607aa8dc5e6983f7ab030ead01faae (patch) | |
tree | a3938743f6ea29be8acb15eb1d3e203b69e9e483 /plugins/dfsound | |
parent | fb01e82a3453b4b068fde274a42df336e778d8d3 (diff) | |
download | pcsx_rearmed-c4c66b22ae607aa8dc5e6983f7ab030ead01faae.tar.gz pcsx_rearmed-c4c66b22ae607aa8dc5e6983f7ab030ead01faae.tar.bz2 pcsx_rearmed-c4c66b22ae607aa8dc5e6983f7ab030ead01faae.zip |
spu: avoid NULL pSpuIrq
CTR sets 0 irq address, and savestates mess up
Diffstat (limited to 'plugins/dfsound')
-rw-r--r-- | plugins/dfsound/freeze.c | 7 | ||||
-rw-r--r-- | plugins/dfsound/spu.c | 4 |
2 files changed, 7 insertions, 4 deletions
diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index b865b84..d38faa6 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -307,6 +307,9 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF, ClearWorkingState();
spu.cycles_played = cycles;
+ if (spu.spuCtrl & CTRL_IRQ)
+ schedule_next_irq();
+
return 1;
}
@@ -318,7 +321,7 @@ void LoadStateV5(SPUFreeze_t * pF) pFO=(SPUOSSFreeze_t *)(pF+1);
- if(pFO->pSpuIrq) spu.pSpuIrq = spu.spuMemC+((long)pFO->pSpuIrq&0x7fff0); else spu.pSpuIrq=NULL;
+ spu.pSpuIrq = spu.spuMemC + ((spu.regArea[(H_SPUirqAddr - 0x0c00) / 2] << 3) & ~0xf);
if(pFO->spuAddr)
{
@@ -353,7 +356,7 @@ void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles) spu.dwNewChannel=0;
spu.dwChannelOn=0;
spu.dwChannelDead=0;
- spu.pSpuIrq=0;
+ spu.pSpuIrq=spu.spuMemC;
for(i=0;i<0xc0;i++)
{
diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index ca362b7..2c13ca1 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -738,7 +738,7 @@ void do_samples(unsigned int cycles_to) // an IRQ. if (unlikely((spu.spuCtrl & CTRL_IRQ) - && spu.pSpuIrq && spu.pSpuIrq < spu.spuMemC+0x1000)) + && spu.pSpuIrq < spu.spuMemC+0x1000)) { int irq_pos = (spu.pSpuIrq - spu.spuMemC) / 2 & 0x1ff; int left = (irq_pos - spu.decode_pos) & 0x1ff; @@ -1027,7 +1027,7 @@ long CALLBACK SPUinit(void) spu.spuAddr = 0xffffffff; spu.decode_pos = 0; memset((void *)s_chan, 0, sizeof(s_chan)); - spu.pSpuIrq = 0; + spu.pSpuIrq = spu.spuMemC; SetupStreams(); // prepare streaming |