Update to v106r12 release.

byuu says:

Changelog:

  - Emulator: update to final manifest syntax
  - Super Famicom: new board syntax (still experimental)
  - Super Famicom: match (manufacturer.)category.type instead of
    (model.)category.type

Errata:

  - Markup::Node::find() needs to be extended to support multiple
    subtype matches
  - Sufami Turbo ROM/RAM nodes are part of separate gamepaks; need to
    refactor this
This commit is contained in:
Tim Allen 2018-04-03 17:40:03 +10:00
parent 72b824cf1a
commit 985610c167
5 changed files with 148 additions and 134 deletions

View File

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

View File

@ -7,7 +7,7 @@ struct Game {
struct Oscillator;
inline auto load(string_view) -> void;
inline auto memory(string_view) -> maybe<Memory>;
inline auto memory(Markup::Node) -> maybe<Memory>;
inline auto oscillator(natural = 0) -> maybe<Oscillator>;
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<Memory> {
auto Game::memory(Markup::Node node) -> maybe<Memory> {
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<Oscillator> {
}
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();
}

View File

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

View File

@ -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<uint> 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)) {

View File

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