From daf83faff3a9cc6fb25ead4572b5b431dfdd3814 Mon Sep 17 00:00:00 2001 From: Christian Speckner Date: Wed, 14 Aug 2024 21:21:37 +0200 Subject: [PATCH] Refactoring, include "rom image" in save. --- src/emucore/CartELF.cxx | 10 +++++-- src/emucore/CortexM0.cxx | 39 ++++++++++++++++++------- src/emucore/CortexM0.hxx | 9 ++++-- src/emucore/elf/BusTransactionQueue.cxx | 28 +++++++++++++----- src/emucore/elf/BusTransactionQueue.hxx | 8 +++-- src/emucore/elf/VcsLib.cxx | 33 ++++++++++++++------- src/emucore/elf/VcsLib.hxx | 6 ++-- 7 files changed, 95 insertions(+), 38 deletions(-) diff --git a/src/emucore/CartELF.cxx b/src/emucore/CartELF.cxx index b57476a02..d3b533a97 100644 --- a/src/emucore/CartELF.cxx +++ b/src/emucore/CartELF.cxx @@ -270,9 +270,13 @@ bool CartridgeELF::save(Serializer& out) const out.putInt(myInitFunctionIndex); out.putByte(static_cast(myConsoleTiming)); - myTransactionQueue.save(out); - myCortexEmu.save(out); - myVcsLib.save(out); + out.putByteArray(myLastPeekResult.get(), 0x1000); + + if (!myTransactionQueue.save(out)) return false; + if (!myCortexEmu.save(out)) return false; + if (!myVcsLib.save(out)) return false; + + myCortexEmu.saveDirtyRegions(out); } catch(...) { cerr << "ERROR: failed to save ELF\n"; diff --git a/src/emucore/CortexM0.cxx b/src/emucore/CortexM0.cxx index 427450a92..930cfdc54 100644 --- a/src/emucore/CortexM0.cxx +++ b/src/emucore/CortexM0.cxx @@ -559,7 +559,7 @@ CortexM0::CortexM0() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CortexM0::MemoryRegion::save(Serializer& serializer) const +void CortexM0::MemoryRegion::serialize(Serializer& serializer) const { if (type != MemoryRegionType::directCode && type != MemoryRegionType::directData) return; @@ -589,20 +589,39 @@ void CortexM0::MemoryRegion::save(Serializer& serializer) const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CortexM0::save(Serializer& serializer) const +bool CortexM0::save(Serializer& serializer) const { - for (size_t i = 0; i < 16; i++) - serializer.putInt(reg_norm[i]); + try { + for (size_t i = 0; i < 16; i++) + serializer.putInt(reg_norm[i]); - serializer.putInt(znFlags); - serializer.putInt(cFlag); - serializer.putInt(vFlag); - serializer.putLong(myCycleCounter); + serializer.putInt(znFlags); + serializer.putInt(cFlag); + serializer.putInt(vFlag); + serializer.putLong(myCycleCounter); + } + catch (...) { + cerr << "ERROR: failed to save cortex M0\n"; + return false; + } - for (size_t i = 0; i < myNextRegionIndex; i++) - myRegions[i].save(serializer); + return true; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CortexM0::load(Serializer& serializer) +{ + return false; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void CortexM0::saveDirtyRegions(Serializer& serializer) const +{ +for (size_t i = 0; i < myNextRegionIndex; i++) + myRegions[i].serialize(serializer); +} + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CortexM0::MemoryRegion::reset() { diff --git a/src/emucore/CortexM0.hxx b/src/emucore/CortexM0.hxx index 682717032..52e709b81 100644 --- a/src/emucore/CortexM0.hxx +++ b/src/emucore/CortexM0.hxx @@ -25,11 +25,12 @@ #include +#include "Serializable.hxx" #include "bspf.hxx" class Serializer; -class CortexM0 +class CortexM0: public Serializable { public: using err_t = uInt64; @@ -118,7 +119,9 @@ class CortexM0 CortexM0& mapDefault(BusTransactionDelegate* delegate); - void save(Serializer& serializer) const; + bool save(Serializer& serializer) const override; + bool load(Serializer& serializer) override; + void saveDirtyRegions(Serializer& serialized) const; CortexM0& reset(); CortexM0& setPc(uInt32 pc); @@ -181,7 +184,7 @@ class CortexM0 > access; void reset(); - void save(Serializer& serializer) const; + void serialize(Serializer& serializer) const; private: MemoryRegion(const MemoryRegion&) = delete; diff --git a/src/emucore/elf/BusTransactionQueue.cxx b/src/emucore/elf/BusTransactionQueue.cxx index a0695342c..7c0833421 100644 --- a/src/emucore/elf/BusTransactionQueue.cxx +++ b/src/emucore/elf/BusTransactionQueue.cxx @@ -66,18 +66,32 @@ BusTransactionQueue& BusTransactionQueue::reset() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void BusTransactionQueue::save(Serializer& serializer) const +bool BusTransactionQueue::save(Serializer& serializer) const { - serializer.putInt(myQueueSize); - serializer.putShort(myNextInjectAddress); - serializer.putLong(myTimestamp); + try { + serializer.putInt(myQueueSize); + serializer.putShort(myNextInjectAddress); + serializer.putLong(myTimestamp); - for (size_t i = 0; i < myQueueSize; i++) - myQueue[(myQueueNext + i) % myQueueCapacity].save(serializer); + for (size_t i = 0; i < myQueueSize; i++) + myQueue[(myQueueNext + i) % myQueueCapacity].serialize(serializer); + } + catch (...) { + cerr << "ERROR: failed to save bus transaction queue\n"; + return false; + } + + return true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void BusTransactionQueue::Transaction::save(Serializer& serializer) const +bool BusTransactionQueue::load(Serializer& serializer) +{ + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void BusTransactionQueue::Transaction::serialize(Serializer& serializer) const { serializer.putShort(address); serializer.putShort(mask); diff --git a/src/emucore/elf/BusTransactionQueue.hxx b/src/emucore/elf/BusTransactionQueue.hxx index b0a4d6995..3f4bace5f 100644 --- a/src/emucore/elf/BusTransactionQueue.hxx +++ b/src/emucore/elf/BusTransactionQueue.hxx @@ -18,11 +18,12 @@ #ifndef BUS_TRANSACTION_QUEUE #define BUS_TRANSACTION_QUEUE +#include "Serializable.hxx" #include "bspf.hxx" class Serializer; -class BusTransactionQueue { +class BusTransactionQueue: public Serializable { public: struct Transaction { static Transaction transactionYield(uInt16 address, uInt64 timestamp, uInt16 mask); @@ -36,7 +37,7 @@ class BusTransactionQueue { uInt64 timestamp{0}; bool yield{false}; - void save(Serializer& serializer) const; + void serialize(Serializer& serializer) const; }; public: @@ -45,7 +46,8 @@ class BusTransactionQueue { BusTransactionQueue& reset(); - void save(Serializer& serializer) const; + bool save(Serializer& serializer) const override; + bool load(Serializer& serializer) override; BusTransactionQueue& setNextInjectAddress(uInt16 address); uInt16 getNextInjectAddress() const; diff --git a/src/emucore/elf/VcsLib.cxx b/src/emucore/elf/VcsLib.cxx index 9a5af6c3c..83f193542 100644 --- a/src/emucore/elf/VcsLib.cxx +++ b/src/emucore/elf/VcsLib.cxx @@ -112,18 +112,31 @@ VcsLib::VcsLib(BusTransactionQueue& transactionQueue) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void VcsLib::save(Serializer& serializer) const +bool VcsLib::save(Serializer& serializer) const { - serializer.putByte(myStuffMaskA); - serializer.putByte(myStuffMaskX); - serializer.putByte(myStuffMaskY); - serializer.putBool(myIsWaitingForRead); - serializer.putShort(myWaitingForReadAddress); - serializer.putShort(myCurrentAddress); - serializer.putBool(myCurrentValue); + try { + serializer.putByte(myStuffMaskA); + serializer.putByte(myStuffMaskX); + serializer.putByte(myStuffMaskY); + serializer.putBool(myIsWaitingForRead); + serializer.putShort(myWaitingForReadAddress); + serializer.putShort(myCurrentAddress); + serializer.putBool(myCurrentValue); - if (!myRand.save(serializer)) - throw runtime_error("failed to save RNG"); + if (!myRand.save(serializer)) return false; + } + catch (...) { + cerr << "ERROR: failed to save vcslib\n"; + return false; + } + + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool VcsLib::load(Serializer& serializer) +{ + return false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/elf/VcsLib.hxx b/src/emucore/elf/VcsLib.hxx index d091d8868..22140cab3 100644 --- a/src/emucore/elf/VcsLib.hxx +++ b/src/emucore/elf/VcsLib.hxx @@ -22,15 +22,17 @@ #include "Random.hxx" #include "CortexM0.hxx" #include "BusTransactionQueue.hxx" +#include "Serializable.hxx" class Serializer; -class VcsLib: public CortexM0::BusTransactionDelegate { +class VcsLib: public CortexM0::BusTransactionDelegate, public Serializable { public: explicit VcsLib(BusTransactionQueue& transactionQueue); ~VcsLib() override = default; - void save(Serializer& serializer) const; + bool save(Serializer& serializer) const override; + bool load(Serializer& serializer) override; void reset();