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 {
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 License = "GPLv3";
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=RAM)"]) loadRAM(node);
if(auto node = board["memory(type=ROM,content=Program)"]) loadROM(node);
if(auto node = board["memory(type=RAM,content=Save)"]) loadRAM(node);
if(auto node = board["icd"]) loadICD(node);
if(auto node = board["mcc"]) loadMCC(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["nss"]) loadNSS(node);
if(auto node = board["event"]) loadEvent(node);
if(auto node = board["sa1"]) loadSA1(node);
if(auto node = board["superfx"]) loadSuperFX(node);
if(auto node = board["processor(architecture=W65C816S)"]) loadSA1(node);
if(auto node = board["processor(architecture=GSU)"]) loadSuperFX(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["epsonrtc"]) loadEpsonRTC(node);
if(auto node = board["sharprtc"]) loadSharpRTC(node);
if(auto node = board["spc7110"]) loadSPC7110(node);
if(auto node = board["rtc(manufacturer=Epson)"]) loadEpsonRTC(node);
if(auto node = board["rtc(manufacturer=Sharp)"]) loadSharpRTC(node);
if(auto node = board["processor(identifier=SPC7110)"]) loadSPC7110(node);
if(auto node = board["sdd1"]) loadSDD1(node);
if(auto node = board["obc1"]) loadOBC1(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);
}
//processor(architecture=W65C816S)
auto Cartridge::loadSA1(Markup::Node node) -> void {
has.SA1 = true;
loadMemory(sa1.rom, node["rom"], File::Required);
loadMemory(sa1.bwram, node["bwram"], File::Optional);
loadMemory(sa1.iram, node["iram"], File::Optional);
for(auto map : node.find("map")) {
loadMap(map, {&SA1::readIO, &sa1}, {&SA1::writeIO, &sa1});
}
for(auto leaf : node.find("map")) loadMap(leaf, {&SA1::readIO, &sa1}, {&SA1::writeIO, &sa1});
for(auto leaf : node["rom"].find("map")) loadMap(leaf, {&SA1::mmcromRead, &sa1}, {&SA1::mmcromWrite, &sa1});
for(auto leaf : node["bwram"].find("map")) loadMap(leaf, {&SA1::mmcbwramRead, &sa1}, {&SA1::mmcbwramWrite, &sa1});
for(auto leaf : node["iram"].find("map")) loadMap(leaf, sa1.cpuiram);
if(auto mcu = node["mcu"]) {
for(auto map : mcu.find("map")) {
loadMap(map, {&SA1::mmcromRead, &sa1}, {&SA1::mmcromWrite, &sa1});
}
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 {
has.SuperFX = true;
loadMemory(superfx.rom, node["rom"], File::Required);
loadMemory(superfx.ram, node["ram"], File::Optional);
for(auto map : node.find("map")) {
loadMap(map, {&SuperFX::readIO, &superfx}, {&SuperFX::writeIO, &superfx});
}
for(auto leaf : node.find("map")) loadMap(leaf, {&SuperFX::readIO, &superfx}, {&SuperFX::writeIO, &superfx});
for(auto leaf : node["rom"].find("map")) loadMap(leaf, superfx.cpurom);
for(auto leaf : node["ram"].find("map")) loadMap(leaf, superfx.cpuram);
if(auto memory = node["memory(type=ROM,content=Program)"]) {
loadMemory(superfx.rom, memory, File::Required);
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 {
@ -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});
}
//processor(architecture=HG51BS169)
auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void {
has.HitachiDSP = true;
for(auto& word : hitachidsp.dataROM) word = 0x000000;
for(auto& word : hitachidsp.dataRAM) word = 0x00;
if(auto oscillator = game.oscillator()) {
hitachidsp.Frequency = oscillator->frequency;
} else {
@ -258,27 +293,42 @@ auto Cartridge::loadHitachiDSP(Markup::Node node, uint roms) -> void {
}
hitachidsp.Roms = roms; //1 or 2
loadMemory(hitachidsp.rom, node["rom"], File::Required);
loadMemory(hitachidsp.ram, node["ram"], File::Optional);
for(auto& word : hitachidsp.dataROM) word = 0x000000;
for(auto& word : hitachidsp.dataRAM) word = 0x00;
if(auto memory = game.memory(node["memory(type=ROM,content=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);
}
for(auto map : node.find("map")) {
loadMap(map, {&HitachiDSP::dspRead, &hitachidsp}, {&HitachiDSP::dspWrite, &hitachidsp});
}
if(auto memory = game.memory(node["memory(type=RAM,content=Data)"])) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) {
for(auto n : range(3 * 1024)) hitachidsp.dataRAM[n] = fp->readl(1);
if(auto memory = node["memory(type=ROM,content=Program)"]) {
loadMemory(hitachidsp.rom, memory, File::Required);
for(auto map : memory.find("map")) {
loadMap(map, {&HitachiDSP::romRead, &hitachidsp}, {&HitachiDSP::romWrite, &hitachidsp});
}
}
for(auto leaf : node.find("map")) loadMap(leaf, {&HitachiDSP::dspRead, &hitachidsp}, {&HitachiDSP::dspWrite, &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});
if(auto memory = node["memory(type=RAM,content=Save)"]) {
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);
}
}
}
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 map : memory.find("map")) {
loadMap(map, {&HitachiDSP::dramRead, &hitachidsp}, {&HitachiDSP::dramWrite, &hitachidsp});
}
}
}
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});
}
//rtc(manufacturer=Epson)
auto Cartridge::loadEpsonRTC(Markup::Node node) -> void {
has.EpsonRTC = true;
epsonrtc.initialize();
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) {
uint8 data[16] = {0};
for(auto& byte : data) byte = fp->read();
epsonrtc.load(data);
}
for(auto map : node.find("map")) {
loadMap(map, {&EpsonRTC::read, &epsonrtc}, {&EpsonRTC::write, &epsonrtc});
}
for(auto leaf : node.find("map")) loadMap(leaf, {&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};
for(auto& byte : data) byte = fp->read();
epsonrtc.load(data);
}
}
}
}
//rtc(manufacturer=Sharp)
auto Cartridge::loadSharpRTC(Markup::Node node) -> void {
has.SharpRTC = true;
sharprtc.initialize();
if(auto memory = game.memory(node["memory(type=RTC,content=Time)"])) {
if(auto fp = platform->open(ID::SuperFamicom, memory->name(), File::Read)) {
uint8 data[16] = {0};
for(auto& byte : data) byte = fp->read();
sharprtc.load(data);
}
for(auto map : node.find("map")) {
loadMap(map, {&SharpRTC::read, &sharprtc}, {&SharpRTC::write, &sharprtc});
}
for(auto leaf : node.find("map")) loadMap(leaf, {&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};
for(auto& byte : data) byte = fp->read();
sharprtc.load(data);
}
}
}
}
//processor(identifier=SPC7110)
auto Cartridge::loadSPC7110(Markup::Node node) -> void {
has.SPC7110 = true;
loadMemory(spc7110.prom, node["prom"], File::Required);
loadMemory(spc7110.drom, node["drom"], File::Required);
loadMemory(spc7110.ram, node["ram"], File::Optional);
for(auto map : node.find("map")) {
loadMap(map, {&SPC7110::read, &spc7110}, {&SPC7110::write, &spc7110});
}
for(auto leaf : node.find("map")) leaf.text() == "mcu"
? loadMap(leaf, {&SPC7110::mcuromRead, &spc7110}, {&SPC7110::mcuromWrite, &spc7110})
: loadMap(leaf, {&SPC7110::read, &spc7110}, {&SPC7110::write, &spc7110});
for(auto leaf : node["ram"].find("map")) loadMap(leaf, {&SPC7110::mcuramRead, &spc7110}, {&SPC7110::mcuramWrite, &spc7110});
if(auto mcu = node["mcu"]) {
for(auto map : mcu.find("map")) {
loadMap(map, {&SPC7110::mcuromRead, &spc7110}, {&SPC7110::mcuromWrite, &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 {

View File

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

View File

@ -9,25 +9,24 @@ auto SuperFX::color(uint8 source) -> uint8 {
}
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.scmr.md == 3) {
if(regs.por.freezehigh) {
if((color & 0x0f) == 0) return;
if((regs.colr & 0x0f) == 0) return;
} else {
if(color == 0) return;
if(regs.colr == 0) return;
}
} 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);
if(offset != pixelcache[0].offset) {
flushPixelCache(pixelcache[1]);

View File

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

View File

@ -342,7 +342,7 @@ auto Presentation::loadSystems() -> void {
}
auto Presentation::loadShaders() -> void {
auto pathname = locate("Video Shaders/");
auto pathname = locate("shaders/");
if(settings["Video/Driver"].text() == "OpenGL") {
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 {
unloadMedium();
mediumPaths.append(locate({medium.name, ".sys/"}));
mediumPaths.append(locate({"systems/", medium.name, ".sys/"}));
Emulator::audio.reset(2, audio->frequency());
inputManager->bind(emulator = &interface);

View File

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

View File

@ -1,19 +1,19 @@
Icarus::Icarus() {
Database::Famicom = BML::unserialize(string::read(locate("Database/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::MegaDrive = BML::unserialize(string::read(locate("Database/Mega Drive.bml")));
Database::PCEngine = BML::unserialize(string::read(locate("Database/PC Engine.bml")));
Database::SuperGrafx = BML::unserialize(string::read(locate("Database/SuperGrafx.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::GameBoyAdvance = BML::unserialize(string::read(locate("Database/Game Boy Advance.bml")));
Database::GameGear = BML::unserialize(string::read(locate("Database/Game Gear.bml")));
Database::WonderSwan = BML::unserialize(string::read(locate("Database/WonderSwan.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::BSMemory = BML::unserialize(string::read(locate("Database/BS Memory.bml")));
Database::SufamiTurbo = BML::unserialize(string::read(locate("Database/Sufami Turbo.bml")));
Database::Famicom = BML::unserialize(string::read(locate("database/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::MegaDrive = BML::unserialize(string::read(locate("database/Mega Drive.bml")));
Database::PCEngine = BML::unserialize(string::read(locate("database/PC Engine.bml")));
Database::SuperGrafx = BML::unserialize(string::read(locate("database/SuperGrafx.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::GameBoyAdvance = BML::unserialize(string::read(locate("database/Game Boy Advance.bml")));
Database::GameGear = BML::unserialize(string::read(locate("database/Game Gear.bml")));
Database::WonderSwan = BML::unserialize(string::read(locate("database/WonderSwan.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::BSMemory = BML::unserialize(string::read(locate("database/BS Memory.bml")));
Database::SufamiTurbo = BML::unserialize(string::read(locate("database/Sufami Turbo.bml")));
}
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();
if(size > buffer.size() - offset) {
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) {
write({target, name}, file::read(location));
} else {

View File

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

View File

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

View File

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

View File

@ -19,10 +19,10 @@ private:
auto size() const -> uint { return data.size(); }
auto scoreHeader(uint address) -> uint;
auto firmwareARM() const -> string;
auto firmwareEXNEC() const -> string;
auto firmwareGB() const -> string;
auto firmwareHITACHI() const -> string;
auto firmwareNEC() const -> string;
auto firmwareNECEX() const -> string;
auto firmwareSGB() const -> string;
vector<uint8_t>& data;
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
uint scoreLo = scoreHeader( 0x7fb0);
uint scoreHi = scoreHeader( 0xffb0);
uint scoreEx = scoreHeader(0x40ffb0);
if(scoreEx) scoreEx += 4;
uint LoROM = scoreHeader( 0x7fb0);
uint HiROM = scoreHeader( 0xffb0);
uint ExLoROM = scoreHeader(0x407fb0);
uint ExHiROM = scoreHeader(0x40ffb0);
if(ExLoROM) ExLoROM += 4;
if(ExHiROM) ExHiROM += 4;
if(scoreLo >= scoreHi && scoreLo >= scoreEx) headerAddress = 0x7fb0;
else if(scoreHi >= scoreEx) headerAddress = 0xffb0;
if(LoROM >= HiROM && LoROM >= ExLoROM && LoROM >= ExHiROM) headerAddress = 0x7fb0;
else if(HiROM >= ExLoROM && HiROM >= ExHiROM) headerAddress = 0xffb0;
else if(ExLoROM >= ExHiROM) headerAddress = 0x407fb0;
else headerAddress = 0x40ffb0;
}
@ -64,7 +67,7 @@ auto SuperFamicom::manifest() const -> string {
output.append(" revision: ", revision(), "\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(board(0) == "SPC7110") size = 0x100000;
@ -87,6 +90,18 @@ auto SuperFamicom::manifest() const -> string {
output.append(Oscillator{}.frequency(21'440'000).text());
} else if(board(0) == "BS" && board(1) == "MCC") {
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") {
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());
@ -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("RAM").size( 0x200).content("Data" ).manufacturer("NEC").architecture("uPD7725").identifier(firmwareNEC()).isVolatile().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") {
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") {
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());
} else if(board(0) == "SUPERFX") {
//todo: MARIO CHIP 1 uses CPU oscillator
output.append(Oscillator{}.frequency(21'440'000).text());
}
return output;
@ -205,30 +208,35 @@ auto SuperFamicom::revision() const -> string {
return revision ? revision : string{"1.", F};
}
//format: [slot]-[coprocessor]-[mapper]-[ram]-[rtc]
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;
auto mapMode = data[headerAddress + 0x25];
auto cartridgeTypeLo = data[headerAddress + 0x26] & 15;
auto cartridgeTypeHi = data[headerAddress + 0x26] >> 4;
auto cartridgeSubType = data[headerAddress + 0x0f];
string mode;
if(mapMode == 0x20 || mapMode == 0x30) mode = "LOROM-";
if(mapMode == 0x21 || mapMode == 0x31) mode = "HIROM-";
if(mapMode == 0x22 || mapMode == 0x32) mode = "SDD1-";
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-";
//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(headerAddress == 0x7fb0) mode = "LOROM-";
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") {
//Sufami Turbo (JPN)
board.append("ST-", mode);
@ -237,37 +245,36 @@ auto SuperFamicom::board() const -> string {
board.append("BS-MCC-");
} else if(serial() == "042J") {
//Super Game Boy 2
board.append("SGB-", mode);
} else if(serial().match("Z\?\?J")) {
board.append("GB-", mode);
} else if(serial().match("Z??J")) {
board.append("BS-", mode);
} else if(cartridgeTypeLo >= 0x3) {
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 == 0x3) board.append("SA1-");
if(cartridgeTypeHi == 0x4) board.append("SDD1-");
if(cartridgeTypeHi == 0x5) board.append("RTC-", mode);
if(cartridgeTypeHi == 0xe && cartridgeTypeLo == 0x3) board.append("SGB-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x00 && cartridgeTypeLo == 0x5) board.append("SPC7110-");
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x00 && cartridgeTypeLo == 0x9) board.append("SPC7110-RTC-");
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x01) board.append("NECEX-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x02) board.append("ARM-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x10) board.append("HITACHI-", mode);
if(cartridgeTypeHi == 0x5) board.append(mode), sharpRTC = true;
if(cartridgeTypeHi == 0xe && cartridgeTypeLo == 0x3) board.append("GB-", mode);
if(cartridgeTypeHi == 0xf && cartridgeTypeLo == 0x5 && cartridgeSubType == 0x00) board.append("SPC7110-");
if(cartridgeTypeHi == 0xf && cartridgeTypeLo == 0x9 && cartridgeSubType == 0x00) board.append("SPC7110-"), epsonRTC = true;
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x01) board.append("EXNEC-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x02) board.append("ARM-", mode);
if(cartridgeTypeHi == 0xf && cartridgeSubType == 0x10) board.append("HITACHI-", mode);
}
if(!board) board.append(mode);
if(board.beginsWith("LOROM-") && romSize() > 0x200000 && ramSize()) board.replace("LOROM-", "LOROMEX-");
if(board.beginsWith("NEC-LOROM-") && romSize() > 0x100000) board.replace("NEC-LOROM-", "NEC-LOROMEX-");
if(cartridgeTypeLo == 0x1 || cartridgeTypeLo == 0x4) board.append("RAM-"); //RAM without battery
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(cartridgeTypeLo == 0x2 || cartridgeTypeLo == 0x5) board.append("RAM-"); //with battery
if(cartridgeTypeLo == 0x6) board.append("BATTERY-"); //without RAM
if(epsonRTC) board.append("EPSONRTC-");
if(sharpRTC) board.append("SHARPRTC-");
board.trimRight("-", 1L);
//NEC uPD96050 frequency
if(board.beginsWith("NECEX-") && firmwareNECEX() == "st010") board.append("#11"); //11MHz (22MHz / 2)
if(board.beginsWith("NECEX-") && firmwareNECEX() == "st011") board.append("#15"); //15MHz
if(board.beginsWith( "LOROM-RAM")) board.append(romSize() <= 0x200000 ? "#A" : "#B");
if(board.beginsWith("NEC-LOROM-RAM")) board.append(romSize() <= 0x100000 ? "#A" : "#B");
return board;
}
@ -480,6 +487,19 @@ auto SuperFamicom::firmwareARM() const -> string {
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 {
return "Cx4";
}
@ -493,17 +513,4 @@ auto SuperFamicom::firmwareNEC() const -> string {
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";
}
}