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:
parent
47a81e7b20
commit
d24629f3ad
Binary file not shown.
|
@ -5,19 +5,21 @@
|
||||||
public enum SNES_MEMORY
|
public enum SNES_MEMORY
|
||||||
{
|
{
|
||||||
CARTRIDGE_RAM,
|
CARTRIDGE_RAM,
|
||||||
|
CARTRIDGE_ROM,
|
||||||
|
SGB_ROM,
|
||||||
|
|
||||||
BSX_RAM,
|
BSX_RAM,
|
||||||
BSX_PRAM,
|
BSX_PRAM,
|
||||||
SUFAMI_TURBO_A_RAM,
|
SUFAMI_TURBO_A_RAM,
|
||||||
SUFAMI_TURBO_B_RAM,
|
SUFAMI_TURBO_B_RAM,
|
||||||
SA1_IRAM,
|
SA1_IRAM,
|
||||||
|
SA1_BWRAM,
|
||||||
|
|
||||||
WRAM,
|
WRAM,
|
||||||
APURAM,
|
APURAM,
|
||||||
VRAM,
|
VRAM,
|
||||||
// OAM, // needs some work in the core probably? or we return an objects pointer
|
// OAM, // needs some work in the core probably? or we return an objects pointer
|
||||||
CGRAM,
|
CGRAM
|
||||||
|
|
||||||
CARTRIDGE_ROM
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum BSNES_INPUT_DEVICE
|
public enum BSNES_INPUT_DEVICE
|
||||||
|
|
|
@ -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) {
|
EXPORT int snes_get_region(void) {
|
||||||
return Region::PAL();
|
return Region::PAL();
|
||||||
}
|
}
|
||||||
|
@ -303,10 +327,21 @@ EXPORT void* snes_get_memory_region(int id, int* size, int* word_size)
|
||||||
|
|
||||||
switch(id)
|
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:
|
case SNES_MEMORY::CARTRIDGE_RAM:
|
||||||
*size = cartridge.ram.size();
|
|
||||||
*word_size = 1;
|
*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:
|
case SNES_MEMORY::BSX_RAM:
|
||||||
if (!cartridge.has.BSMemorySlot) break;
|
if (!cartridge.has.BSMemorySlot) break;
|
||||||
*size = mcc.rom.size();
|
*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();
|
*size = sufamiturboB.ram.size();
|
||||||
*word_size = 1;
|
*word_size = 1;
|
||||||
return sufamiturboB.ram.data();
|
return sufamiturboB.ram.data();
|
||||||
|
|
||||||
case SNES_MEMORY::SA1_IRAM:
|
case SNES_MEMORY::SA1_IRAM:
|
||||||
if (!cartridge.has.SA1) break;
|
if (!cartridge.has.SA1) break;
|
||||||
*size = sa1.iram.size();
|
*size = sa1.iram.size();
|
||||||
*word_size = 1;
|
*word_size = 1;
|
||||||
return sa1.iram.data();
|
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:
|
case SNES_MEMORY::WRAM:
|
||||||
*size = sizeof(cpu.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);
|
*size = sizeof(ppufast.cgram);
|
||||||
*word_size = sizeof(*ppufast.cgram);
|
*word_size = sizeof(*ppufast.cgram);
|
||||||
return ppufast.cgram;
|
return ppufast.cgram;
|
||||||
|
|
||||||
case SNES_MEMORY::CARTRIDGE_ROM:
|
|
||||||
*size = cartridge.rom.size();
|
|
||||||
*word_size = 1;
|
|
||||||
return cartridge.rom.data();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -10,18 +10,21 @@
|
||||||
|
|
||||||
enum SNES_MEMORY {
|
enum SNES_MEMORY {
|
||||||
CARTRIDGE_RAM,
|
CARTRIDGE_RAM,
|
||||||
|
CARTRIDGE_ROM,
|
||||||
|
SGB_ROM,
|
||||||
|
|
||||||
|
// bsx and sufamiturbo unused cause unsupported by frontend
|
||||||
BSX_RAM,
|
BSX_RAM,
|
||||||
BSX_PRAM,
|
BSX_PRAM,
|
||||||
SUFAMI_TURBO_A_RAM,
|
SUFAMI_TURBO_A_RAM,
|
||||||
SUFAMI_TURBO_B_RAM,
|
SUFAMI_TURBO_B_RAM,
|
||||||
SA1_IRAM,
|
SA1_IRAM,
|
||||||
|
SA1_BWRAM,
|
||||||
|
|
||||||
WRAM,
|
WRAM,
|
||||||
APURAM,
|
APURAM,
|
||||||
VRAM,
|
VRAM,
|
||||||
CGRAM,
|
CGRAM
|
||||||
|
|
||||||
CARTRIDGE_ROM
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue