BSNESv115+: ram and rom memory domain fixes

- saveram was not working at all on certain roms, as the "CARTRIDGE_RAM" memory domain was returning a null pointer (similar thing for "CARTRIDGE_ROM"; changed it to correctly return the current rom)
- add sa1_bwram domain for clarity and an SGB_ROM domain
This commit is contained in:
Morilli 2021-12-15 09:10:37 +01:00
parent 47a81e7b20
commit d24629f3ad
4 changed files with 56 additions and 13 deletions

Binary file not shown.

View File

@ -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

View File

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

View File

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