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_minor,
|
||||
eMessage_QUERY_get_region,
|
||||
eMessage_QUERY_get_mapper,
|
||||
eMessage_QUERY_get_memory_size,
|
||||
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
||||
eMessage_QUERY_peek,
|
||||
|
@ -187,6 +188,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
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
|
||||
{
|
||||
NTSC = 0,
|
||||
|
@ -221,4 +237,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
JOYPAD_R = 11
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
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)
|
||||
{
|
||||
WritePipeMessage(eMessage.eMessage_QUERY_get_memory_size);
|
||||
|
@ -231,4 +237,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -480,9 +480,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
|
||||
bool LoadCurrent()
|
||||
{
|
||||
bool result = false;
|
||||
if (CurrLoadParams.type == LoadParamType.Normal)
|
||||
return 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);
|
||||
result = api.CMD_load_cartridge_normal(CurrLoadParams.xml_data, CurrLoadParams.rom_data);
|
||||
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>
|
||||
|
@ -1064,6 +1069,88 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
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()
|
||||
{
|
||||
int size = api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.WRAM);
|
||||
|
@ -1079,7 +1166,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|||
if (a.HasValue)
|
||||
return blockptr[a.Value];
|
||||
else
|
||||
return 0;
|
||||
return FakeBusRead((int)addr);
|
||||
},
|
||||
(addr, val) =>
|
||||
{
|
||||
|
|
|
@ -26,6 +26,8 @@ struct Interface : public SNES::Interface {
|
|||
uint32_t *buffer;
|
||||
uint32_t *palette;
|
||||
|
||||
SnesCartridge cart;
|
||||
|
||||
//zero 11-sep-2012
|
||||
time_t randomSeed() { return 0; }
|
||||
|
||||
|
@ -127,7 +129,8 @@ struct Interface : public SNES::Interface {
|
|||
pallocSharedMemory(0),
|
||||
pfreeSharedMemory(0),
|
||||
backdropColor(-1),
|
||||
ptrace(0)
|
||||
ptrace(0),
|
||||
cart(nullptr, 0)
|
||||
{
|
||||
buffer = new uint32_t[512 * 480];
|
||||
palette = new uint32_t[16 * 32768];
|
||||
|
@ -468,7 +471,8 @@ bool snes_load_cartridge_normal(
|
|||
) {
|
||||
snes_cheat_reset();
|
||||
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::system.power();
|
||||
return true;
|
||||
|
@ -480,7 +484,8 @@ bool snes_load_cartridge_bsx_slotted(
|
|||
) {
|
||||
snes_cheat_reset();
|
||||
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);
|
||||
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
||||
SNES::cartridge.load(SNES::Cartridge::Mode::BsxSlotted, xmlrom);
|
||||
|
@ -494,7 +499,8 @@ bool snes_load_cartridge_bsx(
|
|||
) {
|
||||
snes_cheat_reset();
|
||||
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);
|
||||
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
|
||||
SNES::cartridge.load(SNES::Cartridge::Mode::Bsx, xmlrom);
|
||||
|
@ -509,7 +515,8 @@ bool snes_load_cartridge_sufami_turbo(
|
|||
) {
|
||||
snes_cheat_reset();
|
||||
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);
|
||||
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);
|
||||
|
@ -525,7 +532,8 @@ bool snes_load_cartridge_super_game_boy(
|
|||
) {
|
||||
snes_cheat_reset();
|
||||
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) {
|
||||
//GameBoyCartridge needs to modify dmg_data (for MMM01 emulation); so copy data
|
||||
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;
|
||||
}
|
||||
|
||||
char snes_get_mapper(void) {
|
||||
return iface->cart.mapper;
|
||||
}
|
||||
|
||||
uint8_t* snes_get_memory_data(unsigned id) {
|
||||
if(SNES::cartridge.loaded() == false) return 0;
|
||||
|
||||
|
|
|
@ -149,6 +149,7 @@ bool snes_load_cartridge_super_game_boy(
|
|||
void snes_unload_cartridge(void);
|
||||
|
||||
bool snes_get_region(void);
|
||||
char snes_get_mapper(void);
|
||||
uint8_t* snes_get_memory_data(unsigned id);
|
||||
const char* snes_get_memory_id_name(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_minor,
|
||||
eMessage_QUERY_get_region,
|
||||
eMessage_QUERY_get_mapper,
|
||||
eMessage_QUERY_get_memory_size,
|
||||
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
|
||||
eMessage_QUERY_peek,
|
||||
|
@ -727,6 +728,10 @@ bool Handle_QUERY(eMessage msg)
|
|||
WritePipe((char)snes_get_region());
|
||||
break;
|
||||
|
||||
case eMessage_QUERY_get_mapper:
|
||||
WritePipe(snes_get_mapper());
|
||||
break;
|
||||
|
||||
case eMessage_QUERY_get_memory_size:
|
||||
WritePipe((u32)snes_get_memory_size(ReadPipe<u32>()));
|
||||
break;
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue