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
 };