From 514d6c88ff0b9d5d5b683f8cba924d85611a2b63 Mon Sep 17 00:00:00 2001 From: bladeoner Date: Tue, 24 Aug 2021 16:48:02 +0200 Subject: [PATCH] Snes9x - Add support for mapping more than 128KByte SRAM (#975) --- source/snes9x/getset.h | 22 +++++++++++----------- source/snes9x/memmap.cpp | 18 +++++++++++------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/source/snes9x/getset.h b/source/snes9x/getset.h index dfec3f2..ec55ea9 100644 --- a/source/snes9x/getset.h +++ b/source/snes9x/getset.h @@ -100,7 +100,7 @@ inline uint8 S9xGetByte (uint32 Address) case CMemory::MAP_HIROM_SRAM: case CMemory::MAP_RONLY_SRAM: - byte = *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + byte = *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)); addCyclesInMemoryAccess; return (byte); @@ -241,10 +241,10 @@ inline uint16 S9xGetWord (uint32 Address, enum s9xwrap_t w = WRAP_NONE) case CMemory::MAP_HIROM_SRAM: case CMemory::MAP_RONLY_SRAM: if (Memory.SRAMMask >= MEMMAP_MASK) - word = READ_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + word = READ_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)); else - word = (*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) | - (*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) << 8)); + word = (*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)) | + (*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0x1f0000) >> 3)) & Memory.SRAMMask)) << 8)); addCyclesInMemoryAccess_x2; return (word); @@ -368,7 +368,7 @@ inline void S9xSetByte (uint8 Byte, uint32 Address) case CMemory::MAP_HIROM_SRAM: if (Memory.SRAMMask) { - *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)) = Byte; CPU.SRAMModified = TRUE; } @@ -555,11 +555,11 @@ inline void S9xSetWord (uint16 Word, uint32 Address, enum s9xwrap_t w = WRAP_NON if (Memory.SRAMMask) { if (Memory.SRAMMask >= MEMMAP_MASK) - WRITE_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask), Word); + WRITE_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask), Word); else { - *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = (uint8) Word; - *(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) = Word >> 8; + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)) = (uint8) Word; + *(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0x1f0000) >> 3)) & Memory.SRAMMask)) = Word >> 8; } CPU.SRAMModified = TRUE; @@ -730,7 +730,7 @@ inline void S9xSetPCBase (uint32 Address) if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) CPU.PCBase = NULL; else - CPU.PCBase = Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff); + CPU.PCBase = Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff); return; case CMemory::MAP_BWRAM: @@ -786,7 +786,7 @@ inline uint8 * S9xGetBasePointer (uint32 Address) case CMemory::MAP_HIROM_SRAM: if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) return (NULL); - return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff)); + return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff)); case CMemory::MAP_BWRAM: return (Memory.BWRAM - 0x6000 - (Address & 0x8000)); @@ -831,7 +831,7 @@ inline uint8 * S9xGetMemPointer (uint32 Address) case CMemory::MAP_HIROM_SRAM: if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK) return (NULL); - return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)); + return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0x1f0000) >> 3)) & Memory.SRAMMask)); case CMemory::MAP_BWRAM: return (Memory.BWRAM - 0x6000 + (Address & 0x7fff)); diff --git a/source/snes9x/memmap.cpp b/source/snes9x/memmap.cpp index 46540f0..d1da637 100644 --- a/source/snes9x/memmap.cpp +++ b/source/snes9x/memmap.cpp @@ -1947,7 +1947,7 @@ void CMemory::ClearSRAM (bool8 onlyNonSavedSRAM) if (!(Settings.SuperFX && ROMType < 0x15) && !(Settings.SA1 && ROMType == 0x34)) // can have SRAM return; - memset(SRAM, SNESGameFixes.SRAMInitialValue, 0x20000); + memset(SRAM, SNESGameFixes.SRAMInitialValue, sizeof(SRAM)); } bool8 CMemory::LoadSRAM (const char *filename) @@ -1982,15 +1982,17 @@ bool8 CMemory::LoadSRAM (const char *filename) } size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; - if (size > 0x20000) - size = 0x20000; + if (LoROM) + size = size < 0x70000 ? size : 0x70000; + else if (HiROM) + size = size < 0x40000 ? size : 0x40000; if (size) { file = fopen(sramName, "rb"); if (file) { - len = fread((char *) SRAM, 1, 0x20000, file); + len = fread((char *) SRAM, 1, size, file); fclose(file); if (len - size == 512) memmove(SRAM, SRAM + 512, size); @@ -2014,7 +2016,7 @@ bool8 CMemory::LoadSRAM (const char *filename) file = fopen(path, "rb"); if (file) { - len = fread((char *) SRAM, 1, 0x20000, file); + len = fread((char *) SRAM, 1, size, file); fclose(file); if (len - size == 512) memmove(SRAM, SRAM + 512, size); @@ -2071,8 +2073,10 @@ bool8 CMemory::SaveSRAM (const char *filename) } size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; - if (size > 0x20000) - size = 0x20000; + if (LoROM) + size = size < 0x70000 ? size : 0x70000; + else if (HiROM) + size = size < 0x40000 ? size : 0x40000; if (size) {