Update to v106r04 release.

byuu says:

Changelog:

  - nall: `Markup::Node::operator[]` now uses `find()` instead of `lookup()`
    behind the scenes
  - Super Famicom: RAM memory ordering is now independent of ROM memory
    ordering
  - Super Famicom: added 19 new generic board definitions
  - icarus: improved Super Famicom heuristics generation

Not putting it in the changelog, but the SPC7110 RAM now has write
protection disabled again.

99% of games should now be playable with heuristics. The exceptions
should be:

  - 4MB LoROM games with SRAM (Ys 3, FE: Thracia 776)
  - 2MB DSP LoROM games
  - BS-X Town
  - BS-X slotted games
  - SA1 BSX slotted games
  - SPC7110 games without the RTC (Momotarou Dentetsu Happy, Super Power
    League 4)
  - SPC7110 7MB fan translation (wasn't supported earlier either)
  - ExLoROM games (wasn't supported earlier either)
  - Sufami Turbo
  - Campus Challenge '92 and Powerfest '94
  - ST010 is going to run at 15MHz instead of 11MHz
  - MSU1 (needs to be supported in higan, not icarus)

I'll add support for most of these before the release of v107.
This commit is contained in:
Tim Allen 2018-02-08 21:32:46 +11:00
parent 3d8be92550
commit c38a771f22
8 changed files with 281 additions and 14122 deletions

View File

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

View File

@ -57,7 +57,7 @@ auto System::load(Emulator::Interface* interface, Model model_, maybe<uint> syst
} else return false;
auto document = BML::unserialize(information.manifest);
if(auto name = document["board/icd2/rom/name"].text()) {
if(auto name = document["game/memory[1]/name"].text()) {
if(auto fp = platform->open(systemID(), name, File::Read, File::Required)) {
fp->read(bootROM.sgb, 256);
}

View File

@ -21,6 +21,7 @@ auto Cartridge::loadBoard(Markup::Node node) -> Markup::Node {
}
}
if(!matched) continue;
if(region.endsWith("-USA")
|| region.endsWith("-CAN")
|| region.endsWith("-JPN")
@ -30,17 +31,30 @@ auto Cartridge::loadBoard(Markup::Node node) -> Markup::Node {
} else {
output.append("region=pal\n");
}
uint counter = 0;
vector<Markup::Node> rom;
vector<Markup::Node> ram;
for(auto memory : node.find("game/memory")) {
if(memory["type"].text() == "ROM" || memory["type"].text() == "EPROM") {
rom.append(memory);
}
if(memory["type"].text() == "RAM" || memory["type"].text() == "NVRAM") {
ram.append(memory);
}
}
for(auto& line : BML::serialize(leaf).split("\n")) {
line.trimLeft(" ", 1L);
if(line.endsWith("rom") || line.endsWith("ram")) {
auto memory = node.find("game/memory");
if(counter < memory.size()) {
line.append(" name=", memory[counter]["name"].text());
line.append(" size=", memory[counter]["size"].text());
if(memory[counter]["type"].text() == "RAM") line.append(" volatile");
counter++;
}
if(line.endsWith("rom") && rom) {
line.append(" name=", rom.left()["name"].text());
line.append(" size=", rom.left()["size"].text());
rom.removeLeft();
}
if(line.endsWith("ram")) {
line.append(" name=", ram.left()["name"].text());
line.append(" size=", ram.left()["size"].text());
if(ram.left()["type"].text() == "RAM") line.append(" volatile");
ram.removeLeft();
}
output.append(line, "\n");
}

View File

@ -43,7 +43,7 @@ auto SPC7110::power() -> void {
prom.writeProtect(true);
drom.writeProtect(true);
ram.writeProtect(true);
ram.writeProtect(false);
r4801 = 0x00;
r4802 = 0x00;

View File

@ -1,3 +1,8 @@
database
revision: 2018-02-08
//Boards (Production)
database
revision: 2017-12-29
@ -406,3 +411,187 @@ board: YJ0N-01
map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff
//Boards (Generic)
database
revision: 2018-02-08
board: CX4
hitachidsp model=HG51B169 frequency=20000000
map address=00-3f,80-bf:6c00-6fff,7c00-7fff
rom
map address=00-3f,80-bf:8000-ffff mask=0x8000
ram
map address=70-77:0000-7fff mask=0x8000
drom
dram
map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000
board: DSP-HIROM-NVRAM
rom
map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff
ram
map address=20-3f,a0-bf:6000-7fff mask=0xe000
necdsp model=uPD7725 frequency=8000000
map address=00-1f,80-9f:6000-7fff mask=0xfff
prom
drom
dram
board: DSP-LOROM
rom
map address=00-1f,80-9f:8000-ffff mask=0x8000
necdsp model=uPD7725 frequency=8000000
map address=30-3f,b0-bf:8000-ffff mask=0x3fff
prom
drom
dram
board: DSP-LOROM-NVRAM
rom
map address=00-1f,80-9f:8000-ffff mask=0x8000
ram
map address=70-7d,f0-ff:0000-ffff
necdsp model=uPD7725 frequency=8000000
map address=20-3f,a0-bf:8000-ffff mask=0x3fff
prom
drom
dram
board: EXHIROM-NVRAM
rom
map address=00-3f:8000-ffff base=0x400000
map address=40-7d:0000-ffff base=0x400000
map address=80-bf:8000-ffff mask=0xc00000
map address=c0-ff:0000-ffff mask=0xc00000
ram
map address=20-3f,a0-bf:6000-7fff mask=0xe000
map address=70-7d:0000-7fff
board: HIROM
rom
map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff
board: HIROM-NVRAM
rom
map address=00-3f,80-bf:8000-ffff
map address=40-7d,c0-ff:0000-ffff
ram
map address=20-3f,a0-bf:6000-7fff mask=0xe000
board: LOROM
rom
map address=00-7d,f0-ff:8000-ffff mask=0x8000
board: LOROM-NVRAM
rom
map address=00-7d,f0-ff:8000-ffff mask=0x8000
ram
map address=70-7d,f0-ff:0000-7fff mask=0x8000
board: OBC1-LOROM-NVRAM
rom
map address=00-3f,80-bf:8000-ffff mask=0x8000
obc1
map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-71,f0-f1:6000-7fff,e000-ffff mask=0xe000
ram
board: RTC-EXHIROM-NVRAM
rom
map address=00-3f:8000-ffff base=0x400000
map address=40-7d:0000-ffff base=0x400000
map address=80-bf:8000-ffff mask=0xc00000
map address=c0-ff:0000-ffff mask=0xc00000
ram
map address=20-3f,a0-bf:6000-7fff mask=0xe000
map address=70-7d:0000-7fff
sharprtc
map address=00-3f,80-bf:2800-2801
ram
board: SA1-(RAM,NVRAM)
sa1
map address=00-3f,80-bf:2200-23ff
rom
map address=00-3f,80-bf:8000-ffff mask=0x408000
map address=c0-ff:0000-ffff
bwram
map address=00-3f,80-bf:6000-7fff size=0x2000
map address=40-4f:0000-ffff
iram
map address=00-3f,80-bf:3000-37ff size=0x800
board: SDD1
sdd1
map address=00-3f,80-bf:4800-480f
rom
map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff
board: SDD1-NVRAM
sdd1
map address=00-3f,80-bf:4800-480f
rom
map address=00-3f,80-bf:8000-ffff
map address=c0-ff:0000-ffff
ram
map address=00-3f,80-bf:6000-7fff mask=0xe000
map address=70-73:0000-ffff mask=0x8000
board: SETA-LOROM-NVRAM
rom
map address=00-7d,80-ff:8000-ffff mask=0x8000
map address=40-6f,c0-ef:0000-7fff mask=0x8000
ram
map address=70-7d,f0-ff:0000-ffff
armdsp frequency=21477272
map address=00-3f,80-bf:3800-38ff
prom
drom
ram
board: SGB
rom
map address=00-7d,80-ff:8000-ffff mask=0x8000
map address=40-7d,c0-ff:0000-7fff mask=0x8000
icd2 revision=1
map address=00-3f,80-bf:6000-67ff,7000-7fff
rom
board: SPC7110-RTC-NVRAM
spc7110
map address=00-3f,80-bf:4800-483f
map address=50,58:0000-ffff
map=mcu address=00-3f,80-bf:8000-ffff mask=0x800000
map=mcu address=c0-ff:0000-ffff mask=0xc00000
prom
drom
ram
map address=00-3f,80-bf:6000-7fff mask=0xe000
epsonrtc
map address=00-3f,80-bf:4800-4842
ram
board: ST-LOROM-BATTERY
rom
map address=00-7d,80-ff:8000-ffff mask=0x8000
necdsp model=uPD96050 frequency=15000000
map address=60-67,e0-e7:0000-3fff
prom
drom
dram
map address=68-6f,e8-ef:0000-7fff mask=0x8000
board: SUPERFX-(RAM,NVRAM)
superfx
map address=00-3f,80-bf:3000-34ff
rom
map address=00-3f,80-bf:8000-ffff mask=0x8000
map address=40-5f,c0-df:0000-ffff
ram
map address=00-3f,80-bf:6000-7fff size=0x2000
map address=70-71,f0-f1:0000-ffff

File diff suppressed because it is too large Load Diff

View File

@ -53,26 +53,26 @@ auto SuperFamicom::manifest() const -> string {
output.append(" board: ", board(), "\n");
output.append(" label: ", label(), "\n");
auto board = this->board();
auto board = this->board().split("-");
if(board.beginsWith("CX4-")) {
if(board.left() == "CX4") {
output.append(memory("ROM", size - 0xc00, "program.rom"));
output.append(memory("ROM", 0xc00, "cx4.data.rom"));
} else if(board.beginsWith("DSP-")) {
} else if(board.left() == "DSP") {
output.append(memory("ROM", size - 0x2000, "program.rom"));
output.append(memory("ROM", 0x1800, "dsp.program.rom"));
output.append(memory("ROM", 0x800, "dsp.data.rom"));
} else if(board.beginsWith("SETA-")) {
} else if(board.left() == "SETA") {
output.append(memory("ROM", size - 0x28000, "program.rom"));
output.append(memory("ROM", 0x20000, "seta.program.rom"));
output.append(memory("ROM", 0x8000, "seta.data.rom"));
} else if(board.beginsWith("SGB-")) {
} else if(board.left() == "SGB") {
output.append(memory("ROM", size - 0x100, "program.rom"));
output.append(memory("ROM", 0x100, "sgb.boot.rom"));
} else if(board.beginsWith("SPC7110-")) {
} else if(board.left() == "SPC7110") {
output.append(memory("ROM", 0x100000, "program.rom"));
output.append(memory("ROM", size - 0x100000, "data.rom"));
} else if(board.beginsWith("ST-")) {
} else if(board.left() == "ST") {
output.append(memory("ROM", size - 0xd000, "program.rom"));
output.append(memory("ROM", 0xc000, "st.program.rom"));
output.append(memory("ROM", 0x1000, "st.data.rom"));
@ -81,31 +81,31 @@ auto SuperFamicom::manifest() const -> string {
}
if(auto size = ramSize()) {
auto type = board.endsWith("-NVRAM") ? "NVRAM" : "RAM";
auto type = board.right() == "NVRAM" ? "NVRAM" : "RAM";
output.append(memory(type, size, "save.ram"));
}
if(auto size = expansionRamSize()) {
auto type = board.endsWith("-NVRAM") ? "NVRAM" : "RAM";
auto type = board.right() == "NVRAM" ? "NVRAM" : "RAM";
output.append(memory(type, size, "expansion.ram"));
}
if(board.beginsWith("BSX-")) {
if(board.left() == "BSX") {
output.append(memory("NVRAM", 0x80000, "download.ram"));
} else if(board.beginsWith("CX4-")) {
} else if(board.left() == "CX4") {
output.append(memory("RAM", 0, "save.ram"));
output.append(memory("RAM", 0xc00, "cx4.data.ram"));
} else if(board.beginsWith("DSP-")) {
} else if(board.left() == "DSP") {
output.append(memory("RAM", 0x200, "dsp.data.ram"));
} else if(board.beginsWith("RTC-")) {
} else if(board.left() == "RTC") {
output.append(memory("NVRAM", 0x10, "rtc.ram"));
} else if(board.beginsWith("SA1-")) {
} else if(board.left() == "SA1") {
output.append(memory("RAM", 0x800, "internal.ram"));
} else if(board.beginsWith("SETA-")) {
} else if(board.left() == "SETA") {
output.append(memory("NVRAM", 0x4000, "seta.save.ram"));
} else if(board.beginsWith("SPC7110-RTC-")) {
} else if(board.left() == "SPC7110" && board(1) == "RTC") {
output.append(memory("NVRAM", 0x10, "rtc.ram"));
} else if(board.beginsWith("ST-")) {
} else if(board.left() == "ST") {
output.append(memory("NVRAM", 0x1000, "st.save.ram"));
}
@ -158,20 +158,20 @@ auto SuperFamicom::region() const -> string {
}
if(!region) {
if(E == 0x00) region = {"SHVC-\?\?-JPN"}; //trigraphs: why is this still a thing?
if(E == 0x01) region = { "SNS-\?\?-USA"};
if(E == 0x02) region = {"SNSP-\?\?-EUR"};
if(E == 0x03) region = {"SNSP-\?\?-SCN"};
if(E == 0x06) region = {"SNSP-\?\?-FRA"};
if(E == 0x07) region = {"SNSP-\?\?-HOL"};
if(E == 0x08) region = {"SNSP-\?\?-ESP"};
if(E == 0x09) region = {"SNSP-\?\?-NOE"};
if(E == 0x0a) region = {"SNSP-\?\?-ITA"};
if(E == 0x0b) region = {"SNSP-\?\?-ROC"};
if(E == 0x0d) region = {"SNSP-\?\?-KOR"};
if(E == 0x0f) region = { "SNS-\?\?-CAN"};
if(E == 0x10) region = { "SNS-\?\?-BRA"};
if(E == 0x11) region = {"SNSP-\?\?-AUS"};
if(E == 0x00) region = {"SHVC-JPN"};
if(E == 0x01) region = { "SNS-USA"};
if(E == 0x02) region = {"SNSP-EUR"};
if(E == 0x03) region = {"SNSP-SCN"};
if(E == 0x06) region = {"SNSP-FRA"};
if(E == 0x07) region = {"SNSP-HOL"};
if(E == 0x08) region = {"SNSP-ESP"};
if(E == 0x09) region = {"SNSP-NOE"};
if(E == 0x0a) region = {"SNSP-ITA"};
if(E == 0x0b) region = {"SNSP-ROC"};
if(E == 0x0d) region = {"SNSP-KOR"};
if(E == 0x0f) region = { "SNS-CAN"};
if(E == 0x10) region = { "SNS-BRA"};
if(E == 0x11) region = {"SNSP-AUS"};
}
return region ? region : "NTSC";
@ -207,41 +207,48 @@ auto SuperFamicom::revision() const -> string {
}
if(!revision) {
if(E == 0x00) revision = {"SHVC-\?\?-", F};
if(E == 0x01) revision = { "SNS-\?\?-", F};
if(E == 0x02) revision = {"SNSP-\?\?-", F};
if(E == 0x03) revision = {"SSWE-\?\?-", F};
if(E == 0x06) revision = {"SFRA-\?\?-", F};
if(E == 0x07) revision = {"SHOL-\?\?-", F};
if(E == 0x08) revision = {"SESP-\?\?-", F};
if(E == 0x09) revision = {"SFRG-\?\?-", F};
if(E == 0x0a) revision = {"SITA-\?\?-", F};
if(E == 0x0b) revision = {"SSCN-\?\?-", F};
if(E == 0x0d) revision = {"SKOR-\?\?-", F};
if(E == 0x0f) revision = { "SNS-\?\?-", F};
if(E == 0x10) revision = {"SBRA-\?\?-", F};
if(E == 0x11) revision = {"SNSP-\?\?-", F};
if(E == 0x00) revision = {"SHVC-", F};
if(E == 0x01) revision = { "SNS-", F};
if(E == 0x02) revision = {"SNSP-", F};
if(E == 0x03) revision = {"SSWE-", F};
if(E == 0x06) revision = {"SFRA-", F};
if(E == 0x07) revision = {"SHOL-", F};
if(E == 0x08) revision = {"SESP-", F};
if(E == 0x09) revision = {"SFRG-", F};
if(E == 0x0a) revision = {"SITA-", F};
if(E == 0x0b) revision = {"SSCN-", F};
if(E == 0x0d) revision = {"SKOR-", F};
if(E == 0x0f) revision = { "SNS-", F};
if(E == 0x10) revision = {"SBRA-", F};
if(E == 0x11) revision = {"SNSP-", F};
}
return revision ? revision : string{"1.", F};
}
auto SuperFamicom::board() const -> string {
auto mapModeLo = data[headerAddress + 0x25] & 15;
auto mapMode = data[headerAddress + 0x25];
auto cartridgeType = data[headerAddress + 0x26];
auto cartridgeTypeLo = cartridgeType & 15;
auto cartridgeTypeHi = cartridgeType >> 4;
auto cartridgeSubType = data[headerAddress + 0x2f];
auto cartridgeSubType = data[headerAddress + 0x0f];
string board;
string mode;
if(mapModeLo == 0x0) mode = "LOROM-";
if(mapModeLo == 0x1) mode = "HIROM-";
if(mapModeLo == 0x2) mode = "SDD1-";
if(mapModeLo == 0x3) mode = "SA1-";
if(mapModeLo == 0x5) mode = "EXHIROM-";
if(mapModeLo == 0xa) mode = "SPC7110-";
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 = "EXHIROM-";
if(mapMode == 0x2a || mapMode == 0x3a) mode = "SPC7110-";
//many games will store an extra title character, overwriting the map mode
if(!mode) {
if(headerAddress == 0x7fb0) mode = "LOROM-";
if(headerAddress == 0xffb0) mode = "HIROM-";
if(headerAddress == 0x40ffb0) mode = "EXHIROM-";
}
if(serial() == "A9PJ") {
board.append("ST-");

View File

@ -96,7 +96,12 @@ auto ManagedNode::_find(const string& query) const -> vector<Node> {
return result;
}
//operator[](string)
auto ManagedNode::_lookup(const string& path) const -> Node {
auto result = _find(path);
return result ? result[0] : Node{};
/*//faster, but cannot search
if(auto position = path.find("/")) {
auto name = slice(path, 0, *position);
for(auto& node : _children) {
@ -108,6 +113,7 @@ auto ManagedNode::_lookup(const string& path) const -> Node {
if(path == node->_name) return node;
}
return {};
*/
}
auto ManagedNode::_create(const string& path) -> Node {