Naomi: fix M2 carts 4MB addressing mode
This commit is contained in:
parent
b5e6d7e54a
commit
074026842e
|
@ -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)
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue