From 2cd1ef1c63712e0baf46a2f14952bc1f03767b5f Mon Sep 17 00:00:00 2001 From: zeromus Date: Fri, 12 Dec 2014 11:07:47 +0000 Subject: [PATCH] psx - savestates --- .../Consoles/Sony/PSX/Octoshock.cs | 9 +- output/dll/octoshock.dll | Bin 975872 -> 995328 bytes psx/octoshock/bizhawk/octoshock.vcxproj | 1 + .../bizhawk/octoshock.vcxproj.filters | 3 + psx/octoshock/cdrom/SimpleFIFO.cpp | 3 - psx/octoshock/cdrom/SimpleFIFO.h | 21 +- psx/octoshock/emuware/EW_state.cpp | 34 +++- psx/octoshock/emuware/EW_state.h | 8 +- psx/octoshock/psx/cdc.cpp | 168 +++++++--------- psx/octoshock/psx/cdc.h | 2 + psx/octoshock/psx/cpu.cpp | 37 +++- psx/octoshock/psx/cpu.h | 2 + psx/octoshock/psx/dma.cpp | 44 +---- psx/octoshock/psx/frontio.cpp | 67 ++++++- psx/octoshock/psx/frontio.h | 4 + psx/octoshock/psx/gpu.cpp | 150 +++++++------- psx/octoshock/psx/gpu.h | 2 + psx/octoshock/psx/gte.cpp | 91 ++++----- psx/octoshock/psx/input/dualshock.cpp | 60 +++--- psx/octoshock/psx/input/memcard.cpp | 34 +++- psx/octoshock/psx/irq.cpp | 13 ++ psx/octoshock/psx/mdec.cpp | 76 +++----- psx/octoshock/psx/psx.cpp | 183 ++++++++---------- psx/octoshock/psx/psx.h | 3 + psx/octoshock/psx/sio.cpp | 26 +-- psx/octoshock/psx/spu.cpp | 156 ++++----------- psx/octoshock/psx/spu.h | 2 + psx/octoshock/psx/timer.cpp | 31 +-- 28 files changed, 583 insertions(+), 647 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index 185f9e8e7b..64583b7319 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -21,7 +21,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX isPorted: true, isReleased: false )] - public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains, ISaveRam, IDriveLight + public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains, ISaveRam, IStatable, IDriveLight { public string SystemId { get { return "PSX"; } } @@ -213,7 +213,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX OctoshockDll.shock_Create(out psx, region, pFirmware); SetMemoryDomains(); - StudySaveBufferSize(); //these should track values in octoshock gpu.cpp FillVideoParams //if (discInfo.region == OctoshockDll.eRegion.EU) @@ -248,6 +247,10 @@ namespace BizHawk.Emulation.Cores.Sony.PSX OctoshockDll.shock_MountEXE(psx, pExeBuffer, exe.Length); } OctoshockDll.shock_Peripheral_Connect(psx, 0x01, OctoshockDll.ePeripheralType.DualShock); + + //do this after framebuffers and peripherals and whatever crap are setup. kind of lame, but thats how it is for now + StudySaveBufferSize(); + OctoshockDll.shock_PowerOn(psx); } @@ -503,7 +506,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX var transaction = new OctoshockDll.ShockStateTransaction() { transaction = OctoshockDll.eShockStateTransaction.TextLoad, - ff = s.GetFunctionPointersSave() + ff = s.GetFunctionPointersLoad() }; int result = OctoshockDll.shock_StateTransaction(psx, ref transaction); diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll index 20162735f318026f4534ad48f7ec3ebc72283e9b..85777f595340c09675d9b9cc5923e6364e66bd41 100644 GIT binary patch delta 128329 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 RW2d>^{{O-6F!X%%{{WgHWRL&= delta 108948 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 ksQq=w9*P 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 + diff --git a/psx/octoshock/bizhawk/octoshock.vcxproj.filters b/psx/octoshock/bizhawk/octoshock.vcxproj.filters index 61a5a98241..79b64800a8 100644 --- a/psx/octoshock/bizhawk/octoshock.vcxproj.filters +++ b/psx/octoshock/bizhawk/octoshock.vcxproj.filters @@ -226,6 +226,9 @@ emuware + + cdrom + diff --git a/psx/octoshock/cdrom/SimpleFIFO.cpp b/psx/octoshock/cdrom/SimpleFIFO.cpp index 5232837d15..f0a7f5fa14 100644 --- a/psx/octoshock/cdrom/SimpleFIFO.cpp +++ b/psx/octoshock/cdrom/SimpleFIFO.cpp @@ -1,6 +1,3 @@ #include "../mednafen.h" #include "SimpleFIFO.h" - - - diff --git a/psx/octoshock/cdrom/SimpleFIFO.h b/psx/octoshock/cdrom/SimpleFIFO.h index 5ec831d6b5..c705ec9bff 100644 --- a/psx/octoshock/cdrom/SimpleFIFO.h +++ b/psx/octoshock/cdrom/SimpleFIFO.h @@ -29,9 +29,10 @@ class SimpleFIFO INLINE void SaveStatePostLoad(void) { - read_pos %= data.size(); - write_pos %= data.size(); - in_count %= (data.size() + 1); + //I think this is crap about file format (buffer size) change recovery. screw it. + //read_pos %= data.size(); + //write_pos %= data.size(); + //in_count %= (data.size() + 1); } #if 0 @@ -134,6 +135,20 @@ class SimpleFIFO uint32 read_pos; // Read position uint32 write_pos; // Write position uint32 in_count; // Number of units in the FIFO + + template void SyncState(EW::NewState *ns) + { + //I dont like this class... + + PSS(&data[0], data.capacity()); + NSS(read_pos); + NSS(write_pos); + NSS(in_count); + + + SaveStatePostLoad(); + } + }; diff --git a/psx/octoshock/emuware/EW_state.cpp b/psx/octoshock/emuware/EW_state.cpp index e16a68392b..21912a1134 100644 --- a/psx/octoshock/emuware/EW_state.cpp +++ b/psx/octoshock/emuware/EW_state.cpp @@ -1,6 +1,8 @@ #include "EW_state.h" #include #include +#include +#include namespace EW { @@ -56,13 +58,37 @@ void NewStateExternalFunctions::Load(void *ptr, size_t size, const char *name) { Load_(ptr, size, name); } -void NewStateExternalFunctions::EnterSection(const char *name) + +void NewStateExternalFunctions::EnterSection(const char *name, ...) { - EnterSection_(name); + //analysis: multiple passes to generate string not ideal, but there arent many sections.. so it should be OK. improvement would be special vararg overload + va_list ap; + va_start(ap,name); + char easybuf[32]; + int size = vsnprintf(easybuf,0,name,ap); + char *ptr = easybuf; + if(size>31) + ptr = (char*)malloc(size+1); + vsprintf(ptr,name,ap); + EnterSection_(ptr); + if(ptr != easybuf) + free(ptr); + va_end(ap); } -void NewStateExternalFunctions::ExitSection(const char *name) +void NewStateExternalFunctions::ExitSection(const char *name, ...) { - ExitSection_(name); + va_list ap; + va_start(ap,name); + char easybuf[32]; + int size = vsnprintf(easybuf,0,name,ap); + char *ptr = easybuf; + if(size>31) + ptr = (char*)malloc(size+1); + vsprintf(ptr,name,ap); + ExitSection_(ptr); + if(ptr != easybuf) + free(ptr); + va_end(ap); } diff --git a/psx/octoshock/emuware/EW_state.h b/psx/octoshock/emuware/EW_state.h index dfae22a4ab..acd3c1396a 100644 --- a/psx/octoshock/emuware/EW_state.h +++ b/psx/octoshock/emuware/EW_state.h @@ -12,8 +12,8 @@ namespace EW public: virtual void Save(const void *ptr, size_t size, const char *name) = 0; virtual void Load(void *ptr, size_t size, const char *name) = 0; - virtual void EnterSection(const char *name) { } - virtual void ExitSection(const char *name) { } + virtual void EnterSection(const char *name, ...) { } + virtual void ExitSection(const char *name, ...) { } }; class NewStateDummy : public NewState @@ -62,8 +62,8 @@ namespace EW NewStateExternalFunctions(const FPtrs *ff); virtual void Save(const void *ptr, size_t size, const char *name); virtual void Load(void *ptr, size_t size, const char *name); - virtual void EnterSection(const char *name); - virtual void ExitSection(const char *name); + virtual void EnterSection(const char *name, ...); + virtual void ExitSection(const char *name, ...); }; // defines and explicitly instantiates diff --git a/psx/octoshock/psx/cdc.cpp b/psx/octoshock/psx/cdc.cpp index 6938182eeb..2b6f5800c8 100644 --- a/psx/octoshock/psx/cdc.cpp +++ b/psx/octoshock/psx/cdc.cpp @@ -215,99 +215,83 @@ void PS_CDC::Power(void) lastts = 0; } -int PS_CDC::StateAction(StateMem *sm, int load, int data_only) +SYNCFUNC(PS_CDC) { - SFORMAT StateRegs[] = - { - SFVAR(DiscChanged), - SFVAR(DiscStartupDelay), + NSS(DiscChanged); + NSS(DiscStartupDelay); - SFARRAY16(&AudioBuffer.Samples[0][0], sizeof(AudioBuffer.Samples) / sizeof(AudioBuffer.Samples[0][0])), - SFVAR(AudioBuffer.Size), - SFVAR(AudioBuffer.Freq), - SFVAR(AudioBuffer.ReadPos), + NSS(AudioBuffer); - SFARRAY(&Pending_DecodeVolume[0][0], 2 * 2), - SFARRAY(&DecodeVolume[0][0], 2 * 2), + NSS(Pending_DecodeVolume); + NSS(DecodeVolume); - SFARRAY16(&ADPCM_ResampBuf[0][0], sizeof(ADPCM_ResampBuf) / sizeof(ADPCM_ResampBuf[0][0])), - SFVAR(ADPCM_ResampCurPhase), - SFVAR(ADPCM_ResampCurPos), + NSS(ADPCM_ResampBuf); + NSS(ADPCM_ResampCurPhase); + NSS(ADPCM_ResampCurPos); + + NSS(RegSelector); + NSS(ArgsBuf); + NSS(ArgsWP); + NSS(ArgsRP); + + NSS(ArgsReceiveLatch); + NSS(ArgsReceiveBuf); + NSS(ArgsReceiveIn); + + NSS(ResultsBuffer); + NSS(ResultsIn); + NSS(ResultsWP); + NSS(ResultsRP); + + SSS(DMABuffer); + + NSS(SB); + NSS(SB_In); + + NSS(SectorPipe); + NSS(SectorPipe_Pos); + NSS(SectorPipe_In); + + NSS(SubQBuf); + NSS(SubQBuf_Safe); + + NSS(SubQChecksumOK); + + NSS(HeaderBufValid); + NSS(HeaderBuf); + + NSS(IRQBuffer); + NSS(IRQOutTestMask); + NSS(CDCReadyReceiveCounter); + NSS(FilterFile); + NSS(FilterChan); - SFVAR(RegSelector), - SFARRAY(ArgsBuf, 16), - SFVAR(ArgsWP), - SFVAR(ArgsRP), + NSS(PendingCommand); + NSS(PendingCommandPhase); + NSS(PendingCommandCounter); - SFVAR(ArgsReceiveLatch), - SFARRAY(ArgsReceiveBuf, 32), - SFVAR(ArgsReceiveIn), + NSS(SPUCounter); - SFARRAY(ResultsBuffer, 16), - SFVAR(ResultsIn), - SFVAR(ResultsWP), - SFVAR(ResultsRP), + NSS(Mode); + NSS(DriveStatus); + NSS(StatusAfterSeek); + NSS(Forward); + NSS(Backward); + NSS(Muted); - // - // - // - SFARRAY(&DMABuffer.data[0], DMABuffer.data.size()), - SFVAR(DMABuffer.read_pos), - SFVAR(DMABuffer.write_pos), - SFVAR(DMABuffer.in_count), - // - // - // + NSS(PlayTrackMatch); - SFARRAY(SB, sizeof(SB) / sizeof(SB[0])), - SFVAR(SB_In), + NSS(PSRCounter); - SFARRAY(&SectorPipe[0][0], sizeof(SectorPipe) / sizeof(SectorPipe[0][0])), - SFVAR(SectorPipe_Pos), - SFVAR(SectorPipe_In), + NSS(CurSector); - SFARRAY(SubQBuf, sizeof(SubQBuf) / sizeof(SubQBuf[0])), - SFARRAY(SubQBuf_Safe, sizeof(SubQBuf_Safe) / sizeof(SubQBuf_Safe[0])), + NSS(AsyncIRQPending); + NSS(AsyncResultsPending); + NSS(AsyncResultsPendingCount); - SFVAR(SubQChecksumOK), - - SFVAR(HeaderBufValid), - SFARRAY(HeaderBuf, sizeof(HeaderBuf) / sizeof(HeaderBuf[0])), - - SFVAR(IRQBuffer), - SFVAR(IRQOutTestMask), - SFVAR(CDCReadyReceiveCounter), - - - SFVAR(FilterFile), - SFVAR(FilterChan), - - SFVAR(PendingCommand), - SFVAR(PendingCommandPhase), - SFVAR(PendingCommandCounter), - - SFVAR(SPUCounter), - - SFVAR(Mode), - SFVAR(DriveStatus), - SFVAR(StatusAfterSeek), - SFVAR(Forward), - SFVAR(Backward), - SFVAR(Muted), - - SFVAR(PlayTrackMatch), - - SFVAR(PSRCounter), - - SFVAR(CurSector), - - SFVAR(AsyncIRQPending), - SFARRAY(AsyncResultsPending, sizeof(AsyncResultsPending) / sizeof(AsyncResultsPending[0])), - SFVAR(AsyncResultsPendingCount), - - SFVAR(SeekTarget), + NSS(SeekTarget); // FIXME: Save TOC stuff? #if 0 @@ -316,27 +300,17 @@ int PS_CDC::StateAction(StateMem *sm, int load, int data_only) uint8 DiscID[4]; #endif - SFVAR(CommandLoc), - SFVAR(CommandLoc_Dirty), - SFARRAY16(&xa_previous[0][0], sizeof(xa_previous) / sizeof(xa_previous[0][0])), + NSS(CommandLoc); + NSS(CommandLoc_Dirty); + NSS(xa_previous); - SFVAR(xa_cur_set), - SFVAR(xa_cur_file), - SFVAR(xa_cur_chan), + NSS(xa_cur_set); + NSS(xa_cur_file); + NSS(xa_cur_chan); - SFVAR(ReportLastF), + NSS(ReportLastF); - SFEND - }; - - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "CDC"); - - if(load) - { - DMABuffer.SaveStatePostLoad(); - SectorPipe_Pos %= SectorPipe_Count; - } - return(ret); + //(%= crap about file format recovery in case SectorPipe_Pos changes) } void PS_CDC::ResetTS(void) diff --git a/psx/octoshock/psx/cdc.h b/psx/octoshock/psx/cdc.h index f2925aef93..5774547492 100644 --- a/psx/octoshock/psx/cdc.h +++ b/psx/octoshock/psx/cdc.h @@ -25,6 +25,8 @@ class PS_CDC PS_CDC(); ~PS_CDC(); + templatevoid SyncState(EW::NewState *ns); + void SetDisc(bool tray_open, ShockDiscRef *disc, const char disc_id[4]); void Power(void); diff --git a/psx/octoshock/psx/cpu.cpp b/psx/octoshock/psx/cpu.cpp index 42c53c909e..c9e4ac8953 100644 --- a/psx/octoshock/psx/cpu.cpp +++ b/psx/octoshock/psx/cpu.cpp @@ -951,4 +951,39 @@ void PS_CPU::CheckBreakpoints(void (*callback)(bool write, uint32_t address, uns } -} + +SYNCFUNC(PS_CPU) +{ + NSS(GPR); + NSS(LO); + NSS(HI); + NSS(BACKED_PC); + NSS(BACKED_new_PC); + NSS(BACKED_new_PC_mask); + + NSS(IPCache); + NSS(Halted); + + NSS(BACKED_LDWhich); + NSS(BACKED_LDValue); + NSS(LDAbsorb); + + NSS(next_event_ts); + NSS(gte_ts_done); + NSS(muldiv_ts_done); + + NSS(BIU); + NSS(ICache_Bulk); + + NSS(CP0.Regs); + + NSS(ReadAbsorb); + NSS(ReadAbsorbDummy); + NSS(ReadAbsorbWhich); + NSS(ReadFudge); + + NSS(ScratchRAM.data8); + +} //SYNCFUNC(CPU) + +} //namespace MDFN_IEN_PSX diff --git a/psx/octoshock/psx/cpu.h b/psx/octoshock/psx/cpu.h index 7734001686..426a8d3c25 100644 --- a/psx/octoshock/psx/cpu.h +++ b/psx/octoshock/psx/cpu.h @@ -52,6 +52,8 @@ class PS_CPU PS_CPU(); ~PS_CPU(); + templatevoid SyncState(EW::NewState *ns); + // FAST_MAP_* enums are in BYTES(8-bit), not in 32-bit units("words" in MIPS context), but the sizes // will always be multiples of 4. enum { FAST_MAP_SHIFT = 16 }; diff --git a/psx/octoshock/psx/dma.cpp b/psx/octoshock/psx/dma.cpp index 270f84de93..09d162c5a2 100644 --- a/psx/octoshock/psx/dma.cpp +++ b/psx/octoshock/psx/dma.cpp @@ -777,44 +777,14 @@ uint32 DMA_Read(const pscpu_timestamp_t timestamp, uint32 A) return(ret); } - -int DMA_StateAction(StateMem *sm, int load, int data_only) +void DMA_SyncState(bool isReader, EW::NewState *ns) { - SFORMAT StateRegs[] = - { - SFVAR(DMACycleCounter), - SFVAR(DMAControl), - SFVAR(DMAIntControl), - SFVAR(DMAIntStatus), - SFVAR(IRQOut), - -#define SFDMACH(n) SFVARN(DMACH[n].BaseAddr, #n "BaseAddr"), \ - SFVARN(DMACH[n].BlockControl, #n "BlockControl"), \ - SFVARN(DMACH[n].ChanControl, #n "ChanControl"), \ - SFVARN(DMACH[n].CurAddr, #n "CurAddr"), \ - SFVARN(DMACH[n].WordCounter, #n "WordCounter"), \ - SFVARN(DMACH[n].ClockCounter, #n "ClockCounter") - - SFDMACH(0), - SFDMACH(1), - SFDMACH(2), - SFDMACH(3), - SFDMACH(4), - SFDMACH(5), - SFDMACH(6), - -#undef SFDMACH - - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "DMA"); - - if(load) - { - - } - - return(ret); + NSS(DMACycleCounter); + NSS(DMAControl); + NSS(DMAIntControl); + NSS(DMAIntStatus); + NSS(IRQOut); + NSS(DMACH); } diff --git a/psx/octoshock/psx/frontio.cpp b/psx/octoshock/psx/frontio.cpp index 9e6666ecd4..8eaae1b0cb 100644 --- a/psx/octoshock/psx/frontio.cpp +++ b/psx/octoshock/psx/frontio.cpp @@ -141,9 +141,10 @@ FrontIO::FrontIO() MCPorts[i] = new InputDevice(); } - //always add one memory device for now + //always add one memory device for now + delete MCPorts[0]; MCPorts[0] = Device_Memcard_Create(); -} +} FrontIO::~FrontIO() @@ -625,6 +626,68 @@ uint64 FrontIO::GetMemcardDirtyCount(unsigned int which) return(MCPorts[which]->GetNVDirtyCount()); } +//TODO - ok, savestating varying input devices. this is tricky. +//its like... what happens when the hardware unfreezes with different input attached? +//thats some kind of instantaneous change event which shouldnt/cant be properly emulated or likely even implemented +//so in that respect it's very much like (if not identical to) CDs. +//heres a discussion question. what are we doing here? savestating the CONSOLE or savestating the ENTIRE SYSTEM? +//well, what's being emulated? +//I dont know. lets save it for later. +//You know, this is one reason mednafen had a distinction between ports and devices. +//But I had to get rid of it, I just had to. At least they need to be organized into a pool differently somehow. + +//Anyway, think about this: We cant just savestate the entire system. The game will be depending on the input devices being in a certain state. +//If theyre in any other state, literally, any other state, then the game will fail. +//Therefore the entire system needs saving together and mismatches MUST NOT BE PERMITTED. + +SYNCFUNC(FrontIO) +{ + NSS(ClockDivider); + + NSS(ReceivePending); + NSS(TransmitPending); + + NSS(ReceiveInProgress); + NSS(TransmitInProgress); + + NSS(ReceiveBufferAvail); + + NSS(ReceiveBuffer); + NSS(TransmitBuffer); + + NSS(ReceiveBitCounter); + NSS(TransmitBitCounter); + + NSS(Mode); + NSS(Control); + NSS(Baudrate); + + NSS(istatus); + + // FIXME: Step mode save states. + NSS(irq10_pulse_ts); + NSS(dsr_pulse_delay); + NSS(dsr_active_until_ts); + + //state actions for ports and such + for(int i=0;i<2;i++) + { + ns->EnterSection("PORT%d",i); + Ports[i]->SyncState(isReader,ns); + ns->ExitSection("PORT%d",i); + ns->EnterSection("MCPORT%d",i); + MCPorts[i]->SyncState(isReader,ns); + ns->ExitSection("MCPORT%d",i); + } + + //more of this crap.... + if(isReader) + { + IRQ_Assert(IRQ_SIO, istatus); + } + +} + int FrontIO::StateAction(StateMem* sm, int load, int data_only) { SFORMAT StateRegs[] = diff --git a/psx/octoshock/psx/frontio.h b/psx/octoshock/psx/frontio.h index cc7423a779..2f00b058c0 100644 --- a/psx/octoshock/psx/frontio.h +++ b/psx/octoshock/psx/frontio.h @@ -15,6 +15,8 @@ class InputDevice virtual void Power(void); virtual void UpdateInput(const void *data); + + virtual void SyncState(bool isReader, EW::NewState *ns) {} virtual int StateAction(StateMem* sm, int load, int data_only, const char* section_name); virtual bool RequireNoFrameskip(void); @@ -61,6 +63,8 @@ class FrontIO FrontIO(); ~FrontIO(); + templatevoid SyncState(EW::NewState *ns); + void Power(void); void Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V); uint32 Read(pscpu_timestamp_t timestamp, uint32 A); diff --git a/psx/octoshock/psx/gpu.cpp b/psx/octoshock/psx/gpu.cpp index f5d0eb68fb..85b4090f53 100644 --- a/psx/octoshock/psx/gpu.cpp +++ b/psx/octoshock/psx/gpu.cpp @@ -1573,119 +1573,105 @@ void PS_GPU::StartFrame(EmulateSpecStruct *espec_arg) } } -int PS_GPU::StateAction(StateMem *sm, int load, int data_only) +SYNCFUNC(PS_GPU) { - SFORMAT StateRegs[] = - { - SFARRAY16(&GPURAM[0][0], sizeof(GPURAM) / sizeof(GPURAM[0][0])), + NSS(GPURAM); - SFVAR(DMAControl), + NSS(DMAControl); - SFVAR(ClipX0), - SFVAR(ClipY0), - SFVAR(ClipX1), - SFVAR(ClipY1), + NSS(ClipX0); + NSS(ClipY0); + NSS(ClipX1); + NSS(ClipY1); - SFVAR(OffsX), - SFVAR(OffsY), + NSS(OffsX); + NSS(OffsY); - SFVAR(dtd), - SFVAR(dfe), + NSS(dtd); + NSS(dfe); - SFVAR(MaskSetOR), - SFVAR(MaskEvalAND), + NSS(MaskSetOR); + NSS(MaskEvalAND); - SFVAR(tww), - SFVAR(twh), - SFVAR(twx), - SFVAR(twy), + NSS(tww); + NSS(twh); + NSS(twx); + NSS(twy); - SFVAR(TexPageX), - SFVAR(TexPageY), + NSS(TexPageX); + NSS(TexPageY); - SFVAR(SpriteFlip), + NSS(SpriteFlip); - SFVAR(abr), - SFVAR(TexMode), + NSS(abr); + NSS(TexMode); - SFARRAY32(&BlitterFIFO.data[0], BlitterFIFO.data.size()), - SFVAR(BlitterFIFO.read_pos), - SFVAR(BlitterFIFO.write_pos), - SFVAR(BlitterFIFO.in_count), + SSS(BlitterFIFO); - SFVAR(DataReadBuffer), + NSS(DataReadBuffer); - SFVAR(IRQPending), + NSS(IRQPending); - SFVAR(InCmd), - SFVAR(InCmd_CC), + NSS(InCmd); + NSS(InCmd_CC); -#define TVHELPER(n) SFVAR(n.x), SFVAR(n.y), SFVAR(n.u), SFVAR(n.v), SFVAR(n.r), SFVAR(n.g), SFVAR(n.b) - TVHELPER(InQuad_F3Vertices[0]), - TVHELPER(InQuad_F3Vertices[1]), - TVHELPER(InQuad_F3Vertices[2]), -#undef TVHELPER - SFVAR(InQuad_clut), + NSS(InQuad_F3Vertices); - SFVAR(InPLine_PrevPoint.x), - SFVAR(InPLine_PrevPoint.y), - SFVAR(InPLine_PrevPoint.r), - SFVAR(InPLine_PrevPoint.g), - SFVAR(InPLine_PrevPoint.b), + NSS(InQuad_clut); - SFVAR(FBRW_X), - SFVAR(FBRW_Y), - SFVAR(FBRW_W), - SFVAR(FBRW_H), - SFVAR(FBRW_CurY), - SFVAR(FBRW_CurX), + NSS(InPLine_PrevPoint); - SFVAR(DisplayMode), - SFVAR(DisplayOff), - SFVAR(DisplayFB_XStart), - SFVAR(DisplayFB_YStart), + NSS(FBRW_X); + NSS(FBRW_Y); + NSS(FBRW_W); + NSS(FBRW_H); + NSS(FBRW_CurY); + NSS(FBRW_CurX); - SFVAR(HorizStart), - SFVAR(HorizEnd), + NSS(DisplayMode); + NSS(DisplayOff); + NSS(DisplayFB_XStart); + NSS(DisplayFB_YStart); - SFVAR(VertStart), - SFVAR(VertEnd), + NSS(HorizStart); + NSS(HorizEnd); - SFVAR(DisplayFB_CurYOffset), - SFVAR(DisplayFB_CurLineYReadout), + NSS(VertStart); + NSS(VertEnd); - SFVAR(InVBlank), + NSS(DisplayFB_CurYOffset); + NSS(DisplayFB_CurLineYReadout); - SFVAR(LinesPerField), - SFVAR(scanline), - SFVAR(field), - SFVAR(field_ram_readout), - SFVAR(PhaseChange), + NSS(InVBlank); - SFVAR(DotClockCounter), + NSS(LinesPerField); + NSS(scanline); + NSS(field); + NSS(field_ram_readout); + NSS(PhaseChange); - SFVAR(GPUClockCounter), - SFVAR(LineClockCounter), - SFVAR(LinePhase), + NSS(DotClockCounter); - SFVAR(DrawTimeAvail), + NSS(GPUClockCounter); + NSS(LineClockCounter); + NSS(LinePhase); - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "GPU"); + NSS(DrawTimeAvail); - if(load) - { - RecalcTexWindowLUT(); - BlitterFIFO.SaveStatePostLoad(); + if(isReader) + { + //cached luts; safe not to sync + RecalcTexWindowLUT(); - HorizStart &= 0xFFF; - HorizEnd &= 0xFFF; + //what the hell is this? I dont like it at all. + HorizStart &= 0xFFF; + HorizEnd &= 0xFFF; - IRQ_Assert(IRQ_GPU, IRQPending); - } + //this is kind of typical stuff, BUT: a cursory inspection reveals nothing. the IRQ and CPU modules should be handling it OK + //LOOK HERE FOR BUGS + IRQ_Assert(IRQ_GPU, IRQPending); + } - return(ret); } } diff --git a/psx/octoshock/psx/gpu.h b/psx/octoshock/psx/gpu.h index c14f5783b5..2109318ccd 100644 --- a/psx/octoshock/psx/gpu.h +++ b/psx/octoshock/psx/gpu.h @@ -42,6 +42,8 @@ class PS_GPU PS_GPU(bool pal_clock_and_tv, int sls, int sle) MDFN_COLD; ~PS_GPU() MDFN_COLD; + templatevoid SyncState(EW::NewState *ns); + void FillVideoParams(MDFNGI* gi) MDFN_COLD; void Power(void) MDFN_COLD; diff --git a/psx/octoshock/psx/gte.cpp b/psx/octoshock/psx/gte.cpp index e83b907de7..32c800ae98 100644 --- a/psx/octoshock/psx/gte.cpp +++ b/psx/octoshock/psx/gte.cpp @@ -233,63 +233,11 @@ void GTE_Power(void) Reg23 = 0; } -// TODO: Don't save redundant state, regarding CR cache variables int GTE_StateAction(StateMem *sm, int load, int data_only) { - SFORMAT StateRegs[] = - { - SFARRAY32(CR, 32), - SFVAR(FLAGS), - SFARRAY16(&Matrices.Raw16[0][0], 4 * 10), +return 1; - SFARRAY32(&CRVectors.All[0][0], 4 * 4), - - SFVAR(OFX), - SFVAR(OFY), - SFVAR(H), - SFVAR(DQA), - SFVAR(DQB), - - SFVAR(ZSF3), - SFVAR(ZSF4), - SFARRAY16(&Vectors[0][0], 3 * 4), - - SFARRAY(RGB.Raw8, 4), - SFVAR(OTZ), - SFARRAY16(IR, 4), - - SFVAR(XY_FIFO[0].X), - SFVAR(XY_FIFO[0].Y), - SFVAR(XY_FIFO[1].X), - SFVAR(XY_FIFO[1].Y), - SFVAR(XY_FIFO[2].X), - SFVAR(XY_FIFO[2].Y), - SFVAR(XY_FIFO[3].X), - SFVAR(XY_FIFO[3].Y), - - SFARRAY16(Z_FIFO, 4), - - SFARRAY(RGB_FIFO[0].Raw8, 4), - SFARRAY(RGB_FIFO[1].Raw8, 4), - SFARRAY(RGB_FIFO[2].Raw8, 4), - - SFARRAY32(MAC, 4), - - SFVAR(LZCS), - SFVAR(LZCR), - SFVAR(Reg23), - - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "GTE"); - - if(load) - { - - } - - return(ret); } @@ -1731,6 +1679,43 @@ int32 GTE_Instruction(uint32 instr) return(ret - 1); } +void GTE_SyncState(bool isReader, EW::NewState *ns) +{ + NSS(CR); + NSS(FLAGS); + + NSS(Matrices); + + NSS(CRVectors); + + NSS(OFX); + NSS(OFY); + NSS(H); + NSS(DQA); + NSS(DQB); + + NSS(ZSF3); + NSS(ZSF4); + NSS(Vectors); + + NSS(RGB); + NSS(OTZ); + NSS(IR); + + NSS(XY_FIFO); + + NSS(Z_FIFO); + + NSS(RGB_FIFO); + + NSS(MAC); + + NSS(LZCS); + NSS(LZCR); + NSS(Reg23); +} + #ifndef PSXDEV_GTE_TESTING } #endif + diff --git a/psx/octoshock/psx/input/dualshock.cpp b/psx/octoshock/psx/input/dualshock.cpp index f1847e9587..38509c94a8 100644 --- a/psx/octoshock/psx/input/dualshock.cpp +++ b/psx/octoshock/psx/input/dualshock.cpp @@ -60,7 +60,7 @@ class InputDevice_DualShock : public InputDevice virtual ~InputDevice_DualShock(); virtual void Power(void); - virtual int StateAction(StateMem* sm, int load, int data_only, const char* section_name); + virtual void SyncState(bool isReader, EW::NewState *ns); virtual void Update(const pscpu_timestamp_t timestamp); virtual void ResetTS(void); @@ -232,56 +232,40 @@ void InputDevice_DualShock::Power(void) prev_ana_button_state = false; } -int InputDevice_DualShock::StateAction(StateMem* sm, int load, int data_only, const char* section_name) -{ - SFORMAT StateRegs[] = + void InputDevice_DualShock::SyncState(bool isReader, EW::NewState *ns) { - SFVAR(cur_ana_button_state), - SFVAR(prev_ana_button_state), - SFVAR(combo_anatoggle_counter), + NSS(cur_ana_button_state); + NSS(prev_ana_button_state); + NSS(combo_anatoggle_counter); - SFVAR(da_rumble_compat), + NSS(da_rumble_compat); - SFVAR(analog_mode), - SFVAR(analog_mode_locked), + NSS(analog_mode); + NSS(analog_mode_locked); - SFVAR(mad_munchkins), - SFARRAY(rumble_magic, sizeof(rumble_magic)), + NSS(mad_munchkins); + NSS(rumble_magic); - SFARRAY(rumble_param, sizeof(rumble_param)), + NSS(rumble_param); - SFVAR(dtr), + NSS(dtr); - SFARRAY(buttons, sizeof(buttons)), - SFARRAY(&axes[0][0], sizeof(axes)), + NSS(buttons); + NSS(axes); - SFVAR(command_phase), - SFVAR(bitpos), - SFVAR(receive_buffer), + NSS(command_phase); + NSS(bitpos); + NSS(receive_buffer); - SFVAR(command), + NSS(command); - SFARRAY(transmit_buffer, sizeof(transmit_buffer)), - SFVAR(transmit_pos), - SFVAR(transmit_count), + NSS(transmit_buffer); + NSS(transmit_pos); + NSS(transmit_count); - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); - - if(load) - { - if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) - { - transmit_pos = 0; - transmit_count = 0; - } + //THERES MORE BUFFER SIZE SANITY CHECKS HERE. DONT LIKE THAT STUFF } - return(ret); -} - - void InputDevice_DualShock::UpdateInput(const void *data) { uint8 *d8 = (uint8 *)data; diff --git a/psx/octoshock/psx/input/memcard.cpp b/psx/octoshock/psx/input/memcard.cpp index db872a7bec..e201e6dfdf 100644 --- a/psx/octoshock/psx/input/memcard.cpp +++ b/psx/octoshock/psx/input/memcard.cpp @@ -41,7 +41,7 @@ class InputDevice_Memcard : public InputDevice virtual void Power(void); virtual int StateAction(StateMem* sm, int load, int data_only, const char* section_name); - + virtual void SyncState(bool isReader, EW::NewState *ns); // // // @@ -162,6 +162,38 @@ void InputDevice_Memcard::Power(void) presence_new = true; } +void InputDevice_Memcard::SyncState(bool isReader, EW::NewState *ns) +{ + NSS(presence_new); + + NSS(rw_buffer); + NSS(write_xor); + + NSS(dtr); + NSS(command_phase); + NSS(bitpos); + NSS(receive_buffer); + + NSS(command); + NSS(addr); + NSS(calced_xor); + + NSS(transmit_buffer); + NSS(transmit_count); + + NSS(data_used); + + //(now there was logic to avoid savestating cards that had never been used. only needed if we have a pool of cards) + //(also it called Format() but I dont see how that makes sense at all and anyway I'm ignoring it) + + //now for the BIG QUESTION, regarding clobber's lament. + //we need to dump the contents of the card along with the register state. its necessary for safety. + //HOWEVER - we clear the dirty flag. that way, a user wont accidentally `clobber` his savestates when loading a state. + //instead, the state will only be dirtied when the game actually modifies the contents + NSS(card_data); + dirty_count = 0; +} + int InputDevice_Memcard::StateAction(StateMem* sm, int load, int data_only, const char* section_name) { // Don't save dirty_count. diff --git a/psx/octoshock/psx/irq.cpp b/psx/octoshock/psx/irq.cpp index 20a36c7a13..61182b075d 100644 --- a/psx/octoshock/psx/irq.cpp +++ b/psx/octoshock/psx/irq.cpp @@ -58,6 +58,19 @@ int IRQ_StateAction(StateMem *sm, int load, int data_only) } +void IRQ_SyncState(bool isReader, EW::NewState *ns) +{ + NSS(Asserted); + NSS(Mask); + NSS(Status); + + //as usual, not sure why this is necessary + if(isReader) + { + Recalc(); + } +} + void IRQ_Assert(int which, bool status) { uint32 old_Asserted = Asserted; diff --git a/psx/octoshock/psx/mdec.cpp b/psx/octoshock/psx/mdec.cpp index 3e3f366027..00218548f0 100644 --- a/psx/octoshock/psx/mdec.cpp +++ b/psx/octoshock/psx/mdec.cpp @@ -164,64 +164,50 @@ void MDEC_Power(void) RAMOffsetWWS = 0; } -int MDEC_StateAction(StateMem *sm, int load, int data_only) +template void MDEC_SyncState(EW::NewState *ns) { - SFORMAT StateRegs[] = - { - SFVAR(ClockCounter), - SFVAR(MDRPhase), + NSS(ClockCounter); + NSS(MDRPhase); -#define SFFIFO32(fifoobj) SFARRAY32(&fifoobj.data[0], fifoobj.data.size()), \ - SFVAR(fifoobj.read_pos), \ - SFVAR(fifoobj.write_pos), \ - SFVAR(fifoobj.in_count) + SSS(InFIFO); + SSS(OutFIFO); - SFFIFO32(InFIFO), - SFFIFO32(OutFIFO), -#undef SFFIFO + NSS(block_y); + NSS(block_cb); + NSS(block_cr); - SFARRAY(&block_y[0][0], sizeof(block_y) / sizeof(block_y[0][0])), - SFARRAY(&block_cb[0][0], sizeof(block_cb) / sizeof(block_cb[0][0])), - SFARRAY(&block_cr[0][0], sizeof(block_cr) / sizeof(block_cr[0][0])), + NSS(Control); + NSS(Command); + NSS(InCommand); - SFVAR(Control), - SFVAR(Command), - SFVAR(InCommand), + NSS(QMatrix); + NSS(QMIndex); - SFARRAY(&QMatrix[0][0], sizeof(QMatrix) / sizeof(QMatrix[0][0])), - SFVAR(QMIndex), + NSS(IDCTMatrix); + NSS(IDCTMIndex); - SFARRAY16(&IDCTMatrix[0], sizeof(IDCTMatrix) / sizeof(IDCTMatrix[0])), - SFVAR(IDCTMIndex), + NSS(QScale); - SFVAR(QScale), + NSS(Coeff); + NSS(CoeffIndex); + NSS(DecodeWB); - SFARRAY16(&Coeff[0], sizeof(Coeff) / sizeof(Coeff[0])), - SFVAR(CoeffIndex), - SFVAR(DecodeWB), + NSS(PixelBuffer); + NSS(PixelBufferReadOffset); + NSS(PixelBufferCount32); - SFARRAY32(&PixelBuffer.pix32[0], sizeof(PixelBuffer.pix32) / sizeof(PixelBuffer.pix32[0])), - SFVAR(PixelBufferReadOffset), - SFVAR(PixelBufferCount32), + NSS(InCounter); - SFVAR(InCounter), + NSS(RAMOffsetY); + NSS(RAMOffsetCounter); + NSS(RAMOffsetWWS); - SFVAR(RAMOffsetY), - SFVAR(RAMOffsetCounter), - SFVAR(RAMOffsetWWS), +} - SFEND - }; - - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MDEC"); - - if(load) - { - InFIFO.SaveStatePostLoad(); - OutFIFO.SaveStatePostLoad(); - } - - return(ret); +void MDEC_SyncState(bool isReader, EW::NewState *ns) +{ + if(isReader) MDEC_SyncState(ns); + else MDEC_SyncState(ns); } static INLINE int8 Mask9ClampS8(int32 v) diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp index e73f4e5989..a77c3e7681 100644 --- a/psx/octoshock/psx/psx.cpp +++ b/psx/octoshock/psx/psx.cpp @@ -1116,6 +1116,7 @@ struct { case eShockMemcardTransaction_Write: FIO->MCPorts[portnum]->WriteNV((uint8*)transaction->buffer128k,0,128*1024); + FIO->MCPorts[portnum]->ResetNVDirtyCount(); return SHOCK_OK; case eShockMemcardTransaction_Read: @@ -1825,62 +1826,6 @@ static void CloseGame(void) Cleanup(); } -static int StateAction(StateMem *sm, int load, int data_only) -{ - - //SFORMAT StateRegs[] = - //{ - // NSS(CD_TrayOpen); - // PSS(MainRAM.data8, 2*1024*1024); - // NSS(SysControl.Regs, 9); - - // //SFVAR(PSX_PRNG.lcgo), - // //SFVAR(PSX_PRNG.x), - // //SFVAR(PSX_PRNG.y), - // //SFVAR(PSX_PRNG.z), - // //SFVAR(PSX_PRNG.c), - - // SFEND - //}; - - //int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); - - //// Call SetDisc() BEFORE we load CDC state, since SetDisc() has emulation side effects. We might want to clean this up in the future. - //if(load) - //{ - // if(CD_SelectedDisc >= (int)cdifs->size()) - // CD_SelectedDisc = -1; - - ////DAW???????????? - //// CDC->SetDisc(CD_TrayOpen, (CD_SelectedDisc >= 0 && !CD_TrayOpen) ? (*cdifs)[CD_SelectedDisc] : NULL, - ////(CD_SelectedDisc >= 0 && !CD_TrayOpen) ? cdifs_scex_ids[CD_SelectedDisc] : NULL); - //} - - //// TODO: Remember to increment dirty count in memory card state loading routine. - - //ret &= CPU->StateAction(sm, load, data_only); - //ret &= DMA_StateAction(sm, load, data_only); - //ret &= TIMER_StateAction(sm, load, data_only); - //ret &= SIO_StateAction(sm, load, data_only); - - //ret &= CDC->StateAction(sm, load, data_only); - //ret &= MDEC_StateAction(sm, load, data_only); - //ret &= GPU->StateAction(sm, load, data_only); - //ret &= SPU->StateAction(sm, load, data_only); - - //ret &= FIO->StateAction(sm, load, data_only); - - //ret &= IRQ_StateAction(sm, load, data_only); // Do it last. - - //if(load) - //{ - // ForceEventUpdates(0); // FIXME to work with debugger step mode. - //} - - //return(ret); - return 0; -} - static void CDInsertEject(void) { CD_TrayOpen = !CD_TrayOpen; @@ -1922,6 +1867,10 @@ EW_EXPORT s32 shock_SetDisc(void* psx, ShockDiscRef* disc) s32 ret = shock_AnalyzeDisc(disc,&info); if(ret != SHOCK_OK) return ret; + //heres a comment from some old savestating code. something to keep in mind (maybe or maybe not a surprise depending on your point of view) + //"Call SetDisc() BEFORE we load CDC state, since SetDisc() has emulation side effects. We might want to clean this up in the future." + //I'm not really sure I like how SetDisc works, so I'm glad this was brought to our attention + s_CurrDiscInfo = info; s_CurrDisc = disc; CDC->SetDisc(true,s_CurrDisc,s_CurrDiscInfo.id); @@ -2419,62 +2368,79 @@ public: templatevoid SyncState(EW::NewState *ns); } s_PSX; -//--OLD SAVESTATE-- - //SFORMAT StateRegs[] = - //{ - // NSS(CD_TrayOpen); - // PSS(MainRAM.data8, 2*1024*1024); - // NSS(SysControl.Regs, 9); - - // //SFVAR(PSX_PRNG.lcgo), - // //SFVAR(PSX_PRNG.x), - // //SFVAR(PSX_PRNG.y), - // //SFVAR(PSX_PRNG.z), - // //SFVAR(PSX_PRNG.c), - - // SFEND - //}; - - //int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); - - //// Call SetDisc() BEFORE we load CDC state, since SetDisc() has emulation side effects. We might want to clean this up in the future. - //if(load) - //{ - // if(CD_SelectedDisc >= (int)cdifs->size()) - // CD_SelectedDisc = -1; - - ////DAW???????????? - //// CDC->SetDisc(CD_TrayOpen, (CD_SelectedDisc >= 0 && !CD_TrayOpen) ? (*cdifs)[CD_SelectedDisc] : NULL, - ////(CD_SelectedDisc >= 0 && !CD_TrayOpen) ? cdifs_scex_ids[CD_SelectedDisc] : NULL); - //} - - //// TODO: Remember to increment dirty count in memory card state loading routine. - - //ret &= CPU->StateAction(sm, load, data_only); - //ret &= DMA_StateAction(sm, load, data_only); - //ret &= TIMER_StateAction(sm, load, data_only); - //ret &= SIO_StateAction(sm, load, data_only); - - //ret &= CDC->StateAction(sm, load, data_only); - //ret &= MDEC_StateAction(sm, load, data_only); - //ret &= GPU->StateAction(sm, load, data_only); - //ret &= SPU->StateAction(sm, load, data_only); - - //ret &= FIO->StateAction(sm, load, data_only); - - //ret &= IRQ_StateAction(sm, load, data_only); // Do it last. - - //if(load) - //{ - // ForceEventUpdates(0); // FIXME to work with debugger step mode. - //} - +namespace MDFN_IEN_PSX { +void DMA_SyncState(bool isReader, EW::NewState *ns); +void GTE_SyncState(bool isReader, EW::NewState *ns); +void TIMER_SyncState(bool isReader, EW::NewState *ns); +void SIO_SyncState(bool isReader, EW::NewState *ns); +void MDEC_SyncState(bool isReader, EW::NewState *ns); +void IRQ_SyncState(bool isReader, EW::NewState *ns); +} SYNCFUNC(PSX) { NSS(CD_TrayOpen); PSS(MainRAM.data8, 2*1024*1024); - NSS(SysControl.Regs); //9 regs.. does the array work? + NSS(SysControl.Regs); + NSS(PSX_PRNG.lcgo); + NSS(PSX_PRNG.x); + NSS(PSX_PRNG.y); + NSS(PSX_PRNG.z); + NSS(PSX_PRNG.c); + + //note: mednafen used to save the current disc index. that's kind of nice, I guess, if you accept that responsibility in the core. + //but we're not doing things that way. + //I think instead maybe we should generate a hash of the inserted disc and save that, and then check if theres a mismatch between the disc at the time of the savestate and the current disc + //but we'll do that in the frontend for now + + //old: + // "TODO: Remember to increment dirty count in memory card state loading routine." + //not sure what this means or whether I like it + + //I've kept the ordering of these sections the same, in case its important for some unknown reason.. for now. + + TSS(CPU); + + ns->EnterSection("GTE"); + GTE_SyncState(isReader,ns); + ns->ExitSection("GTE"); + + ns->EnterSection("DMA"); + DMA_SyncState(isReader,ns); + ns->ExitSection("DMA"); + + ns->EnterSection("TIMER"); + TIMER_SyncState(isReader,ns); + ns->ExitSection("TIMER"); + + ns->EnterSection("SIO"); + SIO_SyncState(isReader,ns); + ns->ExitSection("SIO"); + + TSS(CDC); + + ns->EnterSection("MDEC"); + MDEC_SyncState(isReader,ns); + ns->ExitSection("MDEC"); + + TSS(GPU); //did some special logic for the CPU, ordering may matter, but probably not + + TSS(SPU); + TSS(FIO); //TODO - DUALSHOCK, MC + + + //"Do it last." the comments say. And all this other nonsense about IRQs in the other state syncing functions. weird..... + //ret &= IRQ_StateAction(sm, load, data_only); // + + ns->EnterSection("IRQ"); + IRQ_SyncState(isReader,ns); + ns->ExitSection("IRQ"); + + //zero: this is probably OK + if(isReader) + { + ForceEventUpdates(0); // FIXME to work with debugger step mode. + } } EW_EXPORT s32 shock_StateTransaction(void *psx, ShockStateTransaction* transaction) @@ -2518,5 +2484,8 @@ EW_EXPORT s32 shock_StateTransaction(void *psx, ShockStateTransaction* transacti return SHOCK_OK; } return SHOCK_ERROR; + + default: + return SHOCK_ERROR; } } \ No newline at end of file diff --git a/psx/octoshock/psx/psx.h b/psx/octoshock/psx/psx.h index 45ec5d53dc..4757d3c2a5 100644 --- a/psx/octoshock/psx/psx.h +++ b/psx/octoshock/psx/psx.h @@ -316,6 +316,9 @@ EW_EXPORT s32 shock_SetDisc(void* psx, ShockDiscRef* disc); EW_EXPORT s32 shock_CloseTray(void* psx); //Steps emulation by the specified interval +//TODO - think about something. After loadstating, the device input state is probably nonsense. +//Normally we'd set the input before frame advancing. But every frontend might not do that, and we might not be stepping by one frame. +//What to do about this? EW_EXPORT s32 shock_Step(void* psx, eShockStep step); //Fetches the framebuffer. Can retrieve parameters (set the job ptr to NULL) or fill the provided job ptr with the framebuffer (make sure its big enough). diff --git a/psx/octoshock/psx/sio.cpp b/psx/octoshock/psx/sio.cpp index a2b02c0937..5470432603 100644 --- a/psx/octoshock/psx/sio.cpp +++ b/psx/octoshock/psx/sio.cpp @@ -103,26 +103,14 @@ void SIO_Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V) } } -int SIO_StateAction(StateMem *sm, int load, int data_only) + +void SIO_SyncState(bool isReader, EW::NewState *ns) { - SFORMAT StateRegs[] = - { - SFVAR(Status), - SFVAR(Mode), - SFVAR(Control), - SFVAR(BaudRate), - SFVAR(DataBuffer), - - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "SIO"); - - if(load) - { - - } - - return(ret); + NSS(Status); + NSS(Mode); + NSS(Control); + NSS(BaudRate); + NSS(DataBuffer); } } diff --git a/psx/octoshock/psx/spu.cpp b/psx/octoshock/psx/spu.cpp index 4caad3b07a..0c774e4c2f 100644 --- a/psx/octoshock/psx/spu.cpp +++ b/psx/octoshock/psx/spu.cpp @@ -1160,147 +1160,61 @@ int32 PS_SPU::EndFrame(int16 *SoundBuf) } } -int PS_SPU::StateAction(StateMem *sm, int load, int data_only) +SYNCFUNC(PS_SPU) { - SFORMAT StateRegs[] = - { -#define SFSWEEP(r) SFVAR((r).Control), \ - SFVAR((r).Current), \ - SFVAR((r).Divider) + NSS(Voices); -#define SFVOICE(n) SFARRAY16(&Voices[n].DecodeBuffer[0], sizeof(Voices[n].DecodeBuffer) / sizeof(Voices[n].DecodeBuffer[0])), \ - SFVAR(Voices[n].DecodeM2), \ - SFVAR(Voices[n].DecodeM1), \ - SFVAR(Voices[n].DecodePlayDelay), \ - SFVAR(Voices[n].DecodeWritePos), \ - SFVAR(Voices[n].DecodeReadPos), \ - SFVAR(Voices[n].DecodeAvail), \ - SFVAR(Voices[n].DecodeShift), \ - SFVAR(Voices[n].DecodeWeight), \ - SFVAR(Voices[n].DecodeFlags), \ - SFVAR(Voices[n].IgnoreSampLA), \ - \ - SFSWEEP(Voices[n].Sweep[0]), \ - SFSWEEP(Voices[n].Sweep[1]), \ - \ - SFVAR(Voices[n].Pitch), \ - SFVAR(Voices[n].CurPhase), \ - \ - SFVAR(Voices[n].StartAddr), \ - SFVAR(Voices[n].CurAddr), \ - SFVAR(Voices[n].ADSRControl), \ - SFVAR(Voices[n].LoopAddr), \ - SFVAR(Voices[n].PreLRSample), \ - \ - SFVAR(Voices[n].ADSR.EnvLevel), \ - SFVAR(Voices[n].ADSR.Divider), \ - SFVAR(Voices[n].ADSR.Phase), \ - \ - SFVAR(Voices[n].ADSR.AttackExp), \ - SFVAR(Voices[n].ADSR.SustainExp), \ - SFVAR(Voices[n].ADSR.SustainDec), \ - SFVAR(Voices[n].ADSR.ReleaseExp), \ - \ - SFVAR(Voices[n].ADSR.AttackRate), \ - SFVAR(Voices[n].ADSR.DecayRate), \ - SFVAR(Voices[n].ADSR.SustainRate), \ - SFVAR(Voices[n].ADSR.ReleaseRate), \ - \ - SFVAR(Voices[n].ADSR.SustainLevel) + NSS(NoiseCounter); + NSS(LFSR); - SFVOICE(0), - SFVOICE(1), - SFVOICE(2), - SFVOICE(3), - SFVOICE(4), - SFVOICE(5), - SFVOICE(6), - SFVOICE(7), - SFVOICE(8), - SFVOICE(9), - SFVOICE(10), - SFVOICE(11), - SFVOICE(12), - SFVOICE(13), - SFVOICE(14), - SFVOICE(15), - SFVOICE(16), - SFVOICE(17), - SFVOICE(18), - SFVOICE(19), - SFVOICE(20), - SFVOICE(21), - SFVOICE(22), - SFVOICE(23), -#undef SFVOICE + NSS(FM_Mode); + NSS(Noise_Mode); + NSS(Reverb_Mode); - SFVAR(NoiseCounter), - SFVAR(LFSR), + NSS(ReverbWA); - SFVAR(FM_Mode), - SFVAR(Noise_Mode), - SFVAR(Reverb_Mode), + NSS(GlobalSweep); - SFVAR(ReverbWA), + NSS(ReverbVol); - SFSWEEP(GlobalSweep[0]), - SFSWEEP(GlobalSweep[1]), - - SFARRAY32(ReverbVol, sizeof(ReverbVol) / sizeof(ReverbVol[0])), - - SFARRAY32(CDVol, sizeof(CDVol) / sizeof(CDVol[0])), - SFARRAY32(ExternVol, sizeof(ExternVol) / sizeof(ExternVol[0])), + NSS(CDVol); + NSS(ExternVol); - SFVAR(IRQAddr), + NSS(IRQAddr); - SFVAR(RWAddr), + NSS(RWAddr); - SFVAR(SPUControl), + NSS(SPUControl); - SFVAR(VoiceOn), - SFVAR(VoiceOff), + NSS(VoiceOn); + NSS(VoiceOff); - SFVAR(BlockEnd), + NSS(BlockEnd); - SFVAR(CWA), + NSS(CWA); - SFARRAY16(Regs, sizeof(Regs) / sizeof(Regs[0])), - SFARRAY16(AuxRegs, sizeof(AuxRegs) / sizeof(AuxRegs[0])), + NSS(Regs); + NSS(AuxRegs); - SFARRAY16(&RDSB[0][0], sizeof(RDSB) / sizeof(RDSB[0][0])), - SFVAR(RDSB_WP), + NSS(RDSB); + NSS(RDSB_WP); - SFARRAY16(&RUSB[0][0], sizeof(RUSB) / sizeof(RUSB[0][0])), - SFVAR(RUSB_WP), + NSS(RUSB); + NSS(RUSB_WP); - SFVAR(ReverbCur), - SFVAR(IRQAsserted), + NSS(ReverbCur); + NSS(IRQAsserted); - SFVAR(clock_divider), + NSS(clock_divider); - SFARRAY16(SPURAM, 524288 / sizeof(uint16)), - SFEND - }; -#undef SFSWEEP - int ret = 1; + NSS(SPURAM); - ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, "SPU"); - - if(load) - { - for(unsigned i = 0; i < 24; i++) - { - Voices[i].DecodeReadPos &= 0x1F; - Voices[i].DecodeWritePos &= 0x1F; - } - - RDSB_WP &= 0x3F; - RUSB_WP &= 0x3F; - - IRQ_Assert(IRQ_SPU, IRQAsserted); - } - - return(ret); + //if(isReader) + //{ + //there was more weird crap here about controlling the range of variables. just sanity checks, I guess? to prevent crashes? no thanks, id rather have crashes alert me to nondeterminisms. + //and another thing like this, which I think makes no sense. I really need to test these. + IRQ_Assert(IRQ_SPU, IRQAsserted); + //} } uint16 PS_SPU::PeekSPURAM(uint32 address) diff --git a/psx/octoshock/psx/spu.h b/psx/octoshock/psx/spu.h index 85ae819e2f..813233b5ef 100644 --- a/psx/octoshock/psx/spu.h +++ b/psx/octoshock/psx/spu.h @@ -99,6 +99,8 @@ class PS_SPU PS_SPU(); ~PS_SPU(); + templatevoid SyncState(EW::NewState *ns); + int StateAction(StateMem *sm, int load, int data_only); void Power(void); diff --git a/psx/octoshock/psx/timer.cpp b/psx/octoshock/psx/timer.cpp index 8cb918e19c..a00fd859dc 100644 --- a/psx/octoshock/psx/timer.cpp +++ b/psx/octoshock/psx/timer.cpp @@ -446,34 +446,11 @@ void TIMER_Power(void) memset(Timers, 0, sizeof(Timers)); } -int TIMER_StateAction(StateMem *sm, int load, int data_only) +void TIMER_SyncState(bool isReader, EW::NewState *ns) { - SFORMAT StateRegs[] = - { -#define SFTIMER(n) SFVARN(Timers[n].Mode, #n "Mode"), \ - SFVARN(Timers[n].Counter, #n "Counter"), \ - SFVARN(Timers[n].Target, #n "Target"), \ - SFVARN(Timers[n].Div8Counter, #n "Div8Counter"), \ - SFVARN(Timers[n].IRQDone, #n "IRQDone"), \ - SFVARN(Timers[n].DoZeCounting, #n "DoZeCounting") - SFTIMER(0), - SFTIMER(1), - SFTIMER(2), -#undef SFTIMER - - SFVAR(vblank), - SFVAR(hretrace), - - SFEND - }; - int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "TIMER"); - - if(load) - { - - } - - return(ret); + NSS(Timers); + NSS(vblank); + NSS(hretrace); } uint32 TIMER_GetRegister(unsigned int which, char *special, const uint32 special_len)