From 7722344e55d4a68ba8bf644eabdb66358f3a722d Mon Sep 17 00:00:00 2001 From: zeromus Date: Sat, 1 Dec 2012 08:28:46 +0000 Subject: [PATCH] libsnes-gain the ability to serialize const arrays: useful for emitting comments in savestates, which is helpful for debugging. note to self: add a serializer for bools which transforms to 0 or 1 --- libsnes/bsnes/nall/serializer.hpp | 15 ++++++ libsnes/bsnes/snes/system/serialization.cpp | 54 +++++++++++++++------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/libsnes/bsnes/nall/serializer.hpp b/libsnes/bsnes/nall/serializer.hpp index fcb39456ac..81267e069c 100644 --- a/libsnes/bsnes/nall/serializer.hpp +++ b/libsnes/bsnes/nall/serializer.hpp @@ -64,11 +64,26 @@ namespace nall { } } + template void integer(const T &value) { + enum { size = std::is_same::value ? 1 : sizeof(T) }; + if(imode == Save) { + for(unsigned n = 0; n < size; n++) idata[isize++] = (uintmax_t)value >> (n << 3); + } else if(imode == Load) { + } else if(imode == Size) { + isize += size; + } + } + template void array(T &array) { enum { size = sizeof(T) / sizeof(typename std::remove_extent::type) }; for(unsigned n = 0; n < size; n++) integer(array[n]); } + template void array(const T &array) { + enum { size = sizeof(T) / sizeof(typename std::remove_extent::type) }; + for(unsigned n = 0; n < size; n++) integer(array[n]); + } + template void array(T array, unsigned size) { for(unsigned n = 0; n < size; n++) integer(array[n]); } diff --git a/libsnes/bsnes/snes/system/serialization.cpp b/libsnes/bsnes/snes/system/serialization.cpp index fe9f421cb2..f4e4517da7 100644 --- a/libsnes/bsnes/snes/system/serialization.cpp +++ b/libsnes/bsnes/snes/system/serialization.cpp @@ -48,29 +48,53 @@ void System::serialize(serializer &s) { s.integer((unsigned&)expansion); } +//zero 01-dec-2012 - these will embed strings in the savestates, so you can debug them more easily. but itll break the savestate format +//#define DEBUGSAVESTATE(X) s.array(#X) +#define DEBUGSAVESTATE(X) + void System::serialize_all(serializer &s) { - cartridge.serialize(s); - system.serialize(s); - random.serialize(s); - cpu.serialize(s); + DEBUGSAVESTATE(cart); + cartridge.serialize(s); + DEBUGSAVESTATE(system); + system.serialize(s); + DEBUGSAVESTATE(random); + random.serialize(s); + DEBUGSAVESTATE(cpu); + cpu.serialize(s); + DEBUGSAVESTATE(smp); smp.serialize(s); + DEBUGSAVESTATE(ppu); ppu.serialize(s); + DEBUGSAVESTATE(dsp); dsp.serialize(s); + DEBUGSAVESTATE(input); input.serialize(s); + DEBUGSAVESTATE(sufamiturbo); if(cartridge.mode() == Cartridge::Mode::SufamiTurbo) sufamiturbo.serialize(s); #if defined(GAMEBOY) - if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) icd2.serialize(s); - #endif - if(cartridge.has_superfx()) superfx.serialize(s); - if(cartridge.has_sa1()) sa1.serialize(s); - if(cartridge.has_necdsp()) necdsp.serialize(s); - if(cartridge.has_hitachidsp()) hitachidsp.serialize(s); - if(cartridge.has_armdsp()) armdsp.serialize(s); - if(cartridge.has_srtc()) srtc.serialize(s); - if(cartridge.has_sdd1()) sdd1.serialize(s); - if(cartridge.has_spc7110()) spc7110.serialize(s); - if(cartridge.has_obc1()) obc1.serialize(s); + DEBUGSAVESTATE(icd2); + if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) icd2.serialize(s); + #endif + DEBUGSAVESTATE(superfx); + if(cartridge.has_superfx()) superfx.serialize(s); + DEBUGSAVESTATE(sa1); + if(cartridge.has_sa1()) sa1.serialize(s); + DEBUGSAVESTATE(necdsp); + if(cartridge.has_necdsp()) necdsp.serialize(s); + DEBUGSAVESTATE(hitachidsp); + if(cartridge.has_hitachidsp()) hitachidsp.serialize(s); + DEBUGSAVESTATE(armdsp); + if(cartridge.has_armdsp()) armdsp.serialize(s); + DEBUGSAVESTATE(srtc); + if(cartridge.has_srtc()) srtc.serialize(s); + DEBUGSAVESTATE(sdd1); + if(cartridge.has_sdd1()) sdd1.serialize(s); + DEBUGSAVESTATE(spc7110); + if(cartridge.has_spc7110()) spc7110.serialize(s); + DEBUGSAVESTATE(obc1); + if(cartridge.has_obc1()) obc1.serialize(s); + DEBUGSAVESTATE(msu1); if(cartridge.has_msu1()) msu1.serialize(s); }