Naomi: save cart state into save state
This commit is contained in:
parent
eff998dc53
commit
e93260634d
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -38,21 +38,3 @@ extern u32 reg_dimm_4c; //status/control reg ?
|
|||
|
||||
extern bool NaomiDataRead;
|
||||
extern u32 naomi_updates;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue