diff --git a/Assets/dll/bsnes.wbx.gz b/Assets/dll/bsnes.wbx.gz index 202b17a0ce..7f128f5bf1 100644 Binary files a/Assets/dll/bsnes.wbx.gz and b/Assets/dll/bsnes.wbx.gz differ diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/BsnesApi_Enums.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/BsnesApi_Enums.cs index ed0a43b699..4c835efdd2 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/BsnesApi_Enums.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/BsnesApi_Enums.cs @@ -5,19 +5,21 @@ public enum SNES_MEMORY { CARTRIDGE_RAM, + CARTRIDGE_ROM, + SGB_ROM, + BSX_RAM, BSX_PRAM, SUFAMI_TURBO_A_RAM, SUFAMI_TURBO_B_RAM, SA1_IRAM, + SA1_BWRAM, WRAM, APURAM, VRAM, // OAM, // needs some work in the core probably? or we return an objects pointer - CGRAM, - - CARTRIDGE_ROM + CGRAM } public enum BSNES_INPUT_DEVICE diff --git a/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.cpp b/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.cpp index 672d1dd8e0..ef3503e72e 100644 --- a/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.cpp +++ b/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.cpp @@ -274,6 +274,30 @@ EXPORT void snes_set_hooks_enabled(bool read_hook_enabled, bool write_hook_enabl } +uint8_t* snes_get_effective_saveram(int* ram_size) { + if (cartridge.has.SA1) { + *ram_size = sa1.bwram.size(); + return sa1.bwram.data(); + } else if (cartridge.has.SuperFX) { + *ram_size = superfx.ram.size(); + return superfx.ram.data(); + } else if (cartridge.has.HitachiDSP) { + *ram_size = hitachidsp.ram.size(); + return hitachidsp.ram.data(); + } else if (cartridge.has.SPC7110) { + *ram_size = spc7110.ram.size(); + return spc7110.ram.data(); + } else if (cartridge.has.OBC1) { + *ram_size = obc1.ram.size(); + return obc1.ram.data(); + } + + // note: if sufamiturbo is ever implemented frontend, this will need some additional consideration + // because sufamiturbo can have up to 2 cartridges (and respective save rams) + *ram_size = cartridge.ram.size(); + return cartridge.ram.data(); +} + EXPORT int snes_get_region(void) { return Region::PAL(); } @@ -303,10 +327,21 @@ EXPORT void* snes_get_memory_region(int id, int* size, int* word_size) switch(id) { + // this cartridge ram is a generalized memory region that can be anything that is considered + // cartridge or save ram for any coprocessor like SA-1, or just the basic cartridge ram case SNES_MEMORY::CARTRIDGE_RAM: - *size = cartridge.ram.size(); *word_size = 1; - return cartridge.ram.data(); + return snes_get_effective_saveram(size); + case SNES_MEMORY::CARTRIDGE_ROM: + *size = program->superFamicom.program.size(); + *word_size = 1; + return program->superFamicom.program.data(); + case SNES_MEMORY::SGB_ROM: + *size = program->gameBoy.program.size(); + *word_size = 1; + return program->gameBoy.program.data(); + + // unused case SNES_MEMORY::BSX_RAM: if (!cartridge.has.BSMemorySlot) break; *size = mcc.rom.size(); @@ -327,11 +362,19 @@ EXPORT void* snes_get_memory_region(int id, int* size, int* word_size) *size = sufamiturboB.ram.size(); *word_size = 1; return sufamiturboB.ram.data(); + case SNES_MEMORY::SA1_IRAM: if (!cartridge.has.SA1) break; *size = sa1.iram.size(); *word_size = 1; return sa1.iram.data(); + case SNES_MEMORY::SA1_BWRAM: + // effectively the cartridge ram, listed here to allow direct BWRAM access + // instead of relying on the CARTRIDGE_RAM domain + if (!cartridge.has.SA1) break; + *size = sa1.bwram.size(); + *word_size = 1; + return sa1.bwram.data(); case SNES_MEMORY::WRAM: *size = sizeof(cpu.wram); @@ -353,11 +396,6 @@ EXPORT void* snes_get_memory_region(int id, int* size, int* word_size) *size = sizeof(ppufast.cgram); *word_size = sizeof(*ppufast.cgram); return ppufast.cgram; - - case SNES_MEMORY::CARTRIDGE_ROM: - *size = cartridge.rom.size(); - *word_size = 1; - return cartridge.rom.data(); } return nullptr; diff --git a/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.hpp b/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.hpp index 935f2c43ae..414f439a4f 100644 --- a/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.hpp +++ b/waterbox/bsnescore/bsnes/target-bsnescore/bsnescore.hpp @@ -10,18 +10,21 @@ enum SNES_MEMORY { CARTRIDGE_RAM, + CARTRIDGE_ROM, + SGB_ROM, + + // bsx and sufamiturbo unused cause unsupported by frontend BSX_RAM, BSX_PRAM, SUFAMI_TURBO_A_RAM, SUFAMI_TURBO_B_RAM, SA1_IRAM, + SA1_BWRAM, WRAM, APURAM, VRAM, - CGRAM, - - CARTRIDGE_ROM + CGRAM };