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.DmaLength, 8);
s.StreamArray(_state.SelectedBanks, 4);
s.Stream(_sdd1Mmc.get());
}
uint8_t Sdd1::Peek(uint32_t addr)

View file

@ -64,6 +64,11 @@ uint8_t SDD1_IM::getCodeword(uint8_t code_len)
return codeword;
}
void SDD1_IM::Serialize(Serializer &s)
{
s.Stream(_readAddr, bit_count);
}
SDD1_GCD::SDD1_GCD(SDD1_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;
}
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");
}
void SDD1_OL::Serialize(Serializer &s)
{
s.Stream(bitplanesInfo);
s.StreamArray(_regs, 3);
}
void Sdd1Decomp::Init(Sdd1Mmc *mmc, uint32_t readAddr)
{
uint8_t firstByte = mmc->ReadRom(readAddr);
@ -434,6 +463,22 @@ uint8_t Sdd1Decomp::GetDecompressedByte()
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() :
GCD(&IM),
BG0(&GCD, 0), BG1(&GCD, 1), BG2(&GCD, 2), BG3(&GCD, 3),

View file

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

View file

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

View file

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