diff --git a/core/hw/naomi/m1cartridge.cpp b/core/hw/naomi/m1cartridge.cpp index 4e04b30f6..9313196bf 100644 --- a/core/hw/naomi/m1cartridge.cpp +++ b/core/hw/naomi/m1cartridge.cpp @@ -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); +} diff --git a/core/hw/naomi/m1cartridge.h b/core/hw/naomi/m1cartridge.h index 5a7e4ff4c..3c5b5d28d 100644 --- a/core/hw/naomi/m1cartridge.h +++ b/core/hw/naomi/m1cartridge.h @@ -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) diff --git a/core/hw/naomi/m4cartridge.cpp b/core/hw/naomi/m4cartridge.cpp index ceee06a1d..53b2a7d52 100644 --- a/core/hw/naomi/m4cartridge.cpp +++ b/core/hw/naomi/m4cartridge.cpp @@ -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); +} + diff --git a/core/hw/naomi/m4cartridge.h b/core/hw/naomi/m4cartridge.h index 5505c406f..e1ca6fc17 100644 --- a/core/hw/naomi/m4cartridge.h +++ b/core/hw/naomi/m4cartridge.h @@ -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) diff --git a/core/hw/naomi/naomi.h b/core/hw/naomi/naomi.h index 32af05ad0..8781f034b 100644 --- a/core/hw/naomi/naomi.h +++ b/core/hw/naomi/naomi.h @@ -38,21 +38,3 @@ extern u32 reg_dimm_4c; //status/control reg ? extern bool NaomiDataRead; extern u32 naomi_updates; - - - - - - - - - - - - - - - - - - diff --git a/core/hw/naomi/naomi_cart.cpp b/core/hw/naomi/naomi_cart.cpp index fb121a53c..0279696ff 100644 --- a/core/hw/naomi/naomi_cart.cpp +++ b/core/hw/naomi/naomi_cart.cpp @@ -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); +} diff --git a/core/hw/naomi/naomi_cart.h b/core/hw/naomi/naomi_cart.h index 180cd0d70..f31cbbd25 100644 --- a/core/hw/naomi/naomi_cart.h +++ b/core/hw/naomi/naomi_cart.h @@ -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]; diff --git a/core/serialize.cpp b/core/serialize.cpp index 689c62e87..9b6c6a548 100644 --- a/core/serialize.cpp +++ b/core/serialize.cpp @@ -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