Update to v106r18 release.

byuu says:

Changelog:

  - major restructuring of board manifests
  - cleanup of generic board names
  - Super Famicom: updates to SA1, SuperFX, Cx4, SPC7110, EpsonRTC,
    SharpRTC load/save code
  - Super Famicom: added experimental SuperFX plot dithering fix
    [qwertymodo]
  - higan, icarus: rename shared folders to lowercase names; put .sys
    folders into new subfolder
      - Video Shaders/ → shaders/

      - Database/ → database/

      - Firmware/ → firmware/

      - \*.sys/ → systems/\*.sys/

So right now, only standard SNES games, SA-1, SuperFX, and Cx4 games
load. I have not tested SPC7110 or RTC support, because icarus import
seems to be completely broken? It's creating blank folders when I try it
now. I'll have to fix that ...

Since we are now up to thirteen systems, I've put the .sys folders into
a subfolder. This should declutter the main higan-windows release folder
a good deal. Linux users will need to re-run make install, or manually
move things into a new systems/ subfolder.

Same goes for icarus: lowercase the database/ and firmware/ folders or
re-run make install.

I don't know if qwertymodo's SuperFX fix is exactly correct or not.
Hopefully it is, but I didn't write a test ROM or anything to be
certain. Since SuperFX games should run, if people could please play
through some of them and look for any regressions, that'd be very much
appreciated.
This commit is contained in:
Tim Allen 2018-05-09 12:12:06 +10:00
parent 8617711ea2
commit b69909be8d
18 changed files with 484 additions and 356 deletions

View File

@ -12,7 +12,7 @@ using namespace nall;
namespace Emulator { namespace Emulator {
static const string Name = "higan"; static const string Name = "higan";
static const string Version = "106.17"; static const string Version = "106.18";
static const string Author = "byuu"; static const string Author = "byuu";
static const string License = "GPLv3"; static const string License = "GPLv3";
static const string Website = "https://byuu.org/"; static const string Website = "https://byuu.org/";

View File

@ -59,8 +59,8 @@ auto Cartridge::loadCartridge(Markup::Node node) -> void {
} }
} }
if(auto node = board["memory(type=ROM)"]) loadROM(node); if(auto node = board["memory(type=ROM,content=Program)"]) loadROM(node);
if(auto node = board["memory(type=RAM)"]) loadRAM(node); if(auto node = board["memory(type=RAM,content=Save)"]) loadRAM(node);
if(auto node = board["icd"]) loadICD(node); if(auto node = board["icd"]) loadICD(node);
if(auto node = board["mcc"]) loadMCC(node); if(auto node = board["mcc"]) loadMCC(node);
if(auto node = board["bsmemory"]) loadBSMemoryPack(node); if(auto node = board["bsmemory"]) loadBSMemoryPack(node);
@ -68,14 +68,14 @@ auto Cartridge::loadCartridge(Markup::Node node) -> void {
if(auto node = board.find("sufamiturbo")) if(node(1)) loadSufamiTurbo(node(1), 1); if(auto node = board.find("sufamiturbo")) if(node(1)) loadSufamiTurbo(node(1), 1);
if(auto node = board["nss"]) loadNSS(node); if(auto node = board["nss"]) loadNSS(node);
if(auto node = board["event"]) loadEvent(node); if(auto node = board["event"]) loadEvent(node);
if(auto node = board["sa1"]) loadSA1(node); if(auto node = board["processor(architecture=W65C816S)"]) loadSA1(node);
if(auto node = board["superfx"]) loadSuperFX(node); if(auto node = board["processor(architecture=GSU)"]) loadSuperFX(node);
if(auto node = board["armdsp"]) loadARMDSP(node); if(auto node = board["armdsp"]) loadARMDSP(node);
if(auto node = board["hitachidsp"]) loadHitachiDSP(node, node["information/board"].text().match("2DC*") ? 2 : 1); if(auto node = board["processor(architecture=HG51BS169)"]) loadHitachiDSP(node, game.board.match("2DC*") ? 2 : 1);
if(auto node = board["necdsp"]) loadNECDSP(node); if(auto node = board["necdsp"]) loadNECDSP(node);
if(auto node = board["epsonrtc"]) loadEpsonRTC(node); if(auto node = board["rtc(manufacturer=Epson)"]) loadEpsonRTC(node);
if(auto node = board["sharprtc"]) loadSharpRTC(node); if(auto node = board["rtc(manufacturer=Sharp)"]) loadSharpRTC(node);
if(auto node = board["spc7110"]) loadSPC7110(node); if(auto node = board["processor(identifier=SPC7110)"]) loadSPC7110(node);
if(auto node = board["sdd1"]) loadSDD1(node); if(auto node = board["sdd1"]) loadSDD1(node);
if(auto node = board["obc1"]) loadOBC1(node); if(auto node = board["obc1"]) loadOBC1(node);
if(auto node = board["msu1"]) loadMSU1(node); if(auto node = board["msu1"]) loadMSU1(node);
@ -196,28 +196,59 @@ auto Cartridge::loadEvent(Markup::Node node) -> void {
for(auto leaf : node["ram"].find("map")) loadMap(leaf, event.ram); for(auto leaf : node["ram"].find("map")) loadMap(leaf, event.ram);
} }
//processor(architecture=W65C816S)
auto Cartridge::loadSA1(Markup::Node node) -> void { auto Cartridge::loadSA1(Markup::Node node) -> void {
has.SA1 = true; has.SA1 = true;
loadMemory(sa1.rom, node["rom"], File::Required); for(auto map : node.find("map")) {
loadMemory(sa1.bwram, node["bwram"], File::Optional); loadMap(map, {&SA1::readIO, &sa1}, {&SA1::writeIO, &sa1});
loadMemory(sa1.iram, node["iram"], File::Optional); }
for(auto leaf : node.find("map")) loadMap(leaf, {&SA1::readIO, &sa1}, {&SA1::writeIO, &sa1}); if(auto mcu = node["mcu"]) {
for(auto leaf : node["rom"].find("map")) loadMap(leaf, {&SA1::mmcromRead, &sa1}, {&SA1::mmcromWrite, &sa1}); for(auto map : mcu.find("map")) {
for(auto leaf : node["bwram"].find("map")) loadMap(leaf, {&SA1::mmcbwramRead, &sa1}, {&SA1::mmcbwramWrite, &sa1}); loadMap(map, {&SA1::mmcromRead, &sa1}, {&SA1::mmcromWrite, &sa1});
for(auto leaf : node["iram"].find("map")) loadMap(leaf, sa1.cpuiram); }
if(auto memory = mcu["memory(type=ROM,content=Program)"]) {
loadMemory(sa1.rom, memory, File::Required);
}
}
if(auto memory = node["memory(type=RAM,content=Save)"]) {
loadMemory(sa1.bwram, memory, File::Optional);
for(auto map : memory.find("map")) {
loadMap(map, {&SA1::mmcbwramRead, &sa1}, {&SA1::mmcbwramWrite, &sa1});
}
}
if(auto memory = node["memory(type=RAM,content=Internal)"]) {
loadMemory(sa1.iram, memory, File::Optional);
for(auto map : memory.find("map")) {
loadMap(map, sa1.cpuiram);
}
}
} }
//processor(architecture=GSU)
auto Cartridge::loadSuperFX(Markup::Node node) -> void { auto Cartridge::loadSuperFX(Markup::Node node) -> void {
has.SuperFX = true; has.SuperFX = true;
loadMemory(superfx.rom, node["rom"], File::Required); for(auto map : node.find("map")) {
loadMemory(superfx.ram, node["ram"], File::Optional); loadMap(map, {&SuperFX::readIO, &superfx}, {&SuperFX::writeIO, &superfx});
}
for(auto leaf : node.find("map")) loadMap(leaf, {&SuperFX::readIO, &superfx}, {&SuperFX::writeIO, &superfx}); if(auto memory = node["memory(type=ROM,content=Program)"]) {
for(auto leaf : node["rom"].find("map")) loadMap(leaf, superfx.cpurom); loadMemory(superfx.rom, memory, File::Required);
for(auto leaf : node["ram"].find("map")) loadMap(leaf, superfx.cpuram); for(auto map : memory.find("map")) {
loadMap(map, superfx.cpurom);
}
}
if(auto memory = node["memory(type=RAM,content=Save)"]) {
loadMemory(superfx.ram, memory, File::Optional);
for(auto map : memory.find("map")) {
loadMap(map, superfx.cpuram);
}
}
} }
auto Cartridge::loadARMDSP(Markup::Node node) -> void { auto Cartridge::loadARMDSP(Markup::Node node) -> void {
@ -248,9 +279,13 @@ auto Cartridge::loadARMDSP(Markup::Node node) -> void {
for(auto leaf : node.find("map")) loadMap(leaf, {&ArmDSP::read, &armdsp}, {&ArmDSP::write, &armdsp}); for(auto leaf : node.find("map")) loadMap(leaf, {&ArmDSP::read, &armdsp}, {&ArmDSP::write, &armdsp});
} }
//processor(architecture=HG51BS169)
auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void { auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void {
has.HitachiDSP = true; has.HitachiDSP = true;
for(auto& word : hitachidsp.dataROM) word = 0x000000;
for(auto& word : hitachidsp.dataRAM) word = 0x00;
if(auto oscillator = game.oscillator()) { if(auto oscillator = game.oscillator()) {
hitachidsp.Frequency = oscillator->frequency; hitachidsp.Frequency = oscillator->frequency;
} else { } else {
@ -258,27 +293,42 @@ auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void {
} }
hitachidsp.Roms = roms; //1 or 2 hitachidsp.Roms = roms; //1 or 2
loadMemory(hitachidsp.rom, node["rom"], File::Required); for(auto map : node.find("map")) {
loadMemory(hitachidsp.ram, node["ram"], File::Optional); loadMap(map, {&HitachiDSP::dspRead, &hitachidsp}, {&HitachiDSP::dspWrite, &hitachidsp});
}
for(auto& word : hitachidsp.dataROM) word = 0x000000; if(auto memory = node["memory(type=ROM,content=Program)"]) {
for(auto& word : hitachidsp.dataRAM) word = 0x00; loadMemory(hitachidsp.rom, memory, File::Required);
for(auto map : memory.find("map")) {
loadMap(map, {&HitachiDSP::romRead, &hitachidsp}, {&HitachiDSP::romWrite, &hitachidsp});
}
}
if(auto memory = game.memory(node["memory(type=ROM,content=Data)"])) { if(auto memory = node["memory(type=RAM,content=Save)"]) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read, File::Required)) { loadMemory(hitachidsp.ram, memory, File::Optional);
for(auto map : memory.find("map")) {
loadMap(map, {&HitachiDSP::ramRead, &hitachidsp}, {&HitachiDSP::ramWrite, &hitachidsp});
}
}
if(auto memory = node["memory(type=ROM,content=Data,architecture=HG51BS169)"]) {
if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Read, File::Required)) {
for(auto n : range(1 * 1024)) hitachidsp.dataROM[n] = fp->readl(3); for(auto n : range(1 * 1024)) hitachidsp.dataROM[n] = fp->readl(3);
} }
} }
if(auto memory = game.memory(node["memory(type=RAM,content=Data)"])) { }
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) {
if(auto memory = node["memory(type=RAM,content=Data,architecture=HG51BS169)"]) {
if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Read)) {
for(auto n : range(3 * 1024)) hitachidsp.dataRAM[n] = fp->readl(1); for(auto n : range(3 * 1024)) hitachidsp.dataRAM[n] = fp->readl(1);
} }
} }
for(auto map : memory.find("map")) {
for(auto leaf : node.find("map")) loadMap(leaf, {&HitachiDSP::dspRead, &hitachidsp}, {&HitachiDSP::dspWrite, &hitachidsp}); loadMap(map, {&HitachiDSP::dramRead, &hitachidsp}, {&HitachiDSP::dramWrite, &hitachidsp});
for(auto leaf : node["rom"].find("map")) loadMap(leaf, {&HitachiDSP::romRead, &hitachidsp}, {&HitachiDSP::romWrite, &hitachidsp}); }
for(auto leaf : node["ram"].find("map")) loadMap(leaf, {&HitachiDSP::ramRead, &hitachidsp}, {&HitachiDSP::ramWrite, &hitachidsp}); }
for(auto leaf : node["dram"].find("map")) loadMap(leaf, {&HitachiDSP::dramRead, &hitachidsp}, {&HitachiDSP::dramWrite, &hitachidsp});
} }
auto Cartridge::loadNECDSP(Markup::Node node) -> void { auto Cartridge::loadNECDSP(Markup::Node node) -> void {
@ -323,47 +373,74 @@ auto Cartridge::loadNECDSP(Markup::Node node) -> void {
for(auto leaf : node["dram"].find("map")) loadMap(leaf, {&NECDSP::readRAM, &necdsp}, {&NECDSP::writeRAM, &necdsp}); for(auto leaf : node["dram"].find("map")) loadMap(leaf, {&NECDSP::readRAM, &necdsp}, {&NECDSP::writeRAM, &necdsp});
} }
//rtc(manufacturer=Epson)
auto Cartridge::loadEpsonRTC(Markup::Node node) -> void { auto Cartridge::loadEpsonRTC(Markup::Node node) -> void {
has.EpsonRTC = true; has.EpsonRTC = true;
epsonrtc.initialize(); epsonrtc.initialize();
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { for(auto map : node.find("map")) {
loadMap(map, {&EpsonRTC::read, &epsonrtc}, {&EpsonRTC::write, &epsonrtc});
}
if(auto memory = node["memory(type=RTC,content=Time,manufacturer=Epson)"]) {
if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Read)) {
uint8 data[16] = {0}; uint8 data[16] = {0};
for(auto& byte : data) byte = fp->read(); for(auto& byte : data) byte = fp->read();
epsonrtc.load(data); epsonrtc.load(data);
} }
} }
}
for(auto leaf : node.find("map")) loadMap(leaf, {&EpsonRTC::read, &epsonrtc}, {&EpsonRTC::write, &epsonrtc});
} }
//rtc(manufacturer=Sharp)
auto Cartridge::loadSharpRTC(Markup::Node node) -> void { auto Cartridge::loadSharpRTC(Markup::Node node) -> void {
has.SharpRTC = true; has.SharpRTC = true;
sharprtc.initialize(); sharprtc.initialize();
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) { for(auto map : node.find("map")) {
loadMap(map, {&SharpRTC::read, &sharprtc}, {&SharpRTC::write, &sharprtc});
}
if(auto memory = node["memory(type=RTC,content=Time,manufacturer=Sharp)"]) {
if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Read)) {
uint8 data[16] = {0}; uint8 data[16] = {0};
for(auto& byte : data) byte = fp->read(); for(auto& byte : data) byte = fp->read();
sharprtc.load(data); sharprtc.load(data);
} }
} }
}
for(auto leaf : node.find("map")) loadMap(leaf, {&SharpRTC::read, &sharprtc}, {&SharpRTC::write, &sharprtc});
} }
//processor(identifier=SPC7110)
auto Cartridge::loadSPC7110(Markup::Node node) -> void { auto Cartridge::loadSPC7110(Markup::Node node) -> void {
has.SPC7110 = true; has.SPC7110 = true;
loadMemory(spc7110.prom, node["prom"], File::Required); for(auto map : node.find("map")) {
loadMemory(spc7110.drom, node["drom"], File::Required); loadMap(map, {&SPC7110::read, &spc7110}, {&SPC7110::write, &spc7110});
loadMemory(spc7110.ram, node["ram"], File::Optional); }
for(auto leaf : node.find("map")) leaf.text() == "mcu" if(auto mcu = node["mcu"]) {
? loadMap(leaf, {&SPC7110::mcuromRead, &spc7110}, {&SPC7110::mcuromWrite, &spc7110}) for(auto map : mcu.find("map")) {
: loadMap(leaf, {&SPC7110::read, &spc7110}, {&SPC7110::write, &spc7110}); loadMap(map, {&SPC7110::mcuromRead, &spc7110}, {&SPC7110::mcuromWrite, &spc7110});
for(auto leaf : node["ram"].find("map")) loadMap(leaf, {&SPC7110::mcuramRead, &spc7110}, {&SPC7110::mcuramWrite, &spc7110}); }
if(auto memory = mcu["memory(type=ROM,content=Program)"]) {
loadMemory(spc7110.prom, memory, File::Required);
}
if(auto memory = mcu["memory(type=ROM,content=Data)"]) {
loadMemory(spc7110.drom, memory, File::Required);
}
}
if(auto memory = node["memory(type=RAM,content=Save)"]) {
loadMemory(spc7110.ram, memory, File::Optional);
for(auto map : memory.find("map")) {
loadMap(map, {&SPC7110::mcuramRead, &spc7110}, {&SPC7110::mcuramWrite, &spc7110});
}
}
} }
auto Cartridge::loadSDD1(Markup::Node node) -> void { auto Cartridge::loadSDD1(Markup::Node node) -> void {

View File

@ -1,15 +1,15 @@
auto Cartridge::saveCartridge(Markup::Node node) -> void { auto Cartridge::saveCartridge(Markup::Node node) -> void {
if(auto node = board["memory(type=RAM)"]) saveRAM(node); if(auto node = board["memory(type=RAM,content=Save)"]) saveRAM(node);
if(auto node = board["mcc"]) saveMCC(node); if(auto node = board["mcc"]) saveMCC(node);
if(auto node = board["event"]) saveEvent(node); if(auto node = board["event"]) saveEvent(node);
if(auto node = board["sa1"]) saveSA1(node); if(auto node = board["processor(architecture=W65C816S)"]) saveSA1(node);
if(auto node = board["superfx"]) saveSuperFX(node); if(auto node = board["processor(architecture=GSU)"]) saveSuperFX(node);
if(auto node = board["armdsp"]) saveARMDSP(node); if(auto node = board["armdsp"]) saveARMDSP(node);
if(auto node = board["hitachidsp"]) saveHitachiDSP(node); if(auto node = board["processor(architecture=HG51BS169)"]) saveHitachiDSP(node);
if(auto node = board["necdsp"]) saveNECDSP(node); if(auto node = board["necdsp"]) saveNECDSP(node);
if(auto node = board["epsonrtc"]) saveEpsonRTC(node); if(auto node = board["rtc(manufacturer=Epson)"]) saveEpsonRTC(node);
if(auto node = board["sharprtc"]) saveSharpRTC(node); if(auto node = board["rtc(manufacturer=Sharp)"]) saveSharpRTC(node);
if(auto node = board["spc7110"]) saveSPC7110(node); if(auto node = board["processor(identifier=SPC7110)"]) saveSPC7110(node);
if(auto node = board["sdd1"]) saveSDD1(node); if(auto node = board["sdd1"]) saveSDD1(node);
if(auto node = board["obc1"]) saveOBC1(node); if(auto node = board["obc1"]) saveOBC1(node);
} }
@ -42,13 +42,22 @@ auto Cartridge::saveEvent(Markup::Node node) -> void {
saveMemory(event.ram, node["ram"]); saveMemory(event.ram, node["ram"]);
} }
//processor(architecture=W65C816S)
auto Cartridge::saveSA1(Markup::Node node) -> void { auto Cartridge::saveSA1(Markup::Node node) -> void {
saveMemory(sa1.bwram, node["bwram"]); if(auto memory = node["memory(type=RAM,content=Save)"]) {
saveMemory(sa1.iram, node["iram"]); saveMemory(sa1.bwram, memory);
}
if(auto memory = node["memory(type=RAM,content=Internal)"]) {
saveMemory(sa1.iram, memory);
}
} }
//processor(architecture=GSU)
auto Cartridge::saveSuperFX(Markup::Node node) -> void { auto Cartridge::saveSuperFX(Markup::Node node) -> void {
saveMemory(superfx.ram, node["ram"]); if(auto memory = node["memory(type=RAM,content=Save)"]) {
saveMemory(superfx.ram, memory);
}
} }
auto Cartridge::saveARMDSP(Markup::Node node) -> void { auto Cartridge::saveARMDSP(Markup::Node node) -> void {
@ -61,16 +70,23 @@ auto Cartridge::saveARMDSP(Markup::Node node) -> void {
} }
} }
//processor(architecture=HG51BS169)
auto Cartridge::saveHitachiDSP(Markup::Node node) -> void { auto Cartridge::saveHitachiDSP(Markup::Node node) -> void {
saveMemory(hitachidsp.ram, node["ram"]); saveMemory(hitachidsp.ram, node["ram"]);
if(auto memory = game.memory(node["memory(type=RAM,content=Data)"])) { if(auto memory = node["memory(type=RAM,content=Save)"]) {
if(memory->nonVolatile) { saveMemory(hitachidsp.ram, memory);
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { }
if(auto memory = node["memory(type=RAM,content=Data,architecture=HG51BS169)"]) {
if(auto file = game.memory(memory)) {
if(file->nonVolatile) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Write)) {
for(auto n : range(3 * 1024)) fp->write(hitachidsp.dataRAM[n]); for(auto n : range(3 * 1024)) fp->write(hitachidsp.dataRAM[n]);
} }
} }
} }
}
} }
auto Cartridge::saveNECDSP(Markup::Node node) -> void { auto Cartridge::saveNECDSP(Markup::Node node) -> void {
@ -84,32 +100,41 @@ auto Cartridge::saveNECDSP(Markup::Node node) -> void {
} }
} }
//rtc(manufacturer=Epson)
auto Cartridge::saveEpsonRTC(Markup::Node node) -> void { auto Cartridge::saveEpsonRTC(Markup::Node node) -> void {
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) { if(auto memory = node["memory(type=RTC,content=Time,manufacturer=Epson)"]) {
if(memory->nonVolatile) { if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { if(file->nonVolatile) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Write)) {
uint8 data[16] = {0}; uint8 data[16] = {0};
epsonrtc.save(data); epsonrtc.save(data);
fp->write(data, 16); fp->write(data, 16);
} }
} }
} }
}
} }
//rtc(manufacturer=Sharp)
auto Cartridge::saveSharpRTC(Markup::Node node) -> void { auto Cartridge::saveSharpRTC(Markup::Node node) -> void {
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) { if(auto memory = node["memory(type=RTC,content=Time,manufacturer=Sharp)"]) {
if(memory->nonVolatile) { if(auto file = game.memory(memory)) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Write)) { if(file->nonVolatile) {
if(auto fp = platform->open(ID::SuperFamicom, file->name(), File::Write)) {
uint8 data[16] = {0}; uint8 data[16] = {0};
sharprtc.save(data); sharprtc.save(data);
fp->write(data, 16); fp->write(data, 16);
} }
} }
} }
}
} }
//processor(identifier=SPC7110)
auto Cartridge::saveSPC7110(Markup::Node node) -> void { auto Cartridge::saveSPC7110(Markup::Node node) -> void {
saveMemory(spc7110.ram, node["ram"]); if(auto memory = node["memory(type=RAM,content=Save)"]) {
saveMemory(spc7110.ram, memory);
}
} }
auto Cartridge::saveSDD1(Markup::Node node) -> void { auto Cartridge::saveSDD1(Markup::Node node) -> void {

View File

@ -9,25 +9,24 @@ auto SuperFX::color(uint8 source) -> uint8 {
} }
auto SuperFX::plot(uint8 x, uint8 y) -> void { auto SuperFX::plot(uint8 x, uint8 y) -> void {
uint8 color = regs.colr;
if(regs.por.dither && regs.scmr.md != 3) {
if((x ^ y) & 1) color >>= 4;
color &= 0x0f;
}
if(!regs.por.transparent) { if(!regs.por.transparent) {
if(regs.scmr.md == 3) { if(regs.scmr.md == 3) {
if(regs.por.freezehigh) { if(regs.por.freezehigh) {
if((color & 0x0f) == 0) return; if((regs.colr & 0x0f) == 0) return;
} else { } else {
if(color == 0) return; if(regs.colr == 0) return;
} }
} else { } else {
if((color & 0x0f) == 0) return; if((regs.colr & 0x0f) == 0) return;
} }
} }
uint8 color = regs.colr;
if(regs.por.dither && regs.scmr.md != 3) {
if((x ^ y) & 1) color >>= 4;
color &= 0x0f;
}
uint16 offset = (y << 5) + (x >> 3); uint16 offset = (y << 5) + (x >> 3);
if(offset != pixelcache[0].offset) { if(offset != pixelcache[0].offset) {
flushPixelCache(pixelcache[1]); flushPixelCache(pixelcache[1]);

View File

@ -1,10 +1,10 @@
database database
revision: 2018-04-15 revision: 2018-05-08
//Boards (Production) //Boards (Production)
database database
revision: 2018-04-10 revision: 2018-05-08
board: BANDAI-PT-923 board: BANDAI-PT-923
memory type=ROM content=Program memory type=ROM content=Program
@ -63,36 +63,38 @@ board: BSC-1J5M-01
map address=60-7d,e0-ff:0000-ffff map address=60-7d,e0-ff:0000-ffff
board: BSC-1L3B-01 board: BSC-1L3B-01
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
slot type=BSMemory
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
memory type=RAM content=Internal memory type=RAM content=Internal
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
slot type=BSMemory
board: BSC-1L5B-01 board: BSC-1L5B-01
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
slot type=BSMemory
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
memory type=RAM content=Internal memory type=RAM content=Internal
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
slot type=BSMemory
board: SGB-R-10 board: SGB-R-10
memory type=ROM content=Program memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=00-7d,80-ff:8000-ffff mask=0x8000
map address=40-7d,c0-ff:0000-7fff mask=0x8000 map address=40-7d,c0-ff:0000-7fff mask=0x8000
icd revision=2 processor identifier=ICD revision=2
map address=00-3f,80-bf:6000-67ff,7000-7fff map address=00-3f,80-bf:6000-67ff,7000-7fff
memory type=ROM content=Boot architecture=LR35902 memory type=ROM content=Boot architecture=LR35902
slot type=GameBoy slot type=GameBoy
@ -147,7 +149,7 @@ board: SHVC-1A5M-(01,11,20)
board: SHVC-1B0N-(02,03,10) board: SHVC-1B0N-(02,03,10)
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
necdsp model=uPD7725 processor architecture=uPD7725
map address=30-3f,b0-bf:8000-ffff mask=0x3fff map address=30-3f,b0-bf:8000-ffff mask=0x3fff
memory type=ROM content=Program architecture=uPD7725 memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data architecture=uPD7725 memory type=ROM content=Data architecture=uPD7725
@ -159,7 +161,7 @@ board: SHVC-1B5B-02
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-ffff map address=70-7d,f0-ff:0000-ffff
necdsp model=uPD7725 processor architecture=uPD7725
map address=20-3f,a0-bf:8000-ffff mask=0x3fff map address=20-3f,a0-bf:8000-ffff mask=0x3fff
memory type=ROM content=Program architecture=uPD7725 memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data architecture=uPD7725 memory type=ROM content=Data architecture=uPD7725
@ -167,7 +169,7 @@ board: SHVC-1B5B-02
oscillator oscillator
board: SHVC-1C0N board: SHVC-1C0N
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
@ -175,7 +177,7 @@ board: SHVC-1C0N
map address=60-7d,e0-ff:0000-ffff map address=60-7d,e0-ff:0000-ffff
board: SHVC-1C0N5S-01 board: SHVC-1C0N5S-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
@ -183,7 +185,7 @@ board: SHVC-1C0N5S-01
map address=60-7d,e0-ff:0000-ffff map address=60-7d,e0-ff:0000-ffff
board: SHVC-1CA0N5S-01 board: SHVC-1CA0N5S-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
@ -193,7 +195,7 @@ board: SHVC-1CA0N5S-01
map address=70-71,f0-f1:0000-ffff map address=70-71,f0-f1:0000-ffff
board: SHVC-1CA0N6S-01 board: SHVC-1CA0N6S-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
@ -203,7 +205,7 @@ board: SHVC-1CA0N6S-01
map address=70-71,f0-f1:0000-ffff map address=70-71,f0-f1:0000-ffff
board: SHVC-1CA6B-01 board: SHVC-1CA6B-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
@ -213,7 +215,7 @@ board: SHVC-1CA6B-01
map address=70-71,f0-f1:0000-ffff map address=70-71,f0-f1:0000-ffff
board: SHVC-1CB0N7S-01 board: SHVC-1CB0N7S-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f:8000-ffff mask=0x8000 map address=00-3f:8000-ffff mask=0x8000
@ -223,7 +225,7 @@ board: SHVC-1CB0N7S-01
map address=70-71:0000-ffff map address=70-71:0000-ffff
board: SHVC-1CB5B-20 board: SHVC-1CB5B-20
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f:8000-ffff mask=0x8000 map address=00-3f:8000-ffff mask=0x8000
@ -233,7 +235,7 @@ board: SHVC-1CB5B-20
map address=70-71:0000-ffff map address=70-71:0000-ffff
board: SHVC-1CB7B-01 board: SHVC-1CB7B-01
superfx processor architecture=GSU
map address=00-3f,80-bf:3000-34ff map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f:8000-ffff mask=0x8000 map address=00-3f:8000-ffff mask=0x8000
@ -243,11 +245,12 @@ board: SHVC-1CB7B-01
map address=70-71:0000-ffff map address=70-71:0000-ffff
board: SHVC-1DC0N-01 board: SHVC-1DC0N-01
hitachidsp model=HG51BS169 processor architecture=HG51BS169
map address=00-3f,80-bf:6c00-6fff,7c00-7fff map address=00-3f,80-bf:6c00-6fff,7c00-7fff
map address=70-77:0000-7fff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=RAM content=Save
map address=70-77:0000-7fff
memory type=ROM content=Data architecture=HG51BS169 memory type=ROM content=Data architecture=HG51BS169
memory type=RAM content=Data architecture=HG51BS169 memory type=RAM content=Data architecture=HG51BS169
map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000
@ -256,7 +259,7 @@ board: SHVC-1DC0N-01
board: SHVC-1DS0B-20 board: SHVC-1DS0B-20
memory type=ROM content=Program memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=00-7d,80-ff:8000-ffff mask=0x8000
necdsp model=uPD96050 processor architecture=uPD96050
map address=60-67,e0-e7:0000-3fff map address=60-67,e0-e7:0000-3fff
memory type=ROM content=Program architecture=uPD96050 memory type=ROM content=Program architecture=uPD96050
memory type=ROM content=Data architecture=uPD96050 memory type=ROM content=Data architecture=uPD96050
@ -301,7 +304,7 @@ board: SHVC-1K0N-01
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff map address=40-7d,c0-ff:0000-ffff
necdsp model=uPD7725 processor architecture=uPD7725
map address=00-1f,80-9f:6000-7fff mask=0xfff map address=00-1f,80-9f:6000-7fff mask=0xfff
memory type=ROM content=Program architecture=uPD7725 memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data architecture=uPD7725 memory type=ROM content=Data architecture=uPD7725
@ -314,7 +317,7 @@ board: SHVC-1K1B-01
map address=40-7d,c0-ff:0000-ffff map address=40-7d,c0-ff:0000-ffff
memory type=RAM content=Save memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
necdsp model=uPD7725 processor architecture=uPD7725
map address=00-1f,80-9f:6000-7fff mask=0xfff map address=00-1f,80-9f:6000-7fff mask=0xfff
memory type=ROM content=Program architecture=uPD7725 memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data architecture=uPD7725 memory type=ROM content=Data architecture=uPD7725
@ -322,11 +325,12 @@ board: SHVC-1K1B-01
oscillator oscillator
board: SHVC-1L0N3S-01 board: SHVC-1L0N3S-01
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
@ -334,11 +338,12 @@ board: SHVC-1L0N3S-01
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
board: SHVC-1L3B-(02,11) board: SHVC-1L3B-(02,11)
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
@ -346,11 +351,12 @@ board: SHVC-1L3B-(02,11)
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
board: SHVC-1L5B-(11,20) board: SHVC-1L5B-(11,20)
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
@ -358,11 +364,12 @@ board: SHVC-1L5B-(11,20)
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
board: SHVC-1N0N-(01,10) board: SHVC-1N0N-(01,10)
sdd1 processor identifier=SDD1
map address=00-3f,80-bf:4800-480f map address=00-3f,80-bf:4800-480f
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
board: SHVC-2A0N-01#A board: SHVC-2A0N-01#A
memory type=ROM content=Program memory type=ROM content=Program
@ -409,7 +416,7 @@ board: SHVC-2B3B-01
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-7fff mask=0x8000 map address=70-7d,f0-ff:0000-7fff mask=0x8000
necdsp model=uPD7725 processor architecture=uPD7725
map address=60-6f,e0-ef:0000-7fff mask=0x3fff map address=60-6f,e0-ef:0000-7fff mask=0x3fff
memory type=ROM content=Program architecture=uPD7725 memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data architecture=uPD7725 memory type=ROM content=Data architecture=uPD7725
@ -417,11 +424,12 @@ board: SHVC-2B3B-01
oscillator oscillator
board: SHVC-2DC0N-01 board: SHVC-2DC0N-01
hitachidsp model=HG51BS169 processor architecture=HG51BS169
map address=00-3f,80-bf:6c00-6fff,7c00-7fff map address=00-3f,80-bf:6c00-6fff,7c00-7fff
map address=70-77:0000-7fff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=RAM content=Save
map address=70-77:0000-7fff
memory type=ROM content=Data architecture=HG51BS169 memory type=ROM content=Data architecture=HG51BS169
memory type=RAM content=Data architecture=HG51BS169 memory type=RAM content=Data architecture=HG51BS169
map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000
@ -430,7 +438,7 @@ board: SHVC-2DC0N-01
board: SHVC-2E3M-01 board: SHVC-2E3M-01
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
obc1 processor identifier=OBC1
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000 map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000
memory type=RAM content=Save memory type=RAM content=Save
@ -488,7 +496,7 @@ board: SHVC-BJ1M-(10,20)
memory type=RAM content=Save memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
board: SHVC-BJ3M-10 board: SHVC-BJ3M-(10,20)
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff map address=40-7d,c0-ff:0000-ffff
@ -496,25 +504,27 @@ board: SHVC-BJ3M-10
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
board: SHVC-LDH3C-01 board: SHVC-LDH3C-01
spc7110 processor identifier=SPC7110
map address=00-3f,80-bf:4800-483f map address=00-3f,80-bf:4800-483f
map address=50,58:0000-ffff map address=50,58:0000-ffff
map=mcu address=00-3f,80-bf:8000-ffff mask=0x800000 mcu
map=mcu address=c0-ff:0000-ffff mask=0xc00000 map address=00-3f,80-bf:8000-ffff mask=0x800000
map address=c0-ff:0000-ffff mask=0xc00000
memory type=ROM content=Program memory type=ROM content=Program
memory type=ROM content=Data memory type=ROM content=Data
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
epsonrtc rtc manufacturer=Epson
map address=00-3f,80-bf:4840-4842 map address=00-3f,80-bf:4840-4842
memory type=RTC content=Time manufacturer=Epson memory type=RTC content=Time manufacturer=Epson
board: SHVC-LN3B-01 board: SHVC-LN3B-01
sdd1 processor identifier=SDD1
map address=00-3f,80-bf:4800-480f map address=00-3f,80-bf:4800-480f
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-73:0000-ffff map address=70-73:0000-ffff
@ -523,7 +533,7 @@ board: SHVC-SGB2-01
memory type=ROM content=Program memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=00-7d,80-ff:8000-ffff mask=0x8000
map address=40-7d,c0-ff:0000-7fff mask=0x8000 map address=40-7d,c0-ff:0000-7fff mask=0x8000
icd revision=2 processor identifier=ICD revision=2
map address=00-3f,80-bf:6000-67ff,7000-7fff map address=00-3f,80-bf:6000-67ff,7000-7fff
memory type=ROM content=Boot architecture=LR35902 memory type=ROM content=Boot architecture=LR35902
oscillator oscillator
@ -542,7 +552,7 @@ board: SHVC-YJ0N-01
//Boards (Generic) //Boards (Generic)
database database
revision: 2018-04-08 revision: 2018-05-08
board: ARM-LOROM-RAM board: ARM-LOROM-RAM
memory type=ROM content=Program memory type=ROM content=Program
@ -550,11 +560,11 @@ board: ARM-LOROM-RAM
map address=40-6f,c0-ef:0000-7fff mask=0x8000 map address=40-6f,c0-ef:0000-7fff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-ffff map address=70-7d,f0-ff:0000-ffff
armdsp processor architecture=ARM6
map address=00-3f,80-bf:3800-38ff map address=00-3f,80-bf:3800-38ff
memory type=ROM content=Program manufacturer=SETA memory type=ROM content=Program architecture=ARM6
memory type=ROM content=Data manufacturer=SETA memory type=ROM content=Data architecture=ARM6
memory type=RAM content=Data manufacturer=SETA memory type=RAM content=Data architecture=ARM6
oscillator oscillator
board: BS-HIROM-RAM board: BS-HIROM-RAM
@ -563,7 +573,7 @@ board: BS-HIROM-RAM
map address=40-5f,c0-df:0000-ffff map address=40-5f,c0-df:0000-ffff
memory type=RAM content=Save memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
bsmemory slot type=BSMemory
map address=20-3f,a0-bf:8000-ffff map address=20-3f,a0-bf:8000-ffff
map address=60-7d,e0-ff:0000-ffff map address=60-7d,e0-ff:0000-ffff
@ -575,33 +585,89 @@ board: BS-LOROM-RAM
map address=a0-bf:8000-ffff base=0x100000 mask=0x8000 map address=a0-bf:8000-ffff base=0x100000 mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-7fff mask=0x8000 map address=70-7d,f0-ff:0000-7fff mask=0x8000
bsmemory slot type=BSMemory
map address=c0-ef:0000-ffff map address=c0-ef:0000-ffff
board: BS-MCC-RAM board: BS-MCC-RAM
memory type=RAM content=Save memory type=RAM content=Save
map address=10-1f:5000-5fff mask=0xf000 map address=10-1f:5000-5fff mask=0xf000
mcc processor identifier=MCC
map address=00-0f:5000 map address=00-0f:5000
map=mcu address=00-3f,80-bf:8000-ffff mask=0x408000 mcu
map=mcu address=40-7d,c0-ff:0000-ffff map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=40-7d,c0-ff:0000-ffff
memory type=ROM content=Program memory type=ROM content=Program
slot type=BSMemory
memory type=RAM content=Download memory type=RAM content=Download
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
bsmemory
board: BS-SA1-RAM board: BS-SA1-RAM
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
slot type=BSMemory
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
memory type=RAM content=Internal memory type=RAM content=Internal
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
bsmemory
board: EXHIROM-RAM
memory type=ROM content=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
memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000
map address=70-7d:0000-7fff
board: EXHIROM-RAM-SHARPRTC
memory type=ROM content=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
memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000
map address=70-7d:0000-7fff
rtc manufacturer=Sharp
map address=00-3f,80-bf:2800-2801
memory type=RTC content=Time manufacturer=Sharp
board: EXNEC-LOROM
memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000
processor architecture=uPD96050
map address=60-67,e0-e7:0000-3fff
memory type=ROM content=Program architecture=uPD96050
memory type=ROM content=Data architecture=uPD96050
memory type=RAM content=Data architecture=uPD96050
map address=68-6f,e8-ef:0000-7fff mask=0x8000
oscillator
board: GB-LOROM
memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000
map address=40-7d,c0-ff:0000-7fff mask=0x8000
processor identifier=ICD revision=2
map address=00-3f,80-bf:6000-67ff,7000-7fff
memory type=ROM content=Boot architecture=LR35902
oscillator
slot type=GameBoy
board: GSU-RAM
processor architecture=GSU
map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000
map address=40-5f,c0-df:0000-ffff
memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000
map address=70-71,f0-f1:0000-ffff
board: HIROM board: HIROM
memory type=ROM content=Program memory type=ROM content=Program
@ -615,24 +681,15 @@ board: HIROM-RAM
memory type=RAM content=Save memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
board: HIROMEX-RAM
memory type=ROM content=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
memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000
map address=70-7d:0000-7fff
board: HITACHI-LOROM board: HITACHI-LOROM
hitachidsp model=HG51BS169 processor architecture=HG51BS169
map address=00-3f,80-bf:6c00-6fff,7c00-7fff map address=00-3f,80-bf:6c00-6fff,7c00-7fff
map address=70-77:0000-7fff
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=ROM content=Data manufacturer=Hitachi memory type=RAM content=Save
memory type=RAM content=Data manufacturer=Hitachi map address=70-77:0000-7fff
memory type=ROM content=Data architecture=HG51BS169
memory type=RAM content=Data architecture=HG51BS169
map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000
oscillator oscillator
@ -640,13 +697,13 @@ board: LOROM
memory type=ROM content=Program memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=00-7d,80-ff:8000-ffff mask=0x8000
board: LOROM-RAM board: LOROM-RAM#A
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-ffff mask=0x8000 map address=70-7d,f0-ff:0000-ffff mask=0x8000
board: LOROMEX-RAM board: LOROM-RAM#B
memory type=ROM content=Program memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=00-7d,80-ff:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
@ -656,11 +713,11 @@ board: NEC-HIROM
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff map address=40-7d,c0-ff:0000-ffff
necdsp model=uPD7725 processor architecture=uPD7725
map address=00-1f,80-9f:6000-7fff mask=0xfff map address=00-1f,80-9f:6000-7fff mask=0xfff
memory type=ROM content=Program manufacturer=NEC memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data manufacturer=NEC memory type=ROM content=Data architecture=uPD7725
memory type=RAM content=Data manufacturer=NEC memory type=RAM content=Data architecture=uPD7725
oscillator oscillator
board: NEC-HIROM-RAM board: NEC-HIROM-RAM
@ -669,85 +726,62 @@ board: NEC-HIROM-RAM
map address=40-7d,c0-ff:0000-ffff map address=40-7d,c0-ff:0000-ffff
memory type=RAM content=Save memory type=RAM content=Save
map address=20-3f,a0-bf:6000-7fff mask=0xe000 map address=20-3f,a0-bf:6000-7fff mask=0xe000
necdsp model=uPD7725 processor architecture=uPD7725
map address=00-1f,80-9f:6000-7fff mask=0xfff map address=00-1f,80-9f:6000-7fff mask=0xfff
memory type=ROM content=Program manufacturer=NEC memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data manufacturer=NEC memory type=ROM content=Data architecture=uPD7725
memory type=RAM content=Data manufacturer=NEC memory type=RAM content=Data architecture=uPD7725
oscillator oscillator
board: NEC-LOROM board: NEC-LOROM
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
necdsp model=uPD7725 processor architecture=uPD7725
map address=30-3f,b0-bf:8000-ffff mask=0x3fff map address=30-3f,b0-bf:8000-ffff mask=0x3fff
memory type=ROM content=Program manufacturer=NEC memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data manufacturer=NEC memory type=ROM content=Data architecture=uPD7725
memory type=RAM content=Data manufacturer=NEC memory type=RAM content=Data architecture=uPD7725
oscillator oscillator
board: NEC-LOROM-RAM board: NEC-LOROM-RAM#A
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-ffff map address=70-7d,f0-ff:0000-ffff
necdsp model=uPD7725 processor architecture=uPD7725
map address=20-3f,a0-bf:8000-ffff mask=0x3fff map address=20-3f,a0-bf:8000-ffff mask=0x3fff
memory type=ROM content=Program manufacturer=NEC memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data manufacturer=NEC memory type=ROM content=Data architecture=uPD7725
memory type=RAM content=Data manufacturer=NEC memory type=RAM content=Data architecture=uPD7725
oscillator oscillator
board: NEC-LOROMEX-RAM board: NEC-LOROM-RAM#B
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
memory type=RAM content=Save memory type=RAM content=Save
map address=70-7d,f0-ff:0000-7fff mask=0x8000 map address=70-7d,f0-ff:0000-7fff mask=0x8000
necdsp model=uPD7725 processor architecture=uPD7725
map address=60-6f,e0-ef:0000-7fff mask=0x3fff map address=60-6f,e0-ef:0000-7fff mask=0x3fff
memory type=ROM content=Program manufacturer=NEC memory type=ROM content=Program architecture=uPD7725
memory type=ROM content=Data manufacturer=NEC memory type=ROM content=Data architecture=uPD7725
memory type=RAM content=Data manufacturer=NEC memory type=RAM content=Data architecture=uPD7725
oscillator
board: NECEX-LOROM-BATTERY
memory type=ROM content=Program
map address=00-7d,80-ff:8000-ffff mask=0x8000
necdsp model=uPD96050
map address=60-67,e0-e7:0000-3fff
memory type=ROM content=Program manufacturer=NEC
memory type=ROM content=Data manufacturer=NEC
memory type=RAM content=Data manufacturer=NEC
map address=68-6f,e8-ef:0000-7fff mask=0x8000
oscillator oscillator
board: OBC1-LOROM-RAM board: OBC1-LOROM-RAM
memory type=ROM content=Program memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000 map address=00-3f,80-bf:8000-ffff mask=0x8000
obc1 processor identifier=OBC1
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000 map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000
memory type=RAM content=Save memory type=RAM content=Save
board: RTC-HIROMEX-RAM
memory type=ROM content=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
memory type=RAM content=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
memory type=RTC manufacturer=Sharp
board: SA1-RAM board: SA1-RAM
sa1 processor architecture=W65C816S
map address=00-3f,80-bf:2200-23ff map address=00-3f,80-bf:2200-23ff
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff mask=0x408000 map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000 map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff map address=40-4f:0000-ffff
@ -755,78 +789,62 @@ board: SA1-RAM
map address=00-3f,80-bf:3000-37ff size=0x800 map address=00-3f,80-bf:3000-37ff size=0x800
board: SDD1 board: SDD1
sdd1 processor identifier=SDD1
map address=00-3f,80-bf:4800-480f map address=00-3f,80-bf:4800-480f
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
board: SDD1-RAM board: SDD1-RAM
sdd1 processor identifier=SDD1
map address=00-3f,80-bf:4800-480f map address=00-3f,80-bf:4800-480f
memory type=ROM content=Program mcu
map address=00-3f,80-bf:8000-ffff map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff map address=c0-ff:0000-ffff
memory type=ROM content=Program
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-73:0000-ffff mask=0x8000 map address=70-73:0000-ffff mask=0x8000
board: SGB-LOROM
memory type=ROM content=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
memory type=ROM content=Boot manufacturer=Nintendo
oscillator
gameboy
board: SPC7110-RAM board: SPC7110-RAM
spc7110 processor identifier=SPC7110
map address=00-3f,80-bf:4800-483f map address=00-3f,80-bf:4800-483f
map address=50,58:0000-ffff map address=50,58:0000-ffff
map type=MCU address=00-3f,80-bf:8000-ffff mask=0x800000 mcu
map type=MCU address=c0-ff:0000-ffff mask=0xc00000 map address=00-3f,80-bf:8000-ffff mask=0x800000
map address=c0-ff:0000-ffff mask=0xc00000
memory type=ROM content=Program memory type=ROM content=Program
memory type=ROM content=Data memory type=ROM content=Data
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
board: SPC7110-RTC-RAM board: SPC7110-RAM-EPSONRTC
spc7110 processor identifier=SPC7110
map address=00-3f,80-bf:4800-483f map address=00-3f,80-bf:4800-483f
map address=50,58:0000-ffff map address=50,58:0000-ffff
map type=MCU address=00-3f,80-bf:8000-ffff mask=0x800000 mcu
map type=MCU address=c0-ff:0000-ffff mask=0xc00000 map address=00-3f,80-bf:8000-ffff mask=0x800000
map address=c0-ff:0000-ffff mask=0xc00000
memory type=ROM content=Program memory type=ROM content=Program
memory type=ROM content=Data memory type=ROM content=Data
memory type=RAM content=Save memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff mask=0xe000 map address=00-3f,80-bf:6000-7fff mask=0xe000
epsonrtc rtc manufacturer=Epson
map address=00-3f,80-bf:4800-4842 map address=00-3f,80-bf:4800-4842
memory type=RTC manufacturer=Epson memory type=RTC content=Time manufacturer=Epson
board: ST-LOROM board: ST-LOROM
memory type=ROM content=Program memory type=ROM content=Program
map address=00-1f,80-9f:8000-ffff mask=0x8000 map address=00-1f,80-9f:8000-ffff mask=0x8000
sufamiturbo slot type=SufamiTurbo
rom rom
map address=20-3f,a0-bf:8000-ffff mask=0x8000 map address=20-3f,a0-bf:8000-ffff mask=0x8000
ram ram
map address=60-6f,e0-ef:0000-ffff map address=60-6f,e0-ef:0000-ffff
sufamiturbo slot type=SufamiTurbo
rom rom
map address=40-5f,c0-df:0000-ffff mask=0x8000 map address=40-5f,c0-df:0000-ffff mask=0x8000
ram ram
map address=70-7d,f0-ff:0000-ffff map address=70-7d,f0-ff:0000-ffff
board: SUPERFX-RAM
superfx
map address=00-3f,80-bf:3000-34ff
memory type=ROM content=Program
map address=00-3f,80-bf:8000-ffff mask=0x8000
map address=40-5f,c0-df:0000-ffff
memory type=RAM content=Save
map address=00-3f,80-bf:6000-7fff size=0x2000
map address=70-71,f0-f1:0000-ffff

View File

@ -91,8 +91,9 @@ else ifneq ($(filter $(platform),linux bsd),)
mkdir -p $(prefix)/share/applications/ mkdir -p $(prefix)/share/applications/
mkdir -p $(prefix)/share/icons/ mkdir -p $(prefix)/share/icons/
mkdir -p $(prefix)/share/$(name)/ mkdir -p $(prefix)/share/$(name)/
mkdir -p $(prefix)/share/$(name)/systems/
cp out/$(name) $(prefix)/bin/$(name) cp out/$(name) $(prefix)/bin/$(name)
cp -R systems/* $(prefix)/share/$(name)/ cp -R systems/* $(prefix)/share/$(name)/systems/
cp data/$(name).desktop $(prefix)/share/applications/$(name).desktop cp data/$(name).desktop $(prefix)/share/applications/$(name).desktop
cp data/$(name).png $(prefix)/share/icons/$(name).png cp data/$(name).png $(prefix)/share/icons/$(name).png
endif endif

View File

@ -342,7 +342,7 @@ auto Presentation::loadSystems() -> void {
} }
auto Presentation::loadShaders() -> void { auto Presentation::loadShaders() -> void {
auto pathname = locate("Video Shaders/"); auto pathname = locate("shaders/");
if(settings["Video/Driver"].text() == "OpenGL") { if(settings["Video/Driver"].text() == "OpenGL") {
for(auto shader : directory::folders(pathname, "*.shader")) { for(auto shader : directory::folders(pathname, "*.shader")) {

View File

@ -17,7 +17,7 @@ auto Program::loadMedium() -> void {
auto Program::loadMedium(Emulator::Interface& interface, const Emulator::Interface::Medium& medium) -> void { auto Program::loadMedium(Emulator::Interface& interface, const Emulator::Interface::Medium& medium) -> void {
unloadMedium(); unloadMedium();
mediumPaths.append(locate({medium.name, ".sys/"})); mediumPaths.append(locate({"systems/", medium.name, ".sys/"}));
Emulator::audio.reset(2, audio->frequency()); Emulator::audio.reset(2, audio->frequency());
inputManager->bind(emulator = &interface); inputManager->bind(emulator = &interface);

View File

@ -43,13 +43,14 @@ else ifneq ($(filter $(platform),linux bsd),)
mkdir -p $(prefix)/bin/ mkdir -p $(prefix)/bin/
mkdir -p $(prefix)/share/applications/ mkdir -p $(prefix)/share/applications/
mkdir -p $(prefix)/share/icons/ mkdir -p $(prefix)/share/icons/
mkdir -p $(prefix)/share/$(name)/Database/ mkdir -p $(prefix)/share/$(name)/
mkdir -p $(prefix)/share/$(name)/Firmware/ mkdir -p $(prefix)/share/$(name)/database/
mkdir -p $(prefix)/share/$(name)/firmware/
cp out/$(name) $(prefix)/bin/$(name) cp out/$(name) $(prefix)/bin/$(name)
cp data/$(name).desktop $(prefix)/share/applications/$(name).desktop cp data/$(name).desktop $(prefix)/share/applications/$(name).desktop
cp data/$(name).png $(prefix)/share/icons/$(name).png cp data/$(name).png $(prefix)/share/icons/$(name).png
cp -R Database/* $(prefix)/share/$(name)/Database/ cp -R database/* $(prefix)/share/$(name)/database/
cp -R Firmware/* $(prefix)/share/$(name)/Firmware/ cp -R firmware/* $(prefix)/share/$(name)/firmware/
endif endif
uninstall: uninstall:

View File

@ -1,19 +1,19 @@
Icarus::Icarus() { Icarus::Icarus() {
Database::Famicom = BML::unserialize(string::read(locate("Database/Famicom.bml"))); Database::Famicom = BML::unserialize(string::read(locate("database/Famicom.bml")));
Database::SuperFamicom = BML::unserialize(string::read(locate("Database/Super Famicom.bml"))); Database::SuperFamicom = BML::unserialize(string::read(locate("database/Super Famicom.bml")));
Database::MasterSystem = BML::unserialize(string::read(locate("Database/Master System.bml"))); Database::MasterSystem = BML::unserialize(string::read(locate("database/Master System.bml")));
Database::MegaDrive = BML::unserialize(string::read(locate("Database/Mega Drive.bml"))); Database::MegaDrive = BML::unserialize(string::read(locate("database/Mega Drive.bml")));
Database::PCEngine = BML::unserialize(string::read(locate("Database/PC Engine.bml"))); Database::PCEngine = BML::unserialize(string::read(locate("database/PC Engine.bml")));
Database::SuperGrafx = BML::unserialize(string::read(locate("Database/SuperGrafx.bml"))); Database::SuperGrafx = BML::unserialize(string::read(locate("database/SuperGrafx.bml")));
Database::GameBoy = BML::unserialize(string::read(locate("Database/Game Boy.bml"))); Database::GameBoy = BML::unserialize(string::read(locate("database/Game Boy.bml")));
Database::GameBoyColor = BML::unserialize(string::read(locate("Database/Game Boy Color.bml"))); Database::GameBoyColor = BML::unserialize(string::read(locate("database/Game Boy Color.bml")));
Database::GameBoyAdvance = BML::unserialize(string::read(locate("Database/Game Boy Advance.bml"))); Database::GameBoyAdvance = BML::unserialize(string::read(locate("database/Game Boy Advance.bml")));
Database::GameGear = BML::unserialize(string::read(locate("Database/Game Gear.bml"))); Database::GameGear = BML::unserialize(string::read(locate("database/Game Gear.bml")));
Database::WonderSwan = BML::unserialize(string::read(locate("Database/WonderSwan.bml"))); Database::WonderSwan = BML::unserialize(string::read(locate("database/WonderSwan.bml")));
Database::WonderSwanColor = BML::unserialize(string::read(locate("Database/WonderSwan Color.bml"))); Database::WonderSwanColor = BML::unserialize(string::read(locate("database/WonderSwan Color.bml")));
Database::PocketChallengeV2 = BML::unserialize(string::read(locate("Database/Pocket Challenge V2.bml"))); Database::PocketChallengeV2 = BML::unserialize(string::read(locate("database/Pocket Challenge V2.bml")));
Database::BSMemory = BML::unserialize(string::read(locate("Database/BS Memory.bml"))); Database::BSMemory = BML::unserialize(string::read(locate("database/BS Memory.bml")));
Database::SufamiTurbo = BML::unserialize(string::read(locate("Database/Sufami Turbo.bml"))); Database::SufamiTurbo = BML::unserialize(string::read(locate("database/Sufami Turbo.bml")));
} }
auto Icarus::error() const -> string { auto Icarus::error() const -> string {

View File

@ -47,7 +47,7 @@ auto Icarus::superFamicomImport(vector<uint8_t>& buffer, string location) -> str
auto size = rom["size"].natural(); auto size = rom["size"].natural();
if(size > buffer.size() - offset) { if(size > buffer.size() - offset) {
auto name = string{rom["note"].text(), ".", rom["category"].text(), ".rom"}.trimLeft(".", 1L).downcase(); auto name = string{rom["note"].text(), ".", rom["category"].text(), ".rom"}.trimLeft(".", 1L).downcase();
auto location = locate({"Firmware/", name}); auto location = locate({"firmware/", name});
if(location && file::size(location) == size) { if(location && file::size(location) == size) {
write({target, name}, file::read(location)); write({target, name}, file::read(location));
} else { } else {

View File

@ -1,5 +1,5 @@
database database
revision: 2018-04-15 revision: 2018-05-06
//BS Memory (JPN) //BS Memory (JPN)

View File

@ -1,5 +1,5 @@
database database
revision: 2018-04-15 revision: 2018-05-06
//Sufami Turbo (JPN) //Sufami Turbo (JPN)

View File

@ -1,5 +1,5 @@
database database
revision: 2018-04-15 revision: 2018-05-06
//Prototypes (JPN) //Prototypes (JPN)
@ -1818,7 +1818,7 @@ game
//Super Nintendo (EUR) //Super Nintendo (EUR)
database database
revision: 2018-04-14 revision: 2018-05-06
game game
sha256: ec3e81d628a293514e303b44e3b1ac03461ddd1da32764b10b7fab1e507602df sha256: ec3e81d628a293514e303b44e3b1ac03461ddd1da32764b10b7fab1e507602df
@ -2513,7 +2513,7 @@ game
size: 0xc00 size: 0xc00
content: Data content: Data
manufacturer: Hitachi manufacturer: Hitachi
architecture: HS51BS169 architecture: HG51BS169
identifier: Cx4 identifier: Cx4
volatile volatile
oscillator oscillator
@ -2542,7 +2542,7 @@ game
size: 0xc00 size: 0xc00
content: Data content: Data
manufacturer: Hitachi manufacturer: Hitachi
architecture: HS51BS169 architecture: HG51BS169
identifier: Cx4 identifier: Cx4
volatile volatile
oscillator oscillator
@ -5733,7 +5733,7 @@ game
//Super Nintendo (USA) //Super Nintendo (USA)
database database
revision: 2018-04-14 revision: 2018-05-06
game game
sha256: 2ffe8828480f943056fb1ab5c3c84d48a0bf8cbe3ed7c9960b349b59adb07f3b sha256: 2ffe8828480f943056fb1ab5c3c84d48a0bf8cbe3ed7c9960b349b59adb07f3b
@ -10293,7 +10293,7 @@ game
size: 0xc00 size: 0xc00
content: Data content: Data
manufacturer: Hitachi manufacturer: Hitachi
architecture: HS51BS169 architecture: HG51BS169
identifier: Cx4 identifier: Cx4
volatile volatile
oscillator oscillator
@ -10322,7 +10322,7 @@ game
size: 0xc00 size: 0xc00
content: Data content: Data
manufacturer: Hitachi manufacturer: Hitachi
architecture: HS51BS169 architecture: HG51BS169
identifier: Cx4 identifier: Cx4
volatile volatile
oscillator oscillator

View File

@ -19,10 +19,10 @@ private:
auto size() const -> uint { return data.size(); } auto size() const -> uint { return data.size(); }
auto scoreHeader(uint address) -> uint; auto scoreHeader(uint address) -> uint;
auto firmwareARM() const -> string; auto firmwareARM() const -> string;
auto firmwareEXNEC() const -> string;
auto firmwareGB() const -> string;
auto firmwareHITACHI() const -> string; auto firmwareHITACHI() const -> string;
auto firmwareNEC() const -> string; auto firmwareNEC() const -> string;
auto firmwareNECEX() const -> string;
auto firmwareSGB() const -> string;
vector<uint8_t>& data; vector<uint8_t>& data;
string location; string location;
@ -38,13 +38,16 @@ SuperFamicom::SuperFamicom(vector<uint8_t>& data, string location) : data(data),
if(size() < 0x8000) return; //ignore images too small to be valid if(size() < 0x8000) return; //ignore images too small to be valid
uint scoreLo = scoreHeader( 0x7fb0); uint LoROM = scoreHeader( 0x7fb0);
uint scoreHi = scoreHeader( 0xffb0); uint HiROM = scoreHeader( 0xffb0);
uint scoreEx = scoreHeader(0x40ffb0); uint ExLoROM = scoreHeader(0x407fb0);
if(scoreEx) scoreEx += 4; uint ExHiROM = scoreHeader(0x40ffb0);
if(ExLoROM) ExLoROM += 4;
if(ExHiROM) ExHiROM += 4;
if(scoreLo >= scoreHi && scoreLo >= scoreEx) headerAddress = 0x7fb0; if(LoROM >= HiROM && LoROM >= ExLoROM && LoROM >= ExHiROM) headerAddress = 0x7fb0;
else if(scoreHi >= scoreEx) headerAddress = 0xffb0; else if(HiROM >= ExLoROM && HiROM >= ExHiROM) headerAddress = 0xffb0;
else if(ExLoROM >= ExHiROM) headerAddress = 0x407fb0;
else headerAddress = 0x40ffb0; else headerAddress = 0x40ffb0;
} }
@ -64,7 +67,7 @@ auto SuperFamicom::manifest() const -> string {
output.append(" revision: ", revision(), "\n"); output.append(" revision: ", revision(), "\n");
output.append(" board: ", board(), "\n"); output.append(" board: ", board(), "\n");
auto board = this->board().split("-"); auto board = this->board().trimRight("#A", 1L).trimRight("#B", 1L).split("-");
if(auto size = romSize()) { if(auto size = romSize()) {
if(board(0) == "SPC7110") size = 0x100000; if(board(0) == "SPC7110") size = 0x100000;
@ -87,6 +90,18 @@ auto SuperFamicom::manifest() const -> string {
output.append(Oscillator{}.frequency(21'440'000).text()); output.append(Oscillator{}.frequency(21'440'000).text());
} else if(board(0) == "BS" && board(1) == "MCC") { } else if(board(0) == "BS" && board(1) == "MCC") {
output.append(Memory{}.type("RAM").size(0x80000).content("Download").text()); output.append(Memory{}.type("RAM").size(0x80000).content("Download").text());
} else if(board(0) == "EXNEC") {
output.append(Memory{}.type("ROM").size(0xc000).content("Program").manufacturer("NEC").architecture("uPD96050").identifier(firmwareEXNEC()).text());
output.append(Memory{}.type("ROM").size(0x1000).content("Data" ).manufacturer("NEC").architecture("uPD96050").identifier(firmwareEXNEC()).text());
output.append(Memory{}.type("RAM").size(0x1000).content("Data" ).manufacturer("NEC").architecture("uPD96050").identifier(firmwareEXNEC()).text());
output.append(Oscillator{}.frequency(firmwareEXNEC() == "ST010" ? 11'000'000 : 15'000'000).text());
} else if(board(0) == "GB") {
output.append(Memory{}.type("ROM").size(0x100).content("Boot").manufacturer("Nintendo").architecture("LR35902").identifier(firmwareGB()).text());
if(firmwareGB() == "SGB2")
output.append(Oscillator{}.frequency(20'971'520).text());
} else if(board(0) == "GSU") {
//todo: MARIO CHIP 1 uses CPU oscillator
output.append(Oscillator{}.frequency(21'440'000).text());
} else if(board(0) == "HITACHI") { } else if(board(0) == "HITACHI") {
output.append(Memory{}.type("ROM").size(0xc00).content("Data").manufacturer("Hitachi").architecture("HG51BS169").identifier(firmwareHITACHI()).text()); output.append(Memory{}.type("ROM").size(0xc00).content("Data").manufacturer("Hitachi").architecture("HG51BS169").identifier(firmwareHITACHI()).text());
output.append(Memory{}.type("RAM").size(0xc00).content("Data").manufacturer("Hitachi").architecture("HG51BS169").identifier(firmwareHITACHI()).isVolatile().text()); output.append(Memory{}.type("RAM").size(0xc00).content("Data").manufacturer("Hitachi").architecture("HG51BS169").identifier(firmwareHITACHI()).isVolatile().text());
@ -96,26 +111,14 @@ auto SuperFamicom::manifest() const -> string {
output.append(Memory{}.type("ROM").size( 0x800).content("Data" ).manufacturer("NEC").architecture("uPD7725").identifier(firmwareNEC()).text()); output.append(Memory{}.type("ROM").size( 0x800).content("Data" ).manufacturer("NEC").architecture("uPD7725").identifier(firmwareNEC()).text());
output.append(Memory{}.type("RAM").size( 0x200).content("Data" ).manufacturer("NEC").architecture("uPD7725").identifier(firmwareNEC()).isVolatile().text()); output.append(Memory{}.type("RAM").size( 0x200).content("Data" ).manufacturer("NEC").architecture("uPD7725").identifier(firmwareNEC()).isVolatile().text());
output.append(Oscillator{}.frequency(7'600'000).text()); output.append(Oscillator{}.frequency(7'600'000).text());
} else if(board(0) == "NECEX") {
output.append(Memory{}.type("ROM").size(0xc000).content("Program").manufacturer("NEC").architecture("uPD96050").identifier(firmwareNECEX()).text());
output.append(Memory{}.type("ROM").size(0x1000).content("Data" ).manufacturer("NEC").architecture("uPD96050").identifier(firmwareNECEX()).text());
output.append(Memory{}.type("RAM").size(0x1000).content("Data" ).manufacturer("NEC").architecture("uPD96050").identifier(firmwareNECEX()).text());
output.append(Oscillator{}.frequency(firmwareNECEX() == "ST010" ? 11'000'000 : 15'000'000).text());
} else if(board(0) == "RTC") {
output.append(Memory{}.type("RTC").size(0x10).content("Time").text());
} else if(board(0) == "SA1") { } else if(board(0) == "SA1") {
output.append(Memory{}.type("RAM").size(0x800).content("Internal").isVolatile().text()); output.append(Memory{}.type("RAM").size(0x800).content("Internal").isVolatile().text());
} else if(board(0) == "SGB") {
output.append(Memory{}.type("ROM").size(0x100).content("Boot").manufacturer("Nintendo").architecture("LR35902").identifier(firmwareSGB()).text());
if(firmwareSGB() == "SGB2")
output.append(Oscillator{}.frequency(20'971'520).text());
} else if(board(0) == "SPC7110") { } else if(board(0) == "SPC7110") {
output.append(Memory{}.type("ROM").size(romSize() - 0x100000).content("Data").text()); output.append(Memory{}.type("ROM").size(romSize() - 0x100000).content("Data").text());
if(board(1) == "RTC") }
if(board.right() == "EPSONRTC" || board.right() == "SHARPRTC") {
output.append(Memory{}.type("RTC").size(0x10).content("Time").text()); output.append(Memory{}.type("RTC").size(0x10).content("Time").text());
} else if(board(0) == "SUPERFX") {
//todo: MARIO CHIP 1 uses CPU oscillator
output.append(Oscillator{}.frequency(21'440'000).text());
} }
return output; return output;
@ -205,30 +208,35 @@ auto SuperFamicom::revision() const -> string {
return revision ? revision : string{"1.", F}; return revision ? revision : string{"1.", F};
} }
//format: [slot]-[coprocessor]-[mapper]-[ram]-[rtc]
auto SuperFamicom::board() const -> string { auto SuperFamicom::board() const -> string {
auto mapMode = data[headerAddress + 0x25];
auto cartridgeType = data[headerAddress + 0x26];
auto cartridgeTypeLo = cartridgeType & 15;
auto cartridgeTypeHi = cartridgeType >> 4;
auto cartridgeSubType = data[headerAddress + 0x0f];
string board; string board;
auto mapMode = data[headerAddress + 0x25];
auto cartridgeTypeLo = data[headerAddress + 0x26] & 15;
auto cartridgeTypeHi = data[headerAddress + 0x26] >> 4;
auto cartridgeSubType = data[headerAddress + 0x0f];
string mode; string mode;
if(mapMode == 0x20 || mapMode == 0x30) mode = "LOROM-"; if(mapMode == 0x20 || mapMode == 0x30) mode = "LOROM-";
if(mapMode == 0x21 || mapMode == 0x31) mode = "HIROM-"; if(mapMode == 0x21 || mapMode == 0x31) mode = "HIROM-";
if(mapMode == 0x22 || mapMode == 0x32) mode = "SDD1-"; if(mapMode == 0x22 || mapMode == 0x32) mode = "SDD1-";
if(mapMode == 0x23 || mapMode == 0x33) mode = "SA1-"; if(mapMode == 0x23 || mapMode == 0x33) mode = "SA1-";
if(mapMode == 0x25 || mapMode == 0x35) mode = "HIROMEX-"; if(mapMode == 0x25 || mapMode == 0x35) mode = "EXHIROM-";
if(mapMode == 0x2a || mapMode == 0x3a) mode = "SPC7110-"; if(mapMode == 0x2a || mapMode == 0x3a) mode = "SPC7110-";
//many games will store an extra title character, overwriting the map mode //many games will store an extra title character, overwriting the map mode
//further, ExLoROM mode is unofficial, and lacks a mapping mode value
if(!mode) { if(!mode) {
if(headerAddress == 0x7fb0) mode = "LOROM-"; if(headerAddress == 0x7fb0) mode = "LOROM-";
if(headerAddress == 0xffb0) mode = "HIROM-"; if(headerAddress == 0xffb0) mode = "HIROM-";
if(headerAddress == 0x40ffb0) mode = "HIROMEX-"; if(headerAddress == 0x407fb0) mode = "EXLOROM-";
if(headerAddress == 0x40ffb0) mode = "EXHIROM-";
} }
bool epsonRTC = false;
bool sharpRTC = false;
if(serial() == "A9PJ") { if(serial() == "A9PJ") {
//Sufami Turbo (JPN) //Sufami Turbo (JPN)
board.append("ST-", mode); board.append("ST-", mode);
@ -237,37 +245,36 @@ auto SuperFamicom::board() const -> string {
board.append("BS-MCC-"); board.append("BS-MCC-");
} else if(serial() == "042J") { } else if(serial() == "042J") {
//Super Game Boy 2 //Super Game Boy 2
board.append("SGB-", mode); board.append("GB-", mode);
} else if(serial().match("Z\?\?J")) { } else if(serial().match("Z??J")) {
board.append("BS-", mode); board.append("BS-", mode);
} else if(cartridgeTypeLo >= 0x3) { } else if(cartridgeTypeLo >= 0x3) {
if(cartridgeTypeHi == 0x0) board.append("NEC-", mode); if(cartridgeTypeHi == 0x0) board.append("NEC-", mode);
if(cartridgeTypeHi == 0x1) board.append("SUPERFX-"); if(cartridgeTypeHi == 0x1) board.append("GSU-");
if(cartridgeTypeHi == 0x2) board.append("OBC1-", mode); if(cartridgeTypeHi == 0x2) board.append("OBC1-", mode);
if(cartridgeTypeHi == 0x3) board.append("SA1-"); if(cartridgeTypeHi == 0x3) board.append("SA1-");
if(cartridgeTypeHi == 0x4) board.append("SDD1-"); if(cartridgeTypeHi == 0x4) board.append("SDD1-");
if(cartridgeTypeHi == 0x5) board.append("RTC-", mode); if(cartridgeTypeHi == 0x5) board.append(mode), sharpRTC = true;
if(cartridgeTypeHi == 0xe && cartridgeTypeLo == 0x3) board.append("SGB-", mode); if(cartridgeTypeHi == 0xe && cartridgeTypeLo == 0x3) board.append("GB-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x00 && cartridgeTypeLo == 0x5) board.append("SPC7110-"); if(cartridgeTypeHi == 0xf && cartridgeTypeLo == 0x5 && cartridgeSubType == 0x00) board.append("SPC7110-");
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x00 && cartridgeTypeLo == 0x9) board.append("SPC7110-RTC-"); if(cartridgeTypeHi == 0xf && cartridgeTypeLo == 0x9 && cartridgeSubType == 0x00) board.append("SPC7110-"), epsonRTC = true;
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x01) board.append("NECEX-", mode); if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x01) board.append("EXNEC-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x02) board.append("ARM-", mode); if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x02) board.append("ARM-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x10) board.append("HITACHI-", mode); if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x10) board.append("HITACHI-", mode);
} }
if(!board) board.append(mode); if(!board) board.append(mode);
if(board.beginsWith("LOROM-") && romSize() > 0x200000 && ramSize()) board.replace("LOROM-", "LOROMEX-"); if(cartridgeTypeLo == 0x1 || cartridgeTypeLo == 0x4) board.append("RAM-"); //RAM without battery
if(board.beginsWith("NEC-LOROM-") && romSize() > 0x100000) board.replace("NEC-LOROM-", "NEC-LOROMEX-"); if(cartridgeTypeLo == 0x2 || cartridgeTypeLo == 0x5) board.append("RAM-"); //RAM with battery
if(cartridgeTypeLo == 0x6); //battery without RAM
if(cartridgeTypeLo == 0x1 || cartridgeTypeLo == 0x4) board.append("RAM-"); //without battery if(epsonRTC) board.append("EPSONRTC-");
if(cartridgeTypeLo == 0x2 || cartridgeTypeLo == 0x5) board.append("RAM-"); //with battery if(sharpRTC) board.append("SHARPRTC-");
if(cartridgeTypeLo == 0x6) board.append("BATTERY-"); //without RAM
board.trimRight("-", 1L); board.trimRight("-", 1L);
//NEC uPD96050 frequency if(board.beginsWith( "LOROM-RAM")) board.append(romSize() <= 0x200000 ? "#A" : "#B");
if(board.beginsWith("NECEX-") && firmwareNECEX() == "st010") board.append("#11"); //11MHz (22MHz / 2) if(board.beginsWith("NEC-LOROM-RAM")) board.append(romSize() <= 0x100000 ? "#A" : "#B");
if(board.beginsWith("NECEX-") && firmwareNECEX() == "st011") board.append("#15"); //15MHz
return board; return board;
} }
@ -480,6 +487,19 @@ auto SuperFamicom::firmwareARM() const -> string {
return "ST018"; return "ST018";
} }
auto SuperFamicom::firmwareEXNEC() const -> string {
if(label() == "EXHAUST HEAT2") return "ST010";
if(label() == "F1 ROC II") return "ST010";
if(label() == "2DAN MORITA SHOUGI") return "ST011";
return "ST010";
}
auto SuperFamicom::firmwareGB() const -> string {
if(label() == "Super GAMEBOY") return "SGB1";
if(label() == "Super GAMEBOY2") return "SGB2";
return "SGB1";
}
auto SuperFamicom::firmwareHITACHI() const -> string { auto SuperFamicom::firmwareHITACHI() const -> string {
return "Cx4"; return "Cx4";
} }
@ -493,17 +513,4 @@ auto SuperFamicom::firmwareNEC() const -> string {
return "DSP1B"; return "DSP1B";
} }
auto SuperFamicom::firmwareNECEX() const -> string {
if(label() == "EXHAUST HEAT2") return "ST010";
if(label() == "F1 ROC II") return "ST010";
if(label() == "2DAN MORITA SHOUGI") return "ST011";
return "ST010";
}
auto SuperFamicom::firmwareSGB() const -> string {
if(label() == "Super GAMEBOY") return "SGB1";
if(label() == "Super GAMEBOY2") return "SGB2";
return "SGB1";
}
} }