diff --git a/higan/emulator/emulator.hpp b/higan/emulator/emulator.hpp index a5c2b039..87374dac 100644 --- a/higan/emulator/emulator.hpp +++ b/higan/emulator/emulator.hpp @@ -12,7 +12,7 @@ using namespace nall; namespace Emulator { static const string Name = "higan"; - static const string Version = "106.11"; + static const string Version = "106.12"; static const string Author = "byuu"; static const string License = "GPLv3"; static const string Website = "https://byuu.org/"; diff --git a/higan/emulator/game.hpp b/higan/emulator/game.hpp index 9a765664..f626f1cb 100644 --- a/higan/emulator/game.hpp +++ b/higan/emulator/game.hpp @@ -7,7 +7,7 @@ struct Game { struct Oscillator; inline auto load(string_view) -> void; - inline auto memory(string_view) -> maybe; + inline auto memory(Markup::Node) -> maybe; inline auto oscillator(natural = 0) -> maybe; struct Memory { @@ -19,7 +19,8 @@ struct Game { natural size; string category; string manufacturer; - string part; + string model; + string identity; }; struct Oscillator { @@ -56,7 +57,8 @@ auto Game::load(string_view text) -> void { memory.size = node["size"].natural(); memory.category = node["category"].text(); memory.manufacturer = node["manufacturer"].text(); - memory.part = node["part"].text(); + memory.model = node["model"].text(); + memory.identity = node["identity"].text(); memoryList.append(memory); } @@ -67,9 +69,22 @@ auto Game::load(string_view text) -> void { } } -auto Game::memory(string_view name) -> maybe { +auto Game::memory(Markup::Node node) -> maybe { + if(!node) return nothing; for(auto& memory : memoryList) { - if(memory.name() == name) return memory; + auto type = node["type"].text(); + auto size = node["size"].natural(); + auto category = node["category"].text(); + auto manufacturer = node["manufacturer"].text(); + auto model = node["model"].text(); + auto identity = node["identity"].text(); + if(type && type != memory.type) continue; + if(size && size != memory.size) continue; + if(category && category != memory.category) continue; + if(manufacturer && manufacturer != memory.manufacturer) continue; + if(model && model != memory.model) continue; + if(identity && identity != memory.identity) continue; + return memory; } return nothing; } @@ -80,7 +95,7 @@ auto Game::oscillator(natural index) -> maybe { } auto Game::Memory::name() const -> string { - if(part) return string{part, ".", category, ".", type}.downcase(); + if(manufacturer) return string{manufacturer, ".", category, ".", type}.downcase(); return string{category, ".", type}.downcase(); } diff --git a/higan/sfc/cartridge/load.cpp b/higan/sfc/cartridge/load.cpp index f183c83b..126350f7 100644 --- a/higan/sfc/cartridge/load.cpp +++ b/higan/sfc/cartridge/load.cpp @@ -59,8 +59,8 @@ auto Cartridge::loadCartridge(Markup::Node node) -> void { } } - if(auto node = board["rom"]) loadROM(node); - if(auto node = board["ram"]) loadRAM(node); + if(auto node = board["memory(type=ROM)"]) loadROM(node); + if(auto node = board["memory(type=RAM)"]) loadRAM(node); if(auto node = board["icd"]) loadICD(node); if(auto node = board["mcc"]) loadMCC(node); if(auto node = board["bsmemory"]) loadBSMemoryPack(node); @@ -223,17 +223,17 @@ auto Cartridge::loadSuperFX(Markup::Node node) -> void { auto Cartridge::loadARMDSP(Markup::Node node) -> void { has.ARMDSP = true; - if(auto memory = game.memory(node["prom/name"].text())) { + if(auto memory = game.memory(node["memory(type=ROM,category=Program)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { for(auto n : range(128 * 1024)) armdsp.programROM[n] = fp->read(); } } - if(auto memory = game.memory(node["drom/name"].text())) { + if(auto memory = game.memory(node["memory(type=ROM,category=Data)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { for(auto n : range( 32 * 1024)) armdsp.dataROM[n] = fp->read(); } } - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { for(auto n : range( 16 * 1024)) armdsp.programRAM[n] = fp->read(); } @@ -255,12 +255,12 @@ auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void { for(auto& word : hitachidsp.dataROM) word = 0x000000; for(auto& word : hitachidsp.dataRAM) word = 0x00; - if(auto memory = game.memory(node["drom/name"].text())) { + if(auto memory = game.memory(node["memory(type=ROM,category=Data)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { for(auto n : range(1 * 1024)) hitachidsp.dataROM[n] = fp->readl(3); } } - if(auto memory = game.memory(node["dram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { for(auto n : range(3 * 1024)) hitachidsp.dataRAM[n] = fp->readl(1); } @@ -290,17 +290,17 @@ auto Cartridge::loadNECDSP(Markup::Node node) -> void { if(necdsp.revision == NECDSP::Revision::uPD7725 ) memory::assign(size, 2048, 1024, 256); if(necdsp.revision == NECDSP::Revision::uPD96050) memory::assign(size, 16384, 2048, 2048); - if(auto memory = game.memory(node["prom/name"].text())) { + if(auto memory = game.memory(node["memory(type=ROM,category=Program)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { for(auto n : range(size[0])) necdsp.programROM[n] = fp->readl(3); } } - if(auto memory = game.memory(node["drom/name"].text())) { + if(auto memory = game.memory(node["memory(type=ROM,category=Data)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { for(auto n : range(size[1])) necdsp.dataROM[n] = fp->readl(2); } } - if(auto memory = game.memory(node["dram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { for(auto n : range(size[2])) necdsp.dataRAM[n] = fp->readl(2); } @@ -314,7 +314,7 @@ auto Cartridge::loadEpsonRTC(Markup::Node node) -> void { has.EpsonRTC = true; epsonrtc.initialize(); - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RTC)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { uint8 data[16] = {0}; for(auto& byte : data) byte = fp->read(); @@ -329,7 +329,7 @@ auto Cartridge::loadSharpRTC(Markup::Node node) -> void { has.SharpRTC = true; sharprtc.initialize(); - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RTC)"])) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { uint8 data[16] = {0}; for(auto& byte : data) byte = fp->read(); @@ -382,7 +382,7 @@ auto Cartridge::loadMSU1(Markup::Node node) -> void { auto Cartridge::loadMemory(MappedRAM& ram, Markup::Node node, bool required, maybe id) -> void { if(!id) id = pathID(); - if(auto memory = game.memory(node["name"].text())) { + if(auto memory = game.memory(node)) { ram.allocate(memory->size); if(memory->type == "RAM" && !memory->battery) return; if(memory->type == "RTC" && !memory->battery) return; diff --git a/higan/sfc/cartridge/save.cpp b/higan/sfc/cartridge/save.cpp index 67dfbfcf..c7b17be9 100644 --- a/higan/sfc/cartridge/save.cpp +++ b/higan/sfc/cartridge/save.cpp @@ -1,5 +1,5 @@ auto Cartridge::saveCartridge(Markup::Node node) -> void { - if(auto node = board["ram"]) saveRAM(node); + if(auto node = board["memory(type=RAM)"]) saveRAM(node); if(auto node = board["mcc"]) saveMCC(node); if(auto node = board["event"]) saveEvent(node); if(auto node = board["sa1"]) saveSA1(node); @@ -52,7 +52,7 @@ auto Cartridge::saveSuperFX(Markup::Node node) -> void { } auto Cartridge::saveARMDSP(Markup::Node node) -> void { - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data)"])) { if(memory->battery) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { for(auto n : range(16 * 1024)) fp->write(armdsp.programRAM[n]); @@ -64,7 +64,7 @@ auto Cartridge::saveARMDSP(Markup::Node node) -> void { auto Cartridge::saveHitachiDSP(Markup::Node node) -> void { saveMemory(hitachidsp.ram, node["ram"]); - if(auto memory = game.memory(node["dram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data)"])) { if(memory->battery) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { for(auto n : range(3 * 1024)) fp->write(hitachidsp.dataRAM[n]); @@ -75,7 +75,7 @@ auto Cartridge::saveHitachiDSP(Markup::Node node) -> void { auto Cartridge::saveNECDSP(Markup::Node node) -> void { uint size = necdsp.revision == NECDSP::Revision::uPD7725 ? 256 : 2048; - if(auto memory = game.memory(node["dram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RAM,category=Data)"])) { if(memory->battery) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { for(auto n : range(size)) fp->writel(necdsp.dataRAM[n], 2); @@ -85,7 +85,7 @@ auto Cartridge::saveNECDSP(Markup::Node node) -> void { } auto Cartridge::saveEpsonRTC(Markup::Node node) -> void { - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RTC)"])) { if(memory->battery) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { uint8 data[16] = {0}; @@ -97,7 +97,7 @@ auto Cartridge::saveEpsonRTC(Markup::Node node) -> void { } auto Cartridge::saveSharpRTC(Markup::Node node) -> void { - if(auto memory = game.memory(node["ram/name"].text())) { + if(auto memory = game.memory(node["memory(type=RTC)"])) { if(memory->battery) { if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { uint8 data[16] = {0}; @@ -124,7 +124,7 @@ auto Cartridge::saveOBC1(Markup::Node node) -> void { auto Cartridge::saveMemory(MappedRAM& ram, Markup::Node node, maybe id) -> void { if(!id) id = pathID(); - if(auto memory = game.memory(node["name"].text())) { + if(auto memory = game.memory(node)) { if(memory->type == "RAM" && !memory->battery) return; if(memory->type == "RTC" && !memory->battery) return; if(auto fp = platform->open(id(), memory->name(), File::Write)) { diff --git a/higan/systems/Super Famicom.sys/boards.bml b/higan/systems/Super Famicom.sys/boards.bml index 067f6621..26d904c0 100644 --- a/higan/systems/Super Famicom.sys/boards.bml +++ b/higan/systems/Super Famicom.sys/boards.bml @@ -1,5 +1,5 @@ database - revision: 2018-03-13 + revision: 2018-04-03 //Boards (Production) @@ -533,292 +533,291 @@ board: SHVC-YJ0N-01 //Boards (Generic) database - revision: 2018-03-04 + revision: 2018-04-03 board: ARM-LOROM-RAM - rom + memory type=ROM category=Program map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=40-6f,c0-ef:0000-7fff mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-ffff - armdsp frequency=21477272 + armdsp map address=00-3f,80-bf:3800-38ff - prom - drom - ram + memory type=ROM category=Program manufacturer=ARM + memory type=ROM category=Data manufacturer=ARM + memory type=RAM category=Data manufacturer=ARM + oscillator board: BS-HIROM-RAM - rom + memory type=ROM category=Program map address=00-1f,80-9f:8000-ffff map address=40-5f,c0-df:0000-ffff - ram + memory type=RAM category=Save map address=20-3f,a0-bf:6000-7fff mask=0xe000 bsmemory map address=20-3f,a0-bf:8000-ffff map address=60-7d,e0-ff:0000-ffff board: BS-LOROM-RAM - rom + memory type=ROM category=Program map address=00-1f:8000-ffff base=0x000000 mask=0x8000 map address=20-3f:8000-ffff base=0x100000 mask=0x8000 map address=80-9f:8000-ffff base=0x200000 mask=0x8000 map address=a0-bf:8000-ffff base=0x100000 mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-7fff mask=0x8000 bsmemory map address=c0-ef:0000-ffff board: BS-MCC-RAM - ram + memory type=RAM category=Save map address=10-1f:5000-5fff mask=0xf000 mcc map address=00-0f:5000 map=mcu address=00-3f,80-bf:8000-ffff mask=0x408000 map=mcu address=40-7d,c0-ff:0000-ffff - rom - ram + memory type=ROM category=Program + memory type=RAM category=Download map address=00-3f,80-bf:6000-7fff mask=0xe000 bsmemory board: BS-SA1-RAM sa1 map address=00-3f,80-bf:2200-23ff - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=c0-ff:0000-ffff - bwram + memory type=RAM category=Bitmap map address=00-3f,80-bf:6000-7fff size=0x2000 map address=40-4f:0000-ffff - iram + memory type=RAM category=Internal map address=00-3f,80-bf:3000-37ff size=0x800 bsmemory board: HIROM - rom name=program.rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff board: HIROM-RAM - rom name=program.rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff - ram name=save.ram + memory type=RAM category=Save map address=20-3f,a0-bf:6000-7fff mask=0xe000 board: HIROMEX-RAM - rom + memory type=ROM category=Program map address=00-3f:8000-ffff base=0x400000 map address=40-7d:0000-ffff base=0x400000 map address=80-bf:8000-ffff mask=0xc00000 map address=c0-ff:0000-ffff mask=0xc00000 - ram + memory type=RAM category=Save map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=70-7d:0000-7fff board: HITACHI-LOROM - hitachidsp model=HG51B169 frequency=20000000 + hitachidsp model=HG51BS169 map address=00-3f,80-bf:6c00-6fff,7c00-7fff map address=70-77:0000-7fff - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x8000 - drom - dram + memory type=ROM category=Data manufacturer=Hitachi + memory type=RAM category=Data manufacturer=Hitachi map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 + oscillator board: LOROM - rom name=program.rom + memory type=ROM category=Program map address=00-7d,80-ff:8000-ffff mask=0x8000 board: LOROM-RAM - rom name=program.rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram name=save.ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-ffff mask=0x8000 board: LOROMEX-RAM - rom + memory type=ROM category=Program map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-7fff mask=0x8000 board: NEC-HIROM - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff - necdsp model=uPD7725 frequency=8000000 + necdsp model=uPD7725 map address=00-1f,80-9f:6000-7fff mask=0xfff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC + oscillator board: NEC-HIROM-RAM - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff - ram + memory type=RAM category=Save map address=20-3f,a0-bf:6000-7fff mask=0xe000 - necdsp model=uPD7725 frequency=8000000 + necdsp model=uPD7725 map address=00-1f,80-9f:6000-7fff mask=0xfff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC + oscillator board: NEC-LOROM - rom + memory type=ROM category=Program map address=00-1f,80-9f:8000-ffff mask=0x8000 - necdsp model=uPD7725 frequency=8000000 + necdsp model=uPD7725 map address=30-3f,b0-bf:8000-ffff mask=0x3fff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC + oscillator board: NEC-LOROM-RAM - rom + memory type=ROM category=Program map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-ffff - necdsp model=uPD7725 frequency=8000000 + necdsp model=uPD7725 map address=20-3f,a0-bf:8000-ffff mask=0x3fff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC + oscillator board: NEC-LOROMEX-RAM - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-7fff mask=0x8000 - necdsp model=uPD7725 frequency=8000000 + necdsp model=uPD7725 map address=60-6f,e0-ef:0000-7fff mask=0x3fff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC + oscillator -board: NECEX-LOROM-BATTERY#11 - rom +board: NECEX-LOROM-BATTERY + memory type=ROM category=Program map address=00-7d,80-ff:8000-ffff mask=0x8000 - necdsp model=uPD96050 frequency=11000000 + necdsp model=uPD96050 map address=60-67,e0-e7:0000-3fff - prom - drom - dram - map address=68-6f,e8-ef:0000-7fff mask=0x8000 - -board: NECEX-LOROM-BATTERY#15 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - necdsp model=uPD96050 frequency=15000000 - map address=60-67,e0-e7:0000-3fff - prom - drom - dram + memory type=ROM category=Program manufacturer=NEC + memory type=ROM category=Data manufacturer=NEC + memory type=RAM category=Data manufacturer=NEC map address=68-6f,e8-ef:0000-7fff mask=0x8000 + oscillator board: OBC1-LOROM-RAM - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x8000 obc1 map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000 - ram + memory type=RAM category=Save board: RTC-HIROMEX-RAM - rom + memory type=ROM category=Program map address=00-3f:8000-ffff base=0x400000 map address=40-7d:0000-ffff base=0x400000 map address=80-bf:8000-ffff mask=0xc00000 map address=c0-ff:0000-ffff mask=0xc00000 - ram + memory type=RAM category=Save map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=70-7d:0000-7fff sharprtc map address=00-3f,80-bf:2800-2801 - ram + memory type=RTC manufacturer=Sharp board: SA1-RAM sa1 map address=00-3f,80-bf:2200-23ff - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=c0-ff:0000-ffff - bwram + memory type=RAM category=Bitmap map address=00-3f,80-bf:6000-7fff size=0x2000 map address=40-4f:0000-ffff - iram + memory type=RAM category=Internal map address=00-3f,80-bf:3000-37ff size=0x800 board: SDD1 sdd1 map address=00-3f,80-bf:4800-480f - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=c0-ff:0000-ffff board: SDD1-RAM sdd1 map address=00-3f,80-bf:4800-480f - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff map address=c0-ff:0000-ffff - ram + memory type=RAM category=Save map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=70-73:0000-ffff mask=0x8000 board: SGB-LOROM - rom + memory type=ROM category=Program map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=40-7d,c0-ff:0000-7fff mask=0x8000 icd revision=2 map address=00-3f,80-bf:6000-67ff,7000-7fff - rom + memory type=ROM category=Boot manufacturer=Nintendo + oscillator gameboy board: SPC7110-RAM spc7110 map address=00-3f,80-bf:4800-483f map address=50,58:0000-ffff - map=mcu address=00-3f,80-bf:8000-ffff mask=0x800000 - map=mcu address=c0-ff:0000-ffff mask=0xc00000 - prom - drom - ram + map type=MCU address=00-3f,80-bf:8000-ffff mask=0x800000 + map type=MCU address=c0-ff:0000-ffff mask=0xc00000 + memory type=ROM category=Program + memory type=ROM category=Data + memory type=RAM category=Save map address=00-3f,80-bf:6000-7fff mask=0xe000 board: SPC7110-RTC-RAM spc7110 map address=00-3f,80-bf:4800-483f map address=50,58:0000-ffff - map=mcu address=00-3f,80-bf:8000-ffff mask=0x800000 - map=mcu address=c0-ff:0000-ffff mask=0xc00000 - prom - drom - ram + map type=MCU address=00-3f,80-bf:8000-ffff mask=0x800000 + map type=MCU address=c0-ff:0000-ffff mask=0xc00000 + memory type=ROM category=Program + memory type=ROM category=Data + memory type=RAM category=Save map address=00-3f,80-bf:6000-7fff mask=0xe000 epsonrtc map address=00-3f,80-bf:4800-4842 - ram + memory type=RTC manufacturer=Epson board: ST-LOROM - rom + memory type=ROM category=Program map address=00-1f,80-9f:8000-ffff mask=0x8000 sufamiturbo - rom + memory type=ROM category=Program map address=20-3f,a0-bf:8000-ffff mask=0x8000 - ram + memory type=RAM category=Save map address=60-6f,e0-ef:0000-ffff sufamiturbo - rom + memory type=ROM category=Program map address=40-5f,c0-df:0000-ffff mask=0x8000 - ram + memory type=RAM category=Save map address=70-7d,f0-ff:0000-ffff board: SUPERFX-RAM superfx map address=00-3f,80-bf:3000-34ff - rom + memory type=ROM category=Program map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=40-5f,c0-df:0000-ffff - ram + memory type=RAM category=Save map address=00-3f,80-bf:6000-7fff size=0x2000 map address=70-71,f0-f1:0000-ffff