diff --git a/core/hw/naomi/naomi_cart.cpp b/core/hw/naomi/naomi_cart.cpp index 5c4fc22aa..ab9b128b3 100644 --- a/core/hw/naomi/naomi_cart.cpp +++ b/core/hw/naomi/naomi_cart.cpp @@ -1023,9 +1023,26 @@ bool M2Cartridge::Read(u32 offset, u32 size, void* dst) EMUERROR("Invalid read @ %08x\n", offset); return false; } + else if (!(RomPioOffset & 0x20000000)) + { + // 4MB mode + offset = (offset & 0x103fffff) | ((offset & 0x07c00000) << 1); + } return NaomiCartridge::Read(offset, size, dst); } +void* M2Cartridge::GetDmaPtr(u32& size) +{ + if (RomPioOffset & 0x20000000) + return NaomiCartridge::GetDmaPtr(size); + + // 4MB mode + u32 offset4mb = (DmaOffset & 0x103fffff) | ((DmaOffset & 0x07c00000) << 1); + size = min(min(size, 0x400000 - (offset4mb & 0x3FFFFF)), RomSize - offset4mb); + + return GetPtr(offset4mb, size); +} + bool M2Cartridge::Write(u32 offset, u32 size, u32 data) { if (offset & 0x40000000) diff --git a/core/hw/naomi/naomi_cart.h b/core/hw/naomi/naomi_cart.h index 860e33ef0..19f4314ff 100644 --- a/core/hw/naomi/naomi_cart.h +++ b/core/hw/naomi/naomi_cart.h @@ -35,12 +35,12 @@ class NaomiCartridge : public Cartridge public: NaomiCartridge(u32 size) : Cartridge(size), RomPioOffset(0), RomPioAutoIncrement(0), DmaOffset(0), DmaCount(0xffff) {} - virtual u32 ReadMem(u32 address, u32 size); - 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); + virtual u32 ReadMem(u32 address, u32 size) override; + virtual void WriteMem(u32 address, u32 data, u32 size) override; + virtual void* GetDmaPtr(u32 &size) override; + 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 SetKey(u32 key) override { this->key = key; } @@ -66,11 +66,12 @@ class M2Cartridge : public NaomiCartridge public: M2Cartridge(u32 size) : NaomiCartridge(size) {} - virtual bool Read(u32 offset, u32 size, void* dst); - virtual bool Write(u32 offset, u32 size, u32 data); + virtual bool Read(u32 offset, u32 size, void* dst) override; + virtual bool Write(u32 offset, u32 size, u32 data) override; u16 ReadCipheredData(u32 offset); - virtual void Serialize(void** data, unsigned int* total_size); - virtual void Unserialize(void** data, unsigned int* total_size); + virtual void Serialize(void** data, unsigned int* total_size) override; + virtual void Unserialize(void** data, unsigned int* total_size) override; + virtual void* GetDmaPtr(u32& size) override; private: u8 naomi_cart_ram[64 * 1024];