- RemoveTimer(); // we stop processing while doing the save!\r
-\r
- memcpy(spuMem,pF->cSPURam,0x80000); // get ram\r
- memcpy(regArea,pF->cSPUPort,0x200);\r
-\r
- if(pF->xaS.nsamples<=4032) // start xa again\r
- SPUplayADPCMchannel(&pF->xaS);\r
-\r
- xapGlobal=0;\r
- dwPendingChanOff=0;\r
-\r
- if(!strcmp(pF->szSPUName,"PBOSS") && pF->ulFreezeVersion==5)\r
- LoadStateV5(pF);\r
- else LoadStateUnknown(pF);\r
-\r
- lastch = -1;\r
+ memcpy(spu.spuMem,pF->cSPURam,0x80000); // get ram\r
+ memcpy(spu.regArea,pF->cSPUPort,0x200);\r
+ spu.bMemDirty = 1;\r
+ spu.spuCtrl = regAreaGet(H_SPUctrl);\r
+ spu.spuStat = regAreaGet(H_SPUstat);\r
+\r
+ if (!strcmp(pF->szSPUName,"PBOSS") && pF->ulFreezeVersion==5)\r
+ pFO = LoadStateV5(pF, cycles);\r
+ else LoadStateUnknown(pF, cycles);\r
+\r
+ spu.XAPlay = spu.XAFeed = spu.XAStart;\r
+ spu.CDDAPlay = spu.CDDAFeed = spu.CDDAStart;\r
+ if (pFO && pFO->xa_left && pF->xaS.nsamples) { // start xa again\r
+ FeedXA(&pF->xaS);\r
+ spu.XAPlay = spu.XAFeed - pFO->xa_left;\r
+ if (spu.XAPlay < spu.XAStart)\r
+ spu.XAPlay = spu.XAStart;\r
+ }\r
+ else if (pFO && pFO->cdda_left) { // start cdda again\r
+ FeedCDDA((void *)pF->xaS.pcm, pFO->cdda_left * 4);\r
+ }\r
+\r
+ // not in old savestates\r
+ spu.cycles_dma_end = 0;\r
+ spu.decode_dirty_ch = spu.dwChannelsAudible & 0x0a;\r
+ spu.dwNoiseVal = 0;\r
+ spu.dwNoiseCount = 0;\r
+ spu.XARepeat = 0;\r
+ spu.XALastVal = 0;\r
+ spu.last_keyon_cycles = cycles - 16*786u;\r
+ if (pFO && pF->ulFreezeSize >= sizeof(*pF) + sizeof(*pFO)) {\r
+ spu.cycles_dma_end = pFO->cycles_dma_end;\r
+ spu.decode_dirty_ch = pFO->decode_dirty_ch;\r
+ spu.dwNoiseVal = pFO->dwNoiseVal;\r
+ spu.dwNoiseCount = pFO->dwNoiseCount;\r
+ spu.XARepeat = pFO->XARepeat;\r
+ spu.XALastVal = pFO->XALastVal;\r
+ spu.last_keyon_cycles = pFO->last_keyon_cycles;\r
+ }\r