bsnes: Fix disassembler with compatibility core
- The fake bus map has been extended to read mapped ROM space
This commit is contained in:
parent
ffc1e2f41a
commit
620c74e56e
|
@ -20,6 +20,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
eMessage_QUERY_library_revision_major,
|
eMessage_QUERY_library_revision_major,
|
||||||
eMessage_QUERY_library_revision_minor,
|
eMessage_QUERY_library_revision_minor,
|
||||||
eMessage_QUERY_get_region,
|
eMessage_QUERY_get_region,
|
||||||
|
eMessage_QUERY_get_mapper,
|
||||||
eMessage_QUERY_get_memory_size,
|
eMessage_QUERY_get_memory_size,
|
||||||
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
||||||
eMessage_QUERY_peek,
|
eMessage_QUERY_peek,
|
||||||
|
@ -187,6 +188,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
LOGICAL_REGS = 201
|
LOGICAL_REGS = 201
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum SNES_MAPPER : byte
|
||||||
|
{
|
||||||
|
LOROM = 0,
|
||||||
|
HIROM = 1,
|
||||||
|
EXLOROM = 2,
|
||||||
|
EXHIROM = 3,
|
||||||
|
SUPERFXROM = 4,
|
||||||
|
SA1ROM = 5,
|
||||||
|
SPC7110ROM = 6,
|
||||||
|
BSCLOROM = 7,
|
||||||
|
BSCHIROM = 8,
|
||||||
|
BSXROM = 9,
|
||||||
|
STROM = 10
|
||||||
|
}
|
||||||
|
|
||||||
public enum SNES_REGION : byte
|
public enum SNES_REGION : byte
|
||||||
{
|
{
|
||||||
NTSC = 0,
|
NTSC = 0,
|
||||||
|
|
|
@ -32,6 +32,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
return (SNES_REGION)brPipe.ReadByte();
|
return (SNES_REGION)brPipe.ReadByte();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SNES_MAPPER QUERY_get_mapper()
|
||||||
|
{
|
||||||
|
WritePipeMessage(eMessage.eMessage_QUERY_get_mapper);
|
||||||
|
return (SNES_MAPPER)brPipe.ReadByte();
|
||||||
|
}
|
||||||
|
|
||||||
public int QUERY_get_memory_size(SNES_MEMORY id)
|
public int QUERY_get_memory_size(SNES_MEMORY id)
|
||||||
{
|
{
|
||||||
WritePipeMessage(eMessage.eMessage_QUERY_get_memory_size);
|
WritePipeMessage(eMessage.eMessage_QUERY_get_memory_size);
|
||||||
|
|
|
@ -480,9 +480,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
|
|
||||||
bool LoadCurrent()
|
bool LoadCurrent()
|
||||||
{
|
{
|
||||||
|
bool result = false;
|
||||||
if (CurrLoadParams.type == LoadParamType.Normal)
|
if (CurrLoadParams.type == LoadParamType.Normal)
|
||||||
return api.CMD_load_cartridge_normal(CurrLoadParams.xml_data, CurrLoadParams.rom_data);
|
result = api.CMD_load_cartridge_normal(CurrLoadParams.xml_data, CurrLoadParams.rom_data);
|
||||||
else return api.CMD_load_cartridge_super_game_boy(CurrLoadParams.rom_xml, CurrLoadParams.rom_data, CurrLoadParams.rom_size, CurrLoadParams.dmg_xml, CurrLoadParams.dmg_data, CurrLoadParams.dmg_size);
|
else result = api.CMD_load_cartridge_super_game_boy(CurrLoadParams.rom_xml, CurrLoadParams.rom_data, CurrLoadParams.rom_size, CurrLoadParams.dmg_xml, CurrLoadParams.dmg_data, CurrLoadParams.dmg_size);
|
||||||
|
|
||||||
|
mapper = api.QUERY_get_mapper();
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1064,6 +1069,88 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private LibsnesApi.SNES_MAPPER? mapper = null;
|
||||||
|
|
||||||
|
// works for ROM, garbage for anything else
|
||||||
|
byte FakeBusRead(int addr)
|
||||||
|
{
|
||||||
|
addr &= 0xffffff;
|
||||||
|
int bank = addr >> 16;
|
||||||
|
int low = addr & 0xffff;
|
||||||
|
|
||||||
|
if (!mapper.HasValue)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (mapper)
|
||||||
|
{
|
||||||
|
case LibsnesApi.SNES_MAPPER.LOROM:
|
||||||
|
if (low >= 0x8000)
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.EXLOROM:
|
||||||
|
if ((bank >= 0x40 && bank <= 0x7f) || low >= 0x8000)
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.HIROM:
|
||||||
|
case LibsnesApi.SNES_MAPPER.EXHIROM:
|
||||||
|
if ((bank >= 0x40 && bank <= 0x7f) || bank >= 0xc0 || low >= 0x8000)
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.SUPERFXROM:
|
||||||
|
if ((bank >= 0x40 && bank <= 0x5f) || (bank >= 0xc0 && bank <= 0xdf) ||
|
||||||
|
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.SA1ROM:
|
||||||
|
if (bank >= 0xc0 || (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.BSCLOROM:
|
||||||
|
if (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf)))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.BSCHIROM:
|
||||||
|
if ((bank >= 0x40 && bank <= 0x5f) || (bank >= 0xc0 && bank <= 0xdf) ||
|
||||||
|
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x1f) || (bank >= 0x80 && bank <= 0x9f))))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.BSXROM:
|
||||||
|
if ((bank >= 0x40 && bank <= 0x7f) || bank >= 0xc0 ||
|
||||||
|
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))) ||
|
||||||
|
(low >= 0x6000 && low <= 0x7fff && (bank >= 0x20 && bank <= 0x3f)))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LibsnesApi.SNES_MAPPER.STROM:
|
||||||
|
if (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x5f) || (bank >= 0x80 && bank <= 0xdf)))
|
||||||
|
{
|
||||||
|
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException(string.Format("Unknown mapper: {0}", mapper));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsafe void MakeFakeBus()
|
unsafe void MakeFakeBus()
|
||||||
{
|
{
|
||||||
int size = api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.WRAM);
|
int size = api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.WRAM);
|
||||||
|
@ -1079,7 +1166,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
if (a.HasValue)
|
if (a.HasValue)
|
||||||
return blockptr[a.Value];
|
return blockptr[a.Value];
|
||||||
else
|
else
|
||||||
return 0;
|
return FakeBusRead((int)addr);
|
||||||
},
|
},
|
||||||
(addr, val) =>
|
(addr, val) =>
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,8 @@ struct Interface : public SNES::Interface {
|
||||||
uint32_t *buffer;
|
uint32_t *buffer;
|
||||||
uint32_t *palette;
|
uint32_t *palette;
|
||||||
|
|
||||||
|
SnesCartridge cart;
|
||||||
|
|
||||||
//zero 11-sep-2012
|
//zero 11-sep-2012
|
||||||
time_t randomSeed() { return 0; }
|
time_t randomSeed() { return 0; }
|
||||||
|
|
||||||
|
@ -127,7 +129,8 @@ struct Interface : public SNES::Interface {
|
||||||
pallocSharedMemory(0),
|
pallocSharedMemory(0),
|
||||||
pfreeSharedMemory(0),
|
pfreeSharedMemory(0),
|
||||||
backdropColor(-1),
|
backdropColor(-1),
|
||||||
ptrace(0)
|
ptrace(0),
|
||||||
|
cart(nullptr, 0)
|
||||||
{
|
{
|
||||||
buffer = new uint32_t[512 * 480];
|
buffer = new uint32_t[512 * 480];
|
||||||
palette = new uint32_t[16 * 32768];
|
palette = new uint32_t[16 * 32768];
|
||||||
|
@ -468,7 +471,8 @@ bool snes_load_cartridge_normal(
|
||||||
) {
|
) {
|
||||||
snes_cheat_reset();
|
snes_cheat_reset();
|
||||||
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
||||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
|
iface->cart = SnesCartridge(rom_data, rom_size);
|
||||||
|
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
|
||||||
SNES::cartridge.load(SNES::Cartridge::Mode::Normal, { xmlrom });
|
SNES::cartridge.load(SNES::Cartridge::Mode::Normal, { xmlrom });
|
||||||
SNES::system.power();
|
SNES::system.power();
|
||||||
return true;
|
return true;
|
||||||
|
@ -480,7 +484,8 @@ bool snes_load_cartridge_bsx_slotted(
|
||||||
) {
|
) {
|
||||||
snes_cheat_reset();
|
snes_cheat_reset();
|
||||||
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
||||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
|
iface->cart = SnesCartridge(rom_data, rom_size);
|
||||||
|
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
|
||||||
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
|
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
|
||||||
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
||||||
SNES::cartridge.load(SNES::Cartridge::Mode::BsxSlotted, xmlrom);
|
SNES::cartridge.load(SNES::Cartridge::Mode::BsxSlotted, xmlrom);
|
||||||
|
@ -494,7 +499,8 @@ bool snes_load_cartridge_bsx(
|
||||||
) {
|
) {
|
||||||
snes_cheat_reset();
|
snes_cheat_reset();
|
||||||
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
||||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
|
iface->cart = SnesCartridge(rom_data, rom_size);
|
||||||
|
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
|
||||||
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
|
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
|
||||||
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
||||||
SNES::cartridge.load(SNES::Cartridge::Mode::Bsx, xmlrom);
|
SNES::cartridge.load(SNES::Cartridge::Mode::Bsx, xmlrom);
|
||||||
|
@ -509,7 +515,8 @@ bool snes_load_cartridge_sufami_turbo(
|
||||||
) {
|
) {
|
||||||
snes_cheat_reset();
|
snes_cheat_reset();
|
||||||
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
||||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
|
iface->cart = SnesCartridge(rom_data, rom_size);
|
||||||
|
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
|
||||||
if(sta_data) SNES::sufamiturbo.slotA.rom.copy(sta_data, sta_size);
|
if(sta_data) SNES::sufamiturbo.slotA.rom.copy(sta_data, sta_size);
|
||||||
string xmlsta = (sta_xml && *sta_xml) ? string(sta_xml) : SnesCartridge(sta_data, sta_size).markup;
|
string xmlsta = (sta_xml && *sta_xml) ? string(sta_xml) : SnesCartridge(sta_data, sta_size).markup;
|
||||||
if(stb_data) SNES::sufamiturbo.slotB.rom.copy(stb_data, stb_size);
|
if(stb_data) SNES::sufamiturbo.slotB.rom.copy(stb_data, stb_size);
|
||||||
|
@ -525,7 +532,8 @@ bool snes_load_cartridge_super_game_boy(
|
||||||
) {
|
) {
|
||||||
snes_cheat_reset();
|
snes_cheat_reset();
|
||||||
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
|
||||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
|
iface->cart = SnesCartridge(rom_data, rom_size);
|
||||||
|
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
|
||||||
if(dmg_data) {
|
if(dmg_data) {
|
||||||
//GameBoyCartridge needs to modify dmg_data (for MMM01 emulation); so copy data
|
//GameBoyCartridge needs to modify dmg_data (for MMM01 emulation); so copy data
|
||||||
uint8_t *data = new uint8_t[dmg_size];
|
uint8_t *data = new uint8_t[dmg_size];
|
||||||
|
@ -547,6 +555,10 @@ bool snes_get_region(void) {
|
||||||
return SNES::system.region() == SNES::System::Region::NTSC ? 0 : 1;
|
return SNES::system.region() == SNES::System::Region::NTSC ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char snes_get_mapper(void) {
|
||||||
|
return iface->cart.mapper;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t* snes_get_memory_data(unsigned id) {
|
uint8_t* snes_get_memory_data(unsigned id) {
|
||||||
if(SNES::cartridge.loaded() == false) return 0;
|
if(SNES::cartridge.loaded() == false) return 0;
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,7 @@ bool snes_load_cartridge_super_game_boy(
|
||||||
void snes_unload_cartridge(void);
|
void snes_unload_cartridge(void);
|
||||||
|
|
||||||
bool snes_get_region(void);
|
bool snes_get_region(void);
|
||||||
|
char snes_get_mapper(void);
|
||||||
uint8_t* snes_get_memory_data(unsigned id);
|
uint8_t* snes_get_memory_data(unsigned id);
|
||||||
const char* snes_get_memory_id_name(unsigned id);
|
const char* snes_get_memory_id_name(unsigned id);
|
||||||
unsigned snes_get_memory_size(unsigned id);
|
unsigned snes_get_memory_size(unsigned id);
|
||||||
|
|
|
@ -54,6 +54,7 @@ enum eMessage : int32
|
||||||
eMessage_QUERY_library_revision_major,
|
eMessage_QUERY_library_revision_major,
|
||||||
eMessage_QUERY_library_revision_minor,
|
eMessage_QUERY_library_revision_minor,
|
||||||
eMessage_QUERY_get_region,
|
eMessage_QUERY_get_region,
|
||||||
|
eMessage_QUERY_get_mapper,
|
||||||
eMessage_QUERY_get_memory_size,
|
eMessage_QUERY_get_memory_size,
|
||||||
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
||||||
eMessage_QUERY_peek,
|
eMessage_QUERY_peek,
|
||||||
|
@ -727,6 +728,10 @@ bool Handle_QUERY(eMessage msg)
|
||||||
WritePipe((char)snes_get_region());
|
WritePipe((char)snes_get_region());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case eMessage_QUERY_get_mapper:
|
||||||
|
WritePipe(snes_get_mapper());
|
||||||
|
break;
|
||||||
|
|
||||||
case eMessage_QUERY_get_memory_size:
|
case eMessage_QUERY_get_memory_size:
|
||||||
WritePipe((u32)snes_get_memory_size(ReadPipe<u32>()));
|
WritePipe((u32)snes_get_memory_size(ReadPipe<u32>()));
|
||||||
break;
|
break;
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue