Naomi: fix M2 carts 4MB addressing mode

This commit is contained in:
Flyinghead 2018-11-14 20:50:22 +01:00
parent b5e6d7e54a
commit 074026842e
2 changed files with 28 additions and 10 deletions

View File

@ -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)

View File

@ -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];