diff --git a/Assets/dll/libsnes.wbx.zst b/Assets/dll/libsnes.wbx.zst index 7efa9c70ee..8ea08c0f05 100644 Binary files a/Assets/dll/libsnes.wbx.zst and b/Assets/dll/libsnes.wbx.zst differ diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_Enums.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_Enums.cs index f2e519a461..6fa1dcd33c 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_Enums.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_Enums.cs @@ -185,6 +185,7 @@ SGB_RTC = 7, SGB_WRAM = 8, SGB_HRAM = 9, + SA1_IRAM = 10, WRAM = 100, APURAM = 101, diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs index f612807875..fbd6d418c5 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs @@ -37,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES MakeMemoryDomain("WRAM", LibsnesApi.SNES_MEMORY.WRAM, MemoryDomain.Endian.Little); MakeMemoryDomain("CARTROM", LibsnesApi.SNES_MEMORY.CARTRIDGE_ROM, MemoryDomain.Endian.Little, byteSize: 2); //there are signs this doesnt work on SGB? MakeMemoryDomain("CARTRAM", LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM, MemoryDomain.Endian.Little, byteSize: 2); + MakeMemoryDomain("SA1 IRAM", LibsnesApi.SNES_MEMORY.SA1_IRAM, MemoryDomain.Endian.Little, byteSize: 2); MakeMemoryDomain("VRAM", LibsnesApi.SNES_MEMORY.VRAM, MemoryDomain.Endian.Little, byteSize: 2); MakeMemoryDomain("OAM", LibsnesApi.SNES_MEMORY.OAM, MemoryDomain.Endian.Little, byteSize: 2); MakeMemoryDomain("CGRAM", LibsnesApi.SNES_MEMORY.CGRAM, MemoryDomain.Endian.Little, byteSize: 2); diff --git a/waterbox/libsnes/bsnes/snes/chip/sa1/sa1.cpp b/waterbox/libsnes/bsnes/snes/chip/sa1/sa1.cpp index 0f086e49f0..aeccb144a8 100644 --- a/waterbox/libsnes/bsnes/snes/chip/sa1/sa1.cpp +++ b/waterbox/libsnes/bsnes/snes/chip/sa1/sa1.cpp @@ -323,7 +323,7 @@ void SA1::reset() { mmio.overflow = false; } -SA1::SA1() : iram(2048) { +SA1::SA1() : iram(2048, "SA1_IRAM") { } } diff --git a/waterbox/libsnes/bsnes/snes/memory/memory-inline.hpp b/waterbox/libsnes/bsnes/snes/memory/memory-inline.hpp index 6fce1b1d47..dc053000a5 100644 --- a/waterbox/libsnes/bsnes/snes/memory/memory-inline.hpp +++ b/waterbox/libsnes/bsnes/snes/memory/memory-inline.hpp @@ -12,8 +12,11 @@ void StaticRAM::write(unsigned addr, uint8 n) { data_[addr] = n; } uint8& StaticRAM::operator[](unsigned addr) { return data_[addr]; } const uint8& StaticRAM::operator[](unsigned addr) const { return data_[addr]; } -StaticRAM::StaticRAM(unsigned n) : size_(n) { data_ = new uint8[size_]; } -StaticRAM::~StaticRAM() { delete[] data_; } +StaticRAM::StaticRAM(unsigned n, const char* name) : size_(n) { + if(name) data_ = (uint8*)interface()->allocSharedMemory(name, size_); + else data_ = new uint8[size_](); +} +StaticRAM::~StaticRAM() { abort(); } //MappedRAM diff --git a/waterbox/libsnes/bsnes/snes/memory/memory.hpp b/waterbox/libsnes/bsnes/snes/memory/memory.hpp index bc908e3ecb..c7facd79b1 100644 --- a/waterbox/libsnes/bsnes/snes/memory/memory.hpp +++ b/waterbox/libsnes/bsnes/snes/memory/memory.hpp @@ -13,7 +13,7 @@ struct StaticRAM : Memory { inline uint8& operator[](unsigned addr); inline const uint8& operator[](unsigned addr) const; - inline StaticRAM(unsigned size); + inline StaticRAM(unsigned size, const char* name = NULL); inline ~StaticRAM(); private: diff --git a/waterbox/libsnes/bsnes/target-libsnes/libsnes.cpp b/waterbox/libsnes/bsnes/target-libsnes/libsnes.cpp index 2de426e555..d05646122c 100644 --- a/waterbox/libsnes/bsnes/target-libsnes/libsnes.cpp +++ b/waterbox/libsnes/bsnes/target-libsnes/libsnes.cpp @@ -511,6 +511,9 @@ uint8_t* snes_get_memory_data(unsigned id) { case SNES_MEMORY_GAME_BOY_HRAM: if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break; return GameBoy::cpu.hram; + case SNES_MEMORY_SA1_IRAM: + if(!SNES::cartridge.has_sa1()) break; + return SNES::sa1.iram.data(); case SNES_MEMORY_WRAM: return SNES::cpu.wram; @@ -566,6 +569,9 @@ const char* snes_get_memory_id_name(unsigned id) { case SNES_MEMORY_GAME_BOY_HRAM: if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break; return "SGB_HRAM"; + case SNES_MEMORY_SA1_IRAM: + if(!SNES::cartridge.has_sa1()) break; + return "SA1_IRAM"; case SNES_MEMORY_WRAM: //return SNES::cpu.wram; @@ -630,7 +636,11 @@ unsigned snes_get_memory_size(unsigned id) { case SNES_MEMORY_GAME_BOY_HRAM: if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break; size = 128; - break; + break; + case SNES_MEMORY_SA1_IRAM: + if(!SNES::cartridge.has_sa1()) break; + size = SNES::sa1.iram.size(); + break; case SNES_MEMORY_WRAM: size = 128 * 1024; diff --git a/waterbox/libsnes/bsnes/target-libsnes/libsnes.hpp b/waterbox/libsnes/bsnes/target-libsnes/libsnes.hpp index 411488bfce..d01df3526e 100644 --- a/waterbox/libsnes/bsnes/target-libsnes/libsnes.hpp +++ b/waterbox/libsnes/bsnes/target-libsnes/libsnes.hpp @@ -71,6 +71,7 @@ extern "C" { #define SNES_MEMORY_GAME_BOY_RTC 7 #define SNES_MEMORY_GAME_BOY_WRAM 8 #define SNES_MEMORY_GAME_BOY_HRAM 9 +#define SNES_MEMORY_SA1_IRAM 10 #define SNES_MEMORY_WRAM 100 #define SNES_MEMORY_APURAM 101