diff --git a/apu/apu.cpp b/apu/apu.cpp index f9f2fd0a..3d63b1a4 100644 --- a/apu/apu.cpp +++ b/apu/apu.cpp @@ -350,7 +350,6 @@ void S9xAPULoadState(uint8 *block) SNES::smp.load_state(&ptr); SNES::dsp.load_state(&ptr); - spc::reference_time = SNES::get_le32(ptr); ptr += sizeof(int32); spc::remainder = SNES::get_le32(ptr); diff --git a/snapshot.cpp b/snapshot.cpp index 773cb183..60c901d6 100644 --- a/snapshot.cpp +++ b/snapshot.cpp @@ -1576,16 +1576,35 @@ int S9xUnfreezeFromStream (STREAM stream) if (local_fillram) memcpy(Memory.FillRAM, local_fillram, 0x8000); - if(version < SNAPSHOT_VERSION_BAPU) { + if (version < SNAPSHOT_VERSION_BAPU) + { printf("Using Blargg APU snapshot loading (snapshot version %d, current is %d)\n...", version, SNAPSHOT_VERSION); S9xAPULoadBlarggState(local_apu_sound); - } else - S9xAPULoadState(local_apu_sound); + } + else if (version < 12) + { + printf("Adjusting old APU snapshot (snapshot version %d, current is %d)\n", version, SNAPSHOT_VERSION); + const size_t spc_block_size = 65700; + const size_t old_dsp_block_size = 514; + const size_t added_bytes_v12 = 128; + const size_t bytes_afterward = 16; + // Shift end to make room for extra 128 bytes + memmove(local_apu_sound + spc_block_size + old_dsp_block_size + added_bytes_v12, + local_apu_sound + spc_block_size + old_dsp_block_size, + bytes_afterward); + // Copy saved internal registers to external registers + memmove(local_apu_sound + spc_block_size + old_dsp_block_size, local_apu_sound + spc_block_size, added_bytes_v12); + S9xAPULoadState(local_apu_sound); + } + else if (version >= 12) + { + S9xAPULoadState(local_apu_sound); + } - struct SControlSnapshot ctl_snap; - UnfreezeStructFromCopy(&ctl_snap, SnapControls, COUNT(SnapControls), local_control_data, version); + struct SControlSnapshot ctl_snap; + UnfreezeStructFromCopy(&ctl_snap, SnapControls, COUNT(SnapControls), local_control_data, version); - UnfreezeStructFromCopy(&Timings, SnapTimings, COUNT(SnapTimings), local_timing_data, version); + UnfreezeStructFromCopy(&Timings, SnapTimings, COUNT(SnapTimings), local_timing_data, version); if (local_superfx) { diff --git a/snapshot.h b/snapshot.h index 03e59856..fe5fc519 100644 --- a/snapshot.h +++ b/snapshot.h @@ -13,7 +13,7 @@ #define SNAPSHOT_VERSION_IRQ 7 #define SNAPSHOT_VERSION_BAPU 8 #define SNAPSHOT_VERSION_IRQ_2018 11 // irq changes were introduced earlier, since this we store NextIRQTimer directly -#define SNAPSHOT_VERSION 11 +#define SNAPSHOT_VERSION 12 #define SUCCESS 1 #define WRONG_FORMAT (-1)