static void __fastcall _ext_memWrite16(u32 mem, mem16_t value) { switch (p) { case 5: // ba0 MEM_LOG("ba00000 Memory write16 to address %x with data %x", mem, value); return; case 6: // gsm gsWrite16(mem, value); return; case 7: // dev9 DEV9write16(mem & ~0xa4000000, value); Console.WriteLn("DEV9 write16 %8.8lx: %4.4lx", mem & ~0xa4000000, value); return; case 8: // spu2 SPU2write(mem, value); return; } MEM_LOG("Unknown Memory write16 to address %x with data %4.4x", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
void __fastcall _ext_memWrite16(u32 mem, u16 value) { switch (p) { case 1: // hwm hwWrite16(mem, value); return; case 2: // psh psxHwWrite16(mem, value); return; case 5: // ba0 MEM_LOG("ba00000 Memory write16 to address %x with data %x\n", mem, value); return; case 6: // gsm gsWrite16(mem, value); return; case 7: // dev9 DEV9write16(mem & ~0xa4000000, value); SysPrintf("DEV9 write16 %8.8lx: %4.4lx\n", mem & ~0xa4000000, value); return; case 8: // spu2 SPU2write(mem, value); return; } MEM_LOG("Unknown Memory write16 to address %x with data %4.4x\n", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
static void __fastcall _spu2_write16( u32 addr, mem16_t val ) { SPU2write( addr, val ); }
EXPORT_GCC long CALLBACK SPU2freeze(unsigned long ulFreezeMode,SPUFreeze_t * pFt) { int i;SPUOSSFreeze_t * pFO;SPUFreeze_Ex_t * pF; if(!pFt) return 0; // first check if(ulFreezeMode) // save? {//--------------------------------------------------// pFt->size=sizeof(SPUFreeze_Ex_t)+sizeof(SPUOSSFreeze_t); if(ulFreezeMode==2) return 0; // emu just asking for size? bye if(!pFt->data) return 0; pF=(SPUFreeze_Ex_t *)pFt->data; memset(pF,0,pFt->size); strcpy(pF->szSPUName,"PBOSS2"); pF->ulFreezeVersion=1; pF->ulFreezeSize=pFt->size; // save mode: RemoveTimer(); // stop timer memcpy(pF->cSPURam,spuMem,2*1024*1024); // copy common infos memcpy(pF->cSPUPort,regArea,64*1024); pFO=(SPUOSSFreeze_t *)(pF+1); // store special stuff pFO->spuIrq0=spuIrq2[0]; if(pSpuIrq[0]) pFO->pSpuIrq0 = (unsigned long)pSpuIrq[0]-(unsigned long)spuMemC; pFO->spuIrq1=spuIrq2[1]; if(pSpuIrq[1]) pFO->pSpuIrq1 = (unsigned long)pSpuIrq[1]-(unsigned long)spuMemC; for(i=0;i<MAXCHAN;i++) { memcpy((void *)&pFO->s_chan[i],(void *)&s_chan[i],sizeof(SPUCHAN)); if(pFO->s_chan[i].pStart) pFO->s_chan[i].pStart-=(unsigned long)spuMemC; if(pFO->s_chan[i].pCurr) pFO->s_chan[i].pCurr-=(unsigned long)spuMemC; if(pFO->s_chan[i].pLoop) pFO->s_chan[i].pLoop-=(unsigned long)spuMemC; } SetupTimer(); // sound processing on again return 1; //--------------------------------------------------// } // load state: #ifdef _WINDOWS if(iDebugMode==1 && IsWindow(hWDebug)) // we have to disbale the debug window, if active DestroyWindow(hWDebug); hWDebug=0; if(IsBadReadPtr(pFt,sizeof(SPUFreeze_t))) // check bad emu stuff return 0; #endif if(pFt->size!=sizeof(SPUFreeze_Ex_t)+ // not our stuff? bye sizeof(SPUOSSFreeze_t)) return 0; if(!pFt->data) return 0; pF=(SPUFreeze_Ex_t *)pFt->data; RemoveTimer(); // we stop processing while doing the save! memcpy(spuMem,pF->cSPURam,2*1024*1024); // get ram memcpy(regArea,pF->cSPUPort,64*1024); if(!strcmp(pF->szSPUName,"PBOSS2") && pF->ulFreezeVersion==1) LoadStateV1(pF); else LoadStateUnknown(pF); // repair some globals for(i=0x7FFE;i>=0x0000;i-=2) { SPU2write(i,regArea[i]); } // fix to prevent new interpolations from crashing for(i=0;i<MAXCHAN;i++) s_chan[i].SB[28]=0; SetupTimer(); // start sound processing again #ifdef _WINDOWS if(iDebugMode) // re-activate windows debug dialog { hWDebug=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUG), NULL,(DLGPROC)DebugDlgProc); SetWindowPos(hWDebug,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOACTIVATE); UpdateWindow(hWDebug); SetFocus(hWMain); } #endif return 1; }
EXPORT_C_(void) s2r_replay(HWND hwnd, HINSTANCE hinst, LPSTR filename, int nCmdShow) { #ifndef ENABLE_NEW_IOPDMA_SPU2 int events=0; Running = true; #ifdef WIN32 AllocConsole(); SetConsoleCtrlHandler(HandlerRoutine, TRUE); conprintf("Playing %s file on %x...",filename,hwnd); #endif // load file FILE *file=fopen(filename,"rb"); if(!file) { conprintf("Could not open the replay file."); return; } // if successful, init the plugin #define TryRead(dest,size,count,file) if(fread(dest,size,count,file)<count) { conprintf("Error reading from file."); goto Finish; /* Need to exit the while() loop and maybe also the switch */ } TryRead(&CurrentIOPCycle,4,1,file); replay_mode=true; InitWaitSync(); // Initialize the WaitSync stuff SPU2init(); SPU2irqCallback(dummy1,dummy4,dummy7); SPU2setClockPtr(&CurrentIOPCycle); SPU2open(&hwnd); CurrentIOPCycle=0; SPU2async(0); while(!feof(file) && Running) { u32 ccycle=0; u32 evid=0; u32 sval=0; u32 tval=0; TryRead(&ccycle,4,1,file); TryRead(&sval,4,1,file); evid=sval>>29; sval&=0x1FFFFFFF; u32 TargetCycle = ccycle * 768; while(TargetCycle > CurrentIOPCycle) { u32 delta = WaitSync(TargetCycle); SPU2async(delta); } switch(evid) { case 0: SPU2read(sval); break; case 1: TryRead(&tval,2,1,file); SPU2write(sval,tval); break; case 2: TryRead(dmabuffer,sval,2,file); SPU2writeDMA4Mem(dmabuffer,sval); break; case 3: TryRead(dmabuffer,sval,2,file); SPU2writeDMA7Mem(dmabuffer,sval); break; default: // not implemented return; break; } events++; } Finish: //shutdown SPU2close(); SPU2shutdown(); fclose(file); conprintf("Finished playing %s file (%d cycles, %d events).",filename,CurrentIOPCycle,events); #ifdef WIN32 FreeConsole(); #endif replay_mode=false; #endif }