Naomi: save cart state into save state

This commit is contained in:
Flyinghead 2018-11-06 17:54:54 +01:00
parent eff998dc53
commit e93260634d
8 changed files with 112 additions and 25 deletions

View File

@ -126,3 +126,33 @@ u32 M1Cartridge::get_decrypted_32b()
u32 res = swapped_key ^ (((b ^ d) << 24) | ((a ^ c) << 16) | (b << 8) | a);
return res;
}
void M1Cartridge::Serialize(void** data, unsigned int* total_size) {
REICAST_S(buffer);
REICAST_S(dict);
REICAST_S(hist);
REICAST_S(avail_val);
REICAST_S(rom_cur_address);
REICAST_S(buffer_actual_size);
REICAST_S(avail_bits);
REICAST_S(stream_ended);
REICAST_S(has_history);
REICAST_S(encryption);
NaomiCartridge::Serialize(data, total_size);
}
void M1Cartridge::Unserialize(void** data, unsigned int* total_size) {
REICAST_US(buffer);
REICAST_US(dict);
REICAST_US(hist);
REICAST_US(avail_val);
REICAST_US(rom_cur_address);
REICAST_US(buffer_actual_size);
REICAST_US(avail_bits);
REICAST_US(stream_ended);
REICAST_US(has_history);
REICAST_US(encryption);
NaomiCartridge::Unserialize(data, total_size);
}

View File

@ -15,14 +15,14 @@ class M1Cartridge : public NaomiCartridge
public:
M1Cartridge(u32 size);
virtual u32 ReadMem(u32 address, u32 size)
virtual u32 ReadMem(u32 address, u32 size) override
{
if ((address & 0xff) == 0x14)
return actel_id;
return NaomiCartridge::ReadMem(address, size);
}
virtual void* GetDmaPtr(u32 &size)
virtual void* GetDmaPtr(u32 &size) override
{
if (encryption)
{
@ -33,12 +33,14 @@ public:
return NaomiCartridge::GetDmaPtr(size);
}
virtual void AdvancePtr(u32 size);
virtual void AdvancePtr(u32 size) override;
virtual void Serialize(void** data, unsigned int* total_size) override;
virtual void Unserialize(void** data, unsigned int* total_size) override;
void setActelId(u32 actel_id) { this->actel_id = actel_id; }
protected:
virtual void DmaOffsetChanged(u32 dma_offset)
virtual void DmaOffsetChanged(u32 dma_offset) override
{
rom_cur_address = dma_offset & 0x1fffffff;
if ((dma_offset & 0x20000000) == 0 && rom_cur_address < RomSize)

View File

@ -287,3 +287,32 @@ std::string M4Cartridge::GetGameId()
game_id.pop_back();
return game_id;
}
void M4Cartridge::Serialize(void** data, unsigned int* total_size)
{
REICAST_S(buffer);
REICAST_S(rom_cur_address);
REICAST_S(buffer_actual_size);
REICAST_S(iv);
REICAST_S(counter);
REICAST_S(encryption);
REICAST_S(cfi_mode);
REICAST_S(xfer_ready);
NaomiCartridge::Serialize(data, total_size);
}
void M4Cartridge::Unserialize(void** data, unsigned int* total_size)
{
REICAST_US(buffer);
REICAST_US(rom_cur_address);
REICAST_US(buffer_actual_size);
REICAST_US(iv);
REICAST_US(counter);
REICAST_US(encryption);
REICAST_US(cfi_mode);
REICAST_US(xfer_ready);
NaomiCartridge::Unserialize(data, total_size);
}

View File

@ -39,6 +39,8 @@ public:
virtual void* GetDmaPtr(u32 &size) override;
virtual void AdvancePtr(u32 size) override;
virtual std::string GetGameId() override;
virtual void Serialize(void** data, unsigned int* total_size) override;
virtual void Unserialize(void** data, unsigned int* total_size) override;
void SetM4Id(u16 m4id) { this->m4id = m4id; }
void SetKeyData(u8 *key_data)

View File

@ -38,21 +38,3 @@ extern u32 reg_dimm_4c; //status/control reg ?
extern bool NaomiDataRead;
extern u32 naomi_updates;

View File

@ -952,6 +952,24 @@ void NaomiCartridge::WriteMem(u32 address, u32 data, u32 size)
EMUERROR("naomi?WTF? WriteMem: %X <= %X, %d", address, data, size);
}
void NaomiCartridge::Serialize(void** data, unsigned int* total_size)
{
REICAST_S(RomPioOffset);
REICAST_S(RomPioAutoIncrement);
REICAST_S(DmaOffset);
REICAST_S(DmaCount);
Cartridge::Serialize(data, total_size);
}
void NaomiCartridge::Unserialize(void** data, unsigned int* total_size)
{
REICAST_US(RomPioOffset);
REICAST_US(RomPioAutoIncrement);
REICAST_US(DmaOffset);
REICAST_US(DmaCount);
Cartridge::Unserialize(data, total_size);
}
bool M2Cartridge::Read(u32 offset, u32 size, void* dst)
{
if (offset & 0x40000000)
@ -1009,3 +1027,13 @@ u16 M2Cartridge::ReadCipheredData(u32 offset)
return RomPtr[2 * offset + 1] | (RomPtr[2 * offset] << 8);
}
void M2Cartridge::Serialize(void** data, unsigned int* total_size) {
REICAST_S(naomi_cart_ram);
NaomiCartridge::Serialize(data, total_size);
}
void M2Cartridge::Unserialize(void** data, unsigned int* total_size) {
REICAST_US(naomi_cart_ram);
NaomiCartridge::Unserialize(data, total_size);
}

View File

@ -19,6 +19,8 @@ public:
virtual void* GetDmaPtr(u32 &size) = 0;
virtual void AdvancePtr(u32 size) = 0;
virtual std::string GetGameId();
virtual void Serialize(void **data, unsigned int *total_size) {}
virtual void Unserialize(void **data, unsigned int *total_size) {}
protected:
u8* RomPtr;
@ -34,6 +36,8 @@ public:
virtual void WriteMem(u32 address, u32 data, u32 size);
virtual void* GetDmaPtr(u32 &size);
virtual void AdvancePtr(u32 size);
virtual void Serialize(void** data, unsigned int* total_size);
virtual void Unserialize(void** data, unsigned int* total_size);
void SetKey(u32 key) { this->key = key; }
@ -62,6 +66,8 @@ public:
virtual bool Read(u32 offset, u32 size, void* dst);
virtual bool Write(u32 offset, u32 size, u32 data);
u16 ReadCipheredData(u32 offset);
virtual void Serialize(void** data, unsigned int* total_size);
virtual void Unserialize(void** data, unsigned int* total_size);
private:
u8 naomi_cart_ram[64 * 1024];

View File

@ -22,6 +22,7 @@
#include "rend/gles/gles.h"
#include "hw/sh4/dyna/blockmanager.h"
#include "hw/sh4/dyna/ngen.h"
#include "hw/naomi/naomi_cart.h"
/*
* search for "maybe" to find items that were left out that may be needed
@ -32,7 +33,8 @@ extern "C" void DYNACALL TAWriteSQ(u32 address,u8* sqb);
enum serialize_version_enum {
V1,
V2,
V3
V3,
V4
} ;
//./core/hw/arm7/arm_mem.cpp
@ -789,7 +791,7 @@ bool dc_serialize(void **data, unsigned int *total_size)
{
int i = 0;
int j = 0;
serialize_version_enum version = V3 ;
serialize_version_enum version = V4 ;
*total_size = 0 ;
@ -1155,6 +1157,9 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(settings.dreamcast.cable);
REICAST_S(settings.dreamcast.region);
if (CurrentCartridge != NULL)
CurrentCartridge->Serialize(data, total_size);
return true ;
}
@ -1167,7 +1172,7 @@ bool dc_unserialize(void **data, unsigned int *total_size)
*total_size = 0 ;
REICAST_US(version) ;
if (version != V3)
if (version != V4)
{
fprintf(stderr, "Save State version not supported: %d\n", version);
return false;
@ -1551,6 +1556,9 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(settings.dreamcast.cable);
REICAST_US(settings.dreamcast.region);
if (CurrentCartridge != NULL)
CurrentCartridge->Unserialize(data, total_size);
return true ;
}
#endif