SDD1: Added decompressor state to save states

This commit is contained in:
Sour 2019-10-22 20:28:44 -04:00
parent aa3975aa1e
commit c8f6822ed7
5 changed files with 75 additions and 9 deletions

View file

@ -101,6 +101,7 @@ void Sdd1::Serialize(Serializer &s)
s.StreamArray(_state.DmaAddress, 8); s.StreamArray(_state.DmaAddress, 8);
s.StreamArray(_state.DmaLength, 8); s.StreamArray(_state.DmaLength, 8);
s.StreamArray(_state.SelectedBanks, 4); s.StreamArray(_state.SelectedBanks, 4);
s.Stream(_sdd1Mmc.get());
} }
uint8_t Sdd1::Peek(uint32_t addr) uint8_t Sdd1::Peek(uint32_t addr)

View file

@ -64,6 +64,11 @@ uint8_t SDD1_IM::getCodeword(uint8_t code_len)
return codeword; return codeword;
} }
void SDD1_IM::Serialize(Serializer &s)
{
s.Stream(_readAddr, bit_count);
}
SDD1_GCD::SDD1_GCD(SDD1_IM *associatedIM) : SDD1_GCD::SDD1_GCD(SDD1_IM *associatedIM) :
IM(associatedIM) IM(associatedIM)
{ {
@ -165,6 +170,11 @@ uint8_t SDD1_BG::getBit(bool *endOfRun)
} }
void SDD1_BG::Serialize(Serializer &s)
{
s.Stream(MPScount, LPSind);
}
///////////////////////////////////////////////// /////////////////////////////////////////////////
@ -264,6 +274,13 @@ uint8_t SDD1_PEM::getBit(uint8_t context)
return bit ^ currentMPS; return bit ^ currentMPS;
} }
void SDD1_PEM::Serialize(Serializer &s)
{
for(int i = 0; i < 32; i++) {
s.Stream(contextInfo[i].status, contextInfo[i].MPS);
}
}
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
@ -347,6 +364,12 @@ uint8_t SDD1_CM::getBit(void)
} }
void SDD1_CM::Serialize(Serializer &s)
{
s.Stream(bitplanesInfo, contextBitsInfo, bit_number, currBitplane);
s.StreamArray(prevBitplaneBits, 8);
}
////////////////////////////////////////////////// //////////////////////////////////////////////////
@ -412,6 +435,12 @@ uint8_t SDD1_OL::decompressByte()
throw std::runtime_error("SDD1_OL::decompressByte: Unexpected value"); throw std::runtime_error("SDD1_OL::decompressByte: Unexpected value");
} }
void SDD1_OL::Serialize(Serializer &s)
{
s.Stream(bitplanesInfo);
s.StreamArray(_regs, 3);
}
void Sdd1Decomp::Init(Sdd1Mmc *mmc, uint32_t readAddr) void Sdd1Decomp::Init(Sdd1Mmc *mmc, uint32_t readAddr)
{ {
uint8_t firstByte = mmc->ReadRom(readAddr); uint8_t firstByte = mmc->ReadRom(readAddr);
@ -434,6 +463,22 @@ uint8_t Sdd1Decomp::GetDecompressedByte()
return OL.decompressByte(); return OL.decompressByte();
} }
void Sdd1Decomp::Serialize(Serializer &s)
{
s.Stream(&IM);
s.Stream(&BG0);
s.Stream(&BG1);
s.Stream(&BG2);
s.Stream(&BG3);
s.Stream(&BG4);
s.Stream(&BG5);
s.Stream(&BG6);
s.Stream(&BG7);
s.Stream(&PEM);
s.Stream(&CM);
s.Stream(&OL);
}
Sdd1Decomp::Sdd1Decomp() : Sdd1Decomp::Sdd1Decomp() :
GCD(&IM), GCD(&IM),
BG0(&GCD, 0), BG1(&GCD, 1), BG2(&GCD, 2), BG3(&GCD, 3), BG0(&GCD, 0), BG1(&GCD, 1), BG2(&GCD, 2), BG3(&GCD, 3),

View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "../Utilities/ISerializable.h"
/************************************************************************ /************************************************************************
@ -33,7 +34,7 @@ understood.
class Sdd1Mmc; class Sdd1Mmc;
class SDD1_IM class SDD1_IM : public ISerializable
{ //Input Manager { //Input Manager
Sdd1Mmc* _sdd1Mmc; Sdd1Mmc* _sdd1Mmc;
public: public:
@ -41,10 +42,11 @@ public:
void prepareDecomp(Sdd1Mmc *mmc, uint32_t readAddr); void prepareDecomp(Sdd1Mmc *mmc, uint32_t readAddr);
uint8_t getCodeword(const uint8_t code_len); uint8_t getCodeword(const uint8_t code_len);
void Serialize(Serializer &s) override;
private: private:
uint32_t _readAddr; uint32_t _readAddr;
uint8_t bit_count; uint8_t bit_count;
}; };
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
@ -65,7 +67,7 @@ private:
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
class SDD1_BG class SDD1_BG : public ISerializable
{ // Bits Generator { // Bits Generator
public: public:
@ -73,6 +75,8 @@ public:
void prepareDecomp(void); void prepareDecomp(void);
uint8_t getBit(bool *endOfRun); uint8_t getBit(bool *endOfRun);
void Serialize(Serializer &s) override;
private: private:
const uint8_t code_num; const uint8_t code_num;
uint8_t MPScount; uint8_t MPScount;
@ -84,7 +88,7 @@ private:
//////////////////////////////////////////////// ////////////////////////////////////////////////
class SDD1_PEM class SDD1_PEM : public ISerializable
{ //Probability Estimation Module { //Probability Estimation Module
public: public:
@ -95,6 +99,8 @@ public:
void prepareDecomp(void); void prepareDecomp(void);
uint8_t getBit(uint8_t context); uint8_t getBit(uint8_t context);
void Serialize(Serializer &s) override;
private: private:
struct state struct state
{ {
@ -115,7 +121,7 @@ private:
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
class SDD1_CM class SDD1_CM : public ISerializable
{ //Context Model { //Context Model
public: public:
@ -123,6 +129,8 @@ public:
void prepareDecomp(uint8_t firstByte); void prepareDecomp(uint8_t firstByte);
uint8_t getBit(void); uint8_t getBit(void);
void Serialize(Serializer &s) override;
private: private:
uint8_t bitplanesInfo; uint8_t bitplanesInfo;
uint8_t contextBitsInfo; uint8_t contextBitsInfo;
@ -136,7 +144,7 @@ private:
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
class SDD1_OL class SDD1_OL : public ISerializable
{ //Output Logic { //Output Logic
public: public:
@ -144,6 +152,8 @@ public:
void prepareDecomp(uint8_t firstByte); void prepareDecomp(uint8_t firstByte);
uint8_t decompressByte(); uint8_t decompressByte();
void Serialize(Serializer &s) override;
private: private:
uint8_t bitplanesInfo; uint8_t bitplanesInfo;
uint8_t _regs[3]; uint8_t _regs[3];
@ -151,13 +161,15 @@ private:
}; };
class Sdd1Decomp class Sdd1Decomp : public ISerializable
{ {
public: public:
Sdd1Decomp(); Sdd1Decomp();
void Init(Sdd1Mmc *mmc, uint32_t readAddr); void Init(Sdd1Mmc *mmc, uint32_t readAddr);
uint8_t GetDecompressedByte(); uint8_t GetDecompressedByte();
void Serialize(Serializer &s) override;
private: private:
SDD1_IM IM; SDD1_IM IM;
SDD1_GCD GCD; SDD1_GCD GCD;

View file

@ -82,3 +82,8 @@ AddressInfo Sdd1Mmc::GetAbsoluteAddress(uint32_t address)
{ {
return GetHandler(address)->GetAbsoluteAddress(address); return GetHandler(address)->GetAbsoluteAddress(address);
} }
void Sdd1Mmc::Serialize(Serializer &s)
{
s.Stream(&_decompressor);
}

View file

@ -3,10 +3,11 @@
#include "IMemoryHandler.h" #include "IMemoryHandler.h"
#include "Sdd1Types.h" #include "Sdd1Types.h"
#include "Sdd1Decomp.h" #include "Sdd1Decomp.h"
#include "../Utilities/ISerializable.h"
class BaseCartridge; class BaseCartridge;
class Sdd1Mmc : public IMemoryHandler class Sdd1Mmc : public IMemoryHandler, public ISerializable
{ {
private: private:
Sdd1State* _state; Sdd1State* _state;
@ -27,4 +28,6 @@ public:
virtual void PeekBlock(uint8_t * output) override; virtual void PeekBlock(uint8_t * output) override;
virtual void Write(uint32_t addr, uint8_t value) override; virtual void Write(uint32_t addr, uint8_t value) override;
virtual AddressInfo GetAbsoluteAddress(uint32_t address) override; virtual AddressInfo GetAbsoluteAddress(uint32_t address) override;
void Serialize(Serializer &s) override;
}; };