From e216912ca31a94c068b7d128ca8bbf8a24e7af5d Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Mon, 5 Mar 2018 15:34:07 +1100 Subject: [PATCH] Update to v106r09 release. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit byuu says: Changelog: - higan, icarus, genius: new manifest syntax (work in progress) Pretty much only LoROM and HiROM SNES games will load right now, and RAM will only work right if the save.ram file already exists to pull its file size from (a temporary cheap hack was used.) Basically, I'm just getting this out there for evaluation. One minor errata is that I switched icarus to using “memory/battery” to indicate battery-backed RAM, whereas genius still uses “memory/volatile” to indicate non-battery-backed RAM. I intend to make it “memory/battery” in genius, and have the field auto-enable when RAM or RTC is selected for type (obviously allowing it to be unchecked for volatile memory.) I need to update all 64 production boards, and 25 of 29 generic boards, to use the new slot syntax; and I also need to update every single core in higan to use the new manifest game syntax. I want to build out a generic manifest game parser that all emulation cores will use. Once I finish this, I'll also need to write a database converter to update all of my licensed game dumps to the new database syntax. I also need to write up something for doc.byuu.org explaining the new manifest game syntax. The manifest board syntax will still be “internal” and subject to revisions, but once v107 is out, the gamepak manifest format will be set in stone sans extensions. --- genius/genius.cpp | 339 +++++--- genius/genius.hpp | 95 ++- higan/emulator/emulator.hpp | 2 +- higan/sfc/cartridge/load.cpp | 80 +- higan/systems/Super Famicom.sys/boards.bml | 821 +++++++++---------- hiro/resource/icon/place/settings.png | Bin 0 -> 629 bytes hiro/resource/resource.bml | 1 + hiro/resource/resource.cpp | 22 + hiro/resource/resource.hpp | 1 + icarus/Database/BS Memory.bml | 2 +- icarus/Database/Sufami Turbo.bml | 2 +- icarus/Database/Super Famicom.bml | 879 ++++++++++++++++++++- icarus/core/super-famicom.cpp | 12 +- icarus/heuristics/bs-memory.cpp | 7 +- icarus/heuristics/famicom.cpp | 54 +- icarus/heuristics/game-boy-advance.cpp | 17 +- icarus/heuristics/game-boy.cpp | 29 +- icarus/heuristics/game-gear.cpp | 8 +- icarus/heuristics/heuristics.cpp | 39 +- icarus/heuristics/heuristics.hpp | 30 +- icarus/heuristics/master-system.cpp | 9 +- icarus/heuristics/mega-drive.cpp | 13 +- icarus/heuristics/pc-engine.cpp | 7 +- icarus/heuristics/sufami-turbo.cpp | 8 +- icarus/heuristics/super-famicom.cpp | 172 ++-- icarus/heuristics/supergrafx.cpp | 7 +- icarus/heuristics/wonderswan.cpp | 21 +- 27 files changed, 1925 insertions(+), 752 deletions(-) create mode 100644 hiro/resource/icon/place/settings.png diff --git a/genius/genius.cpp b/genius/genius.cpp index 4be8c666..d79af809 100644 --- a/genius/genius.cpp +++ b/genius/genius.cpp @@ -8,6 +8,7 @@ using namespace hiro; unique_pointer listWindow; unique_pointer gameWindow; unique_pointer memoryWindow; +unique_pointer oscillatorWindow; // @@ -35,7 +36,7 @@ ListWindow::ListWindow() { helpMenu.setText("Help"); aboutAction.setText("About ...").onActivate([&] { MessageDialog().setParent(*this).setTitle("About").setText({ - "genius v01\n", + "genius\n", "Author: byuu\n", "Website: https://byuu.org/" }).information(); @@ -58,7 +59,7 @@ ListWindow::ListWindow() { onClose([&] { quit(); }); - setSize({960, 600}); + setSize({820, 600}); reloadList(); updateWindow(); setCentered(); @@ -116,19 +117,31 @@ auto ListWindow::loadDatabase(string location) -> void { for(auto node : document.find("game")) { Game game; game.sha256 = node["sha256"].text(); + game.label = node["label"].text(); + game.name = node["name"].text(); game.region = node["region"].text(); game.revision = node["revision"].text(); game.board = node["board"].text(); - game.name = node["name"].text(); - game.label = node["label"].text(); - game.note = node["note"].text(); - for(auto leaf : node.find("memory")) { - Memory memory; - memory.type = leaf["type"].text(); - memory.size = leaf["size"].text(); - memory.name = leaf["name"].text(); - game.memories.append(memory); + for(auto object : node["board"]) { + Component component; + if(object.name() == "memory") { + component.type = Component::Type::Memory; + component.memory.type = object["type"].text(); + component.memory.size = object["size"].text(); + component.memory.category = object["category"].text(); + component.memory.manufacturer = object["manufacturer"].text(); + component.memory.part = object["part"].text(); + component.memory.note = object["note"].text(); + component.memory.isVolatile = (bool)object["volatile"]; + } + if(object.name() == "oscillator") { + component.type = Component::Type::Oscillator; + component.oscillator.frequency = object["frequency"].text(); + component.oscillator.note = object["note"].text(); + } + game.components.append(component); } + game.note = node["note"].text(); games.append(game); } @@ -147,7 +160,10 @@ auto ListWindow::saveDatabase(string location) -> void { auto copy = games; copy.sort([](auto x, auto y) { - return string::icompare(x.name, y.name) < 0; + return string::icompare( + {x.name, " ", x.region, " ", x.revision}, + {y.name, " ", y.region, " ", y.revision} + ) < 0; }); fp.print("database\n"); @@ -155,22 +171,41 @@ auto ListWindow::saveDatabase(string location) -> void { for(auto& game : copy) { fp.print("game\n"); - fp.print(" sha256: ", game.sha256, "\n"); - fp.print(" region: ", game.region, "\n"); + fp.print(" sha256: ", game.sha256, "\n"); + if(game.label) + fp.print(" label: ", game.label, "\n"); + fp.print(" name: ", game.name, "\n"); + fp.print(" region: ", game.region, "\n"); fp.print(" revision: ", game.revision, "\n"); if(game.board) - fp.print(" board: ", game.board, "\n"); - fp.print(" name: ", game.name, "\n"); - if(game.label) - fp.print(" label: ", game.label, "\n"); - if(game.note) - fp.print(" note: ", game.note, "\n"); - for(auto& memory : game.memories) { - fp.print(" memory\n"); - fp.print(" type: ", memory.type, "\n"); - fp.print(" size: ", memory.size, "\n"); - fp.print(" name: ", memory.name, "\n"); + fp.print(" board: ", game.board, "\n"); + else if(game.components) + fp.print(" board\n"); + for(auto& component : game.components) { + if(component.type == Component::Type::Memory) { + fp.print(" memory\n"); + fp.print(" type: ", component.memory.type, "\n"); + fp.print(" size: ", component.memory.size, "\n"); + fp.print(" category: ", component.memory.category, "\n"); + if(component.memory.manufacturer) + fp.print(" manufacturer: ", component.memory.manufacturer, "\n"); + if(component.memory.part) + fp.print(" part: ", component.memory.part, "\n"); + if(component.memory.note) + fp.print(" note: ", component.memory.note, "\n"); + if(component.memory.isVolatile) + fp.print(" volatile\n"); + } + + if(component.type == Component::Type::Oscillator) { + fp.print(" oscillator\n"); + fp.print(" frequency: ", component.oscillator.frequency, "\n"); + if(component.oscillator.note) + fp.print(" note: ", component.oscillator.note, "\n"); + } } + if(game.note) + fp.print(" note: ", game.note, "\n"); fp.print("\n"); } @@ -219,39 +254,52 @@ GameWindow::GameWindow() { gameWindow = this; layout.setMargin(5); - hashLabel.setText("SHA256:"); + hashLabel.setText("SHA256:").setAlignment(1.0); hashEdit.setFont(Font().setFamily(Font::Mono)).onChange([&] { modified = true, updateWindow(); }); - regionLabel.setText("Region:"); + regionLabel.setText("Region:").setAlignment(1.0); regionEdit.setFont(Font().setFamily(Font::Mono)).onChange([&] { modified = true, updateWindow(); }); revisionLabel.setText("Revision:"); revisionEdit.setFont(Font().setFamily(Font::Mono)).onChange([&] { modified = true, updateWindow(); }); boardLabel.setText("Board:"); boardEdit.setFont(Font().setFamily(Font::Mono)).onChange([&] { modified = true, updateWindow(); }); - nameLabel.setText("Name:"); + nameLabel.setText("Name:").setAlignment(1.0); nameEdit.onChange([&] { modified = true, updateWindow(); }); - labelLabel.setText("Label:"); + labelLabel.setText("Label:").setAlignment(1.0); labelEdit.onChange([&] { modified = true, updateWindow(); }); - noteLabel.setText("Note:"); + noteLabel.setText("Note:").setAlignment(1.0); noteEdit.onChange([&] { modified = true, updateWindow(); }); - memoryList.onActivate([&] { modifyButton.doActivate(); }); - memoryList.onChange([&] { updateWindow(); }); - appendButton.setText("Append").onActivate([&] { + componentLabel.setText("Tree:").setAlignment({1.0, 0.0}); + componentTree.onActivate([&] { modifyComponentButton.doActivate(); }); + componentTree.onChange([&] { updateWindow(); }); + appendMemoryButton.setText("Memory").onActivate([&] { setEnabled(false); memoryWindow->show(); }); - modifyButton.setText("Modify").onActivate([&] { - if(auto item = memoryList.selected()) { + appendOscillatorButton.setText("Oscillator").onActivate([&] { + setEnabled(false); + oscillatorWindow->show(); + }); + modifyComponentButton.setText("Modify").onActivate([&] { + if(auto item = componentTree.selected()) { setEnabled(false); - memoryWindow->show(game.memories[item.offset()]); + auto path = item.path().split("/"); + auto offset = path(0).natural(); + Component component = game.components[offset]; + if(component.type == Component::Type::Memory) { + memoryWindow->show(component.memory); + } + if(component.type == Component::Type::Oscillator) { + oscillatorWindow->show(component.oscillator); + } } }); - removeButton.setText("Remove").onActivate([&] { removeMemory(); }); + removeComponentButton.setText("Remove").onActivate([&] { removeComponent(); }); acceptButton.setText("Accept").onActivate([&] { accept(); }); cancelButton.setText("Cancel").onActivate([&] { cancel(); }); onClose([&] { cancel(); }); - setSize({800, 480}); + setSize({640, 480}); setDismissable(); } @@ -260,14 +308,14 @@ auto GameWindow::show(Game game) -> void { modified = false; create = !game.sha256; - hashEdit.setText(game.sha256).setEditable(create); + hashEdit.setText(game.sha256); regionEdit.setText(game.region); revisionEdit.setText(game.revision); boardEdit.setText(game.board); nameEdit.setText(game.name); labelEdit.setText(game.label); noteEdit.setText(game.note); - acceptButton.setText(create ? "Create" : "Modify"); + acceptButton.setText(create ? "Create" : "Apply"); reloadList(); updateWindow(); @@ -314,70 +362,90 @@ auto GameWindow::cancel() -> void { } auto GameWindow::reloadList() -> void { - memoryList.reset(); - memoryList.append(TableViewHeader() - .append(TableViewColumn().setText("Type")) - .append(TableViewColumn().setText("Size")) - .append(TableViewColumn().setText("Name").setExpandable()) - ); - for(auto& memory : game.memories) { - memoryList.append(TableViewItem() - .append(TableViewCell().setText(memory.type)) - .append(TableViewCell().setText(memory.size)) - .append(TableViewCell().setText(memory.name)) - ); + componentTree.reset(); + uint counter = 1; + for(auto& component : game.components) { + TreeViewItem item; + + string index = {"[", counter++, "] "}; + if(component.type == Component::Type::Memory) { + item.setText({index, "Memory"}); + item.append(TreeViewItem().setText({"Type: ", component.memory.type})); + item.append(TreeViewItem().setText({"Size: ", component.memory.size})); + item.append(TreeViewItem().setText({"Category: ", component.memory.category})); + if(component.memory.manufacturer) + item.append(TreeViewItem().setText({"Manufacturer: ", component.memory.manufacturer})); + if(component.memory.part) + item.append(TreeViewItem().setText({"Part: ", component.memory.part})); + if(component.memory.note) + item.append(TreeViewItem().setText({"Note: ", component.memory.note})); + if(component.memory.isVolatile) + item.append(TreeViewItem().setText({"Volatile"})); + } + + if(component.type == Component::Type::Oscillator) { + item.setText({index, "Oscillator"}); + item.append(TreeViewItem().setText({"Frequency: ", component.oscillator.frequency})); + if(component.oscillator.note) + item.append(TreeViewItem().setText({"Note: ", component.oscillator.note})); + } + + componentTree.append(item); } + Application::processEvents(); - memoryList.resizeColumns(); + for(auto& item : componentTree.items()) item.setExpanded(); } auto GameWindow::updateWindow() -> void { bool valid = true; - hashEdit.setBackgroundColor( - !create ? Color{192, 255, 192} - : hashEdit.text().strip().size() == 64 ? Color{} - : (valid = false, Color{255, 224, 224}) - ); + bool hashValid = hashEdit.text().strip().size() == 64; + hashEdit.setEditable(!hashValid).setBackgroundColor( + !create || hashValid ? Color{192, 255, 192} + : (valid = false, Color{255, 224, 224})); regionEdit.setBackgroundColor(regionEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); revisionEdit.setBackgroundColor(revisionEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); boardEdit.setBackgroundColor(boardEdit.text().strip() ? Color{} : (Color{255, 255, 240})); nameEdit.setBackgroundColor(nameEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); labelEdit.setBackgroundColor(labelEdit.text().strip() ? Color{} : (Color{255, 255, 240})); noteEdit.setBackgroundColor(noteEdit.text().strip() ? Color{} : (Color{255, 255, 240})); - modifyButton.setEnabled((bool)memoryList.selected()); - removeButton.setEnabled((bool)memoryList.selected()); + modifyComponentButton.setEnabled((bool)componentTree.selected()); + removeComponentButton.setEnabled((bool)componentTree.selected()); acceptButton.setEnabled(valid); setTitle({modified ? "*" : "", create ? "Add New Game" : "Modify Game Details"}); + if(create && hashValid && hashEdit.focused()) regionEdit.setFocused(); } -auto GameWindow::appendMemory(Memory memory) -> void { +auto GameWindow::appendComponent(Component component) -> void { modified = true; - auto offset = game.memories.size(); - game.memories.append(memory); + auto offset = game.components.size(); + game.components.append(component); reloadList(); - memoryList.item(offset).setSelected().setFocused(); + componentTree.item(offset).setSelected().setFocused(); updateWindow(); } -auto GameWindow::modifyMemory(Memory memory) -> void { - if(auto item = memoryList.selected()) { +auto GameWindow::modifyComponent(Component component) -> void { + if(auto item = componentTree.selected()) { modified = true; - auto offset = item.offset(); - game.memories[offset] = memory; + auto path = item.path().split("/"); + auto offset = path(0).natural(); + game.components[offset] = component; reloadList(); - memoryList.item(offset).setSelected().setFocused(); + componentTree.item(offset).setSelected().setFocused(); updateWindow(); } } -auto GameWindow::removeMemory() -> void { - if(auto item = memoryList.selected()) { +auto GameWindow::removeComponent() -> void { + if(auto item = componentTree.selected()) { if(MessageDialog().setParent(*this).setText({ - "Are you sure you want to permanently remove this memory?\n\n", - "Name: ", item.cell(2).text() + "Are you sure you want to permanently remove this component?" }).question() == "Yes") { modified = true; - game.memories.remove(item.offset()); + auto path = item.path().split("/"); + auto offset = path(0).natural(); + game.components.remove(offset); reloadList(); updateWindow(); } @@ -390,25 +458,35 @@ MemoryWindow::MemoryWindow() { memoryWindow = this; layout.setMargin(5); - typeLabel.setText("Type:"); + typeLabel.setText("Type:").setAlignment(1.0); typeEdit.append(ComboEditItem().setText("ROM")); - typeEdit.append(ComboEditItem().setText("EPROM")); typeEdit.append(ComboEditItem().setText("EEPROM")); - typeEdit.append(ComboEditItem().setText("NOR")); - typeEdit.append(ComboEditItem().setText("PSRAM")); - typeEdit.append(ComboEditItem().setText("NVRAM")); + typeEdit.append(ComboEditItem().setText("Flash")); typeEdit.append(ComboEditItem().setText("RAM")); + typeEdit.append(ComboEditItem().setText("RTC")); typeEdit.onChange([&] { modified = true, updateWindow(); }); - sizeLabel.setText("Size:"); - sizeEdit.setFont(Font().setFamily(Font::Mono)).onChange([&] { modified = true, updateWindow(); }); - nameLabel.setText("Name:"); - nameEdit.onChange([&] { modified = true, updateWindow(); }); + sizeLabel.setText("Size:").setAlignment(1.0); + sizeEdit.onChange([&] { modified = true, updateWindow(); }); + categoryLabel.setText("Category:").setAlignment(1.0); + categoryEdit.append(ComboEditItem().setText("Program")); + categoryEdit.append(ComboEditItem().setText("Data")); + categoryEdit.append(ComboEditItem().setText("Character")); + categoryEdit.append(ComboEditItem().setText("Save")); + categoryEdit.append(ComboEditItem().setText("Time")); + categoryEdit.onChange([&] { modified = true, updateWindow(); }); + manufacturerLabel.setText("Manufacturer:").setAlignment(1.0); + manufacturerEdit.onChange([&] { modified = true, updateWindow(); }); + partLabel.setText("Part:").setAlignment(1.0); + partEdit.onChange([&] { modified = true, updateWindow(); }); + noteLabel.setText("Note:").setAlignment(1.0); + noteEdit.onChange([&] { modified = true, updateWindow(); }); + volatileOption.setText("Volatile").onToggle([&] { modified = true, updateWindow(); }); acceptButton.setText("Accept").onActivate([&] { accept(); }); cancelButton.setText("Cancel").onActivate([&] { cancel(); }); onClose([&] { cancel(); }); - setSize({280, layout.minimumSize().height()}); + setSize({320, layout.minimumSize().height()}); setDismissable(); } @@ -419,7 +497,11 @@ auto MemoryWindow::show(Memory memory) -> void { typeEdit.setText(memory.type); sizeEdit.setText(memory.size); - nameEdit.setText(memory.name); + categoryEdit.setText(memory.category); + manufacturerEdit.setText(memory.manufacturer); + partEdit.setText(memory.part); + noteEdit.setText(memory.note); + volatileOption.setChecked(memory.isVolatile); updateWindow(); setCentered(*gameWindow); @@ -431,12 +513,18 @@ auto MemoryWindow::show(Memory memory) -> void { auto MemoryWindow::accept() -> void { memory.type = typeEdit.text().strip(); memory.size = sizeEdit.text().strip(); - memory.name = nameEdit.text().strip(); + memory.category = categoryEdit.text().strip(); + memory.manufacturer = manufacturerEdit.text().strip(); + memory.part = partEdit.text().strip(); + memory.note = noteEdit.text().strip(); + memory.isVolatile = volatileOption.checked(); + Component component{Component::Type::Memory}; + component.memory = memory; if(create) { - gameWindow->appendMemory(memory); + gameWindow->appendComponent(component); } else { - gameWindow->modifyMemory(memory); + gameWindow->modifyComponent(component); } setVisible(false); @@ -458,18 +546,91 @@ auto MemoryWindow::updateWindow() -> void { bool valid = true; typeEdit.setBackgroundColor(typeEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); sizeEdit.setBackgroundColor(sizeEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); - nameEdit.setBackgroundColor(nameEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); + categoryEdit.setBackgroundColor(categoryEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); + manufacturerEdit.setBackgroundColor(manufacturerEdit.text().strip() ? Color{} : (Color{255, 255, 240})); + partEdit.setBackgroundColor(partEdit.text().strip() ? Color{} : (Color{255, 255, 240})); + noteEdit.setBackgroundColor(noteEdit.text().strip() ? Color{} : (Color{255, 255, 240})); acceptButton.setEnabled(valid); setTitle({modified ? "*" : "", create ? "Add New Memory" : "Modify Memory Details"}); } // +OscillatorWindow::OscillatorWindow() { + oscillatorWindow = this; + + layout.setMargin(5); + frequencyLabel.setText("Frequency:").setAlignment(1.0); + frequencyEdit.onChange([&] { modified = true, updateWindow(); }); + noteLabel.setText("Note:").setAlignment(1.0); + noteEdit.onChange([&] { modified = true, updateWindow(); }); + acceptButton.setText("Accept").onActivate([&] { accept(); }); + cancelButton.setText("Cancel").onActivate([&] { cancel(); }); + + onClose([&] { cancel(); }); + + setSize({320, layout.minimumSize().height()}); + setDismissable(); +} + +auto OscillatorWindow::show(Oscillator oscillator) -> void { + this->oscillator = oscillator; + modified = false; + create = !oscillator.frequency; + + frequencyEdit.setText(oscillator.frequency); + noteEdit.setText(oscillator.note); + + updateWindow(); + setCentered(*gameWindow); + setVisible(); + + frequencyEdit.setFocused(); +} + +auto OscillatorWindow::accept() -> void { + oscillator.frequency = frequencyEdit.text().strip(); + oscillator.note = noteEdit.text().strip(); + + Component component{Component::Type::Oscillator}; + component.oscillator = oscillator; + if(create) { + gameWindow->appendComponent(component); + } else { + gameWindow->modifyComponent(component); + } + + setVisible(false); + gameWindow->setEnabled(); + gameWindow->setFocused(); +} + +auto OscillatorWindow::cancel() -> void { + if(!modified || MessageDialog().setParent(*this).setText({ + "Are you sure you want to discard your changes to this property?" + }).question() == "Yes") { + setVisible(false); + gameWindow->setEnabled(); + gameWindow->setFocused(); + } +} + +auto OscillatorWindow::updateWindow() -> void { + bool valid = true; + frequencyEdit.setBackgroundColor(frequencyEdit.text().strip() ? Color{} : (valid = false, Color{255, 224, 224})); + noteEdit.setBackgroundColor(noteEdit.text().strip() ? Color{} : (Color{255, 255, 240})); + acceptButton.setEnabled(valid); + setTitle({modified ? "*" : "", create ? "Add New Property" : "Modify Property Details"}); +} + +// + #include auto nall::main(string_vector) -> void { Application::setName("genius"); new ListWindow; new GameWindow; new MemoryWindow; + new OscillatorWindow; Application::run(); } diff --git a/genius/genius.hpp b/genius/genius.hpp index 36a980e8..5ed3abab 100644 --- a/genius/genius.hpp +++ b/genius/genius.hpp @@ -1,7 +1,26 @@ struct Memory { string type; string size; - string name; + string category; + string manufacturer; + string part; + string note; + bool isVolatile = false; +}; + +struct Oscillator { + string frequency; + string note; +}; + +//variant meta-class +struct Component { + enum class Type : uint { + Memory, + Oscillator, + } type; + Memory memory; + Oscillator oscillator; }; struct Game { @@ -12,7 +31,7 @@ struct Game { string name; string label; string note; - vector memories; + vector components; }; struct ListWindow : Window { @@ -58,9 +77,9 @@ struct GameWindow : Window { auto cancel() -> void; auto reloadList() -> void; auto updateWindow() -> void; - auto appendMemory(Memory) -> void; - auto modifyMemory(Memory) -> void; - auto removeMemory() -> void; + auto appendComponent(Component) -> void; + auto modifyComponent(Component) -> void; + auto removeComponent() -> void; private: bool modified = false; @@ -77,7 +96,7 @@ private: Label revisionLabel{&infoLayout, Size{0, 0}}; LineEdit revisionEdit{&infoLayout, Size{~0, 0}}; Label boardLabel{&infoLayout, Size{0, 0}}; - LineEdit boardEdit{&infoLayout, Size{~0, 0}}; + LineEdit boardEdit{&infoLayout, Size{~0, 0}, 0}; HorizontalLayout nameLayout{&layout, Size{~0, 0}}; Label nameLabel{&nameLayout, Size{50, 0}}; LineEdit nameEdit{&nameLayout, Size{~0, 0}}; @@ -87,14 +106,17 @@ private: HorizontalLayout noteLayout{&layout, Size{~0, 0}}; Label noteLabel{¬eLayout, Size{50, 0}}; LineEdit noteEdit{¬eLayout, Size{~0, 0}}; - TableView memoryList{&layout, Size{~0, ~0}}; - HorizontalLayout controlLayout{&layout, Size{~0, 0}}; - Button appendButton{&controlLayout, Size{80, 0}}; - Button modifyButton{&controlLayout, Size{80, 0}}; - Button removeButton{&controlLayout, Size{80, 0}}; - Widget spacer{&controlLayout, Size{~0, 0}}; - Button acceptButton{&controlLayout, Size{80, 0}}; - Button cancelButton{&controlLayout, Size{80, 0}}; + HorizontalLayout lowerLayout{&layout, Size{~0, ~0}}; + Label componentLabel{&lowerLayout, Size{50, ~0}}; + TreeView componentTree{&lowerLayout, Size{~0, ~0}}; + VerticalLayout controlLayout{&lowerLayout, Size{0, ~0}}; + Button appendMemoryButton{&controlLayout, Size{80, 0}}; + Button appendOscillatorButton{&controlLayout, Size{80, 0}}; + Button modifyComponentButton{&controlLayout, Size{80, 0}}; + Button removeComponentButton{&controlLayout, Size{80, 0}}; + Widget controlSpacer{&controlLayout, Size{0, ~0}}; + Button acceptButton{&controlLayout, Size{80, 0}}; + Button cancelButton{&controlLayout, Size{80, 0}}; }; struct MemoryWindow : Window { @@ -111,15 +133,50 @@ private: VerticalLayout layout{this}; HorizontalLayout infoLayout{&layout, Size{~0, 0}}; - Label typeLabel{&infoLayout, Size{40, 0}}; + Label typeLabel{&infoLayout, Size{80, 0}}; ComboEdit typeEdit{&infoLayout, Size{~0, 0}}; Label sizeLabel{&infoLayout, Size{0, 0}}; LineEdit sizeEdit{&infoLayout, Size{~0, 0}}; - HorizontalLayout nameLayout{&layout, Size{~0, 0}}; - Label nameLabel{&nameLayout, Size{40, 0}}; - LineEdit nameEdit{&nameLayout, Size{~0, 0}}; + HorizontalLayout categoryLayout{&layout, Size{~0, 0}}; + Label categoryLabel{&categoryLayout, Size{80, 0}}; + ComboEdit categoryEdit{&categoryLayout, Size{~0, 0}}; + HorizontalLayout manufacturerLayout{&layout, Size{~0, 0}}; + Label manufacturerLabel{&manufacturerLayout, Size{80, 0}}; + LineEdit manufacturerEdit{&manufacturerLayout, Size{~0, 0}}; + HorizontalLayout partLayout{&layout, Size{~0, 0}}; + Label partLabel{&partLayout, Size{80, 0}}; + LineEdit partEdit{&partLayout, Size{~0, 0}}; + HorizontalLayout noteLayout{&layout, Size{~0, 0}}; + Label noteLabel{¬eLayout, Size{80, 0}}; + LineEdit noteEdit{¬eLayout, Size{~0, 0}}; HorizontalLayout controlLayout{&layout, Size{~0, 0}}; - Widget spacer{&controlLayout, Size{~0, 0}}; + Widget controlSpacer{&controlLayout, Size{~0, 0}}; + CheckLabel volatileOption{&controlLayout, Size{0, 0}}; + Button acceptButton{&controlLayout, Size{80, 0}}; + Button cancelButton{&controlLayout, Size{80, 0}}; +}; + +struct OscillatorWindow : Window { + OscillatorWindow(); + auto show(Oscillator = {}) -> void; + auto accept() -> void; + auto cancel() -> void; + auto updateWindow() -> void; + +private: + bool modified = false; + bool create = true; + Oscillator oscillator; + + VerticalLayout layout{this}; + HorizontalLayout frequencyLayout{&layout, Size{~0, 0}}; + Label frequencyLabel{&frequencyLayout, Size{60, 0}}; + LineEdit frequencyEdit{&frequencyLayout, Size{~0, 0}}; + HorizontalLayout noteLayout{&layout, Size{~0, 0}}; + Label noteLabel{¬eLayout, Size{60, 0}}; + LineEdit noteEdit{¬eLayout, Size{~0, 0}}; + HorizontalLayout controlLayout{&layout, Size{~0, 0}}; + Widget controlSpacer{&controlLayout, Size{~0, 0}}; Button acceptButton{&controlLayout, Size{80, 0}}; Button cancelButton{&controlLayout, Size{80, 0}}; }; diff --git a/higan/emulator/emulator.hpp b/higan/emulator/emulator.hpp index 5f4b5095..dd9de104 100644 --- a/higan/emulator/emulator.hpp +++ b/higan/emulator/emulator.hpp @@ -12,7 +12,7 @@ using namespace nall; namespace Emulator { static const string Name = "higan"; - static const string Version = "106.08"; + static const string Version = "106.09"; static const string Author = "byuu"; static const string License = "GPLv3"; static const string Website = "https://byuu.org/"; diff --git a/higan/sfc/cartridge/load.cpp b/higan/sfc/cartridge/load.cpp index 7cf35d03..d6f92d8b 100644 --- a/higan/sfc/cartridge/load.cpp +++ b/higan/sfc/cartridge/load.cpp @@ -1,13 +1,11 @@ auto Cartridge::loadBoard(Markup::Node node) -> Markup::Node { string output; - auto region = node["game/region"].text(); auto board = node["game/board"].text(); - if(board != "SHVC-SGB2-01") board.trimLeft("SHVC-", 1L); - board.trimLeft("SNSP-", 1L); - board.trimLeft("MAXI-", 1L); - board.trimLeft("MJSC-", 1L); - board.trimLeft("EA-", 1L); + if(board.beginsWith("SNSP-")) board.replace("SNSP-", "SHVC-", 1L); + if(board.beginsWith("MAXI-")) board.replace("MAXI-", "SHVC-", 1L); + if(board.beginsWith("MJSC-")) board.replace("MJSC-", "SHVC-", 1L); + if(board.beginsWith("EA-" )) board.replace("EA-", "SHVC-", 1L); if(auto fp = platform->open(ID::System, "boards.bml", File::Read, File::Required)) { auto document = BML::unserialize(fp->reads()); @@ -20,65 +18,36 @@ auto Cartridge::loadBoard(Markup::Node node) -> Markup::Node { if(string{part(0), revision, part(2)} == board) matched = true; } } - if(!matched) continue; - - if(region.endsWith("BRA") - || region.endsWith("CAN") - || region.endsWith("HKG") - || region.endsWith("JPN") - || region.endsWith("KOR") - || region.endsWith("LTN") - || region.endsWith("ROC") - || region.endsWith("USA") - || region.beginsWith("SHVC-") - || region == "NTSC") { - output.append("region=ntsc\n"); - } else { - output.append("region=pal\n"); - } - - vector rom; - vector 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") && rom) { - line.append(" name=", rom.left()["name"].text()); - line.append(" size=", rom.left()["size"].text()); - rom.removeLeft(); - } - if(line.endsWith("ram") && 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"); - } - break; + if(matched) return leaf; } } - return BML::unserialize(output); + return {}; } auto Cartridge::loadCartridge(Markup::Node node) -> void { information.title.cartridge = node["game/label"].text(); + if(region() == "Auto") { + auto region = node["game/region"].text(); + if(region.endsWith("BRA") + || region.endsWith("CAN") + || region.endsWith("HKG") + || region.endsWith("JPN") + || region.endsWith("KOR") + || region.endsWith("LTN") + || region.endsWith("ROC") + || region.endsWith("USA") + || region.beginsWith("SHVC-") + || region == "NTSC") { + information.region = "NTSC"; + } else { + information.region = "PAL"; + } + } + auto board = node["board"]; if(!board) board = loadBoard(node); - if(region() == "Auto") { - if(board["region"].text() == "ntsc") information.region = "NTSC"; - if(board["region"].text() == "pal") information.region = "PAL"; - } if(board["bsmemory"] || board["mcc/bsmemory"] || board["sa1/bsmemory"]) { if(auto loaded = platform->load(ID::BSMemory, "BS Memory", "bs")) { @@ -401,6 +370,7 @@ auto Cartridge::loadMemory(MappedRAM& ram, Markup::Node node, bool required, may auto size = node["size"].natural(); ram.allocate(size); if(auto fp = platform->open(id(), name, File::Read, required)) { + ram.allocate(fp->size()); //TODO: temporary hack fp->read(ram.data(), ram.size()); } } diff --git a/higan/systems/Super Famicom.sys/boards.bml b/higan/systems/Super Famicom.sys/boards.bml index bd42192b..4b7f5e5b 100644 --- a/higan/systems/Super Famicom.sys/boards.bml +++ b/higan/systems/Super Famicom.sys/boards.bml @@ -1,376 +1,10 @@ database - revision: 2018-02-21 + revision: 2018-03-04 //Boards (Production) database - revision: 2018-02-21 - -board: 1A0N-(01,02,10,20,30) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - map address=40-7d,c0-ff:0000-7fff mask=0x8000 - -board: 1A1B-(04,05,06) - rom - map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-ffff - -board: 1A1M-(01,10,11,20) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 1A3B-(11,12,13) - rom - map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-ffff - -board: 1A3B-20 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 1A3M-(10,20,21,30) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 1A5B-(02,04) - rom - map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-ffff - -board: 1A5M-(01,11,20) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 1B0N-(02,03,10) - 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: 1B5B-02 - 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: 1C0N - superfx - map address=00-3f,80-bf:3000-34ff - rom - map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram - map address=60-7d,e0-ff:0000-ffff - -board: 1C0N5S-01 - superfx - map address=00-3f,80-bf:3000-34ff - rom - map address=00-1f,80-9f:8000-ffff mask=0x8000 - ram - map address=60-7d,e0-ff:0000-ffff - -board: 1CA0N5S-01 - 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 - -board: 1CA0N6S-01 - 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 - -board: 1CA6B-01 - 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 - -board: 1CB0N7S-01 - superfx - map address=00-3f,80-bf:3000-34ff - rom - map address=00-3f:8000-ffff mask=0x8000 - map address=40-5f:0000-ffff - ram - map address=00-3f,80-bf:6000-7fff size=0x2000 - map address=70-71:0000-ffff - -board: 1CB5B-20 - superfx - map address=00-3f,80-bf:3000-34ff - rom - map address=00-3f:8000-ffff mask=0x8000 - map address=40-5f:0000-ffff - ram - map address=00-3f,80-bf:6000-7fff size=0x2000 - map address=70-71:0000-ffff - -board: 1CB7B-01 - superfx - map address=00-3f,80-bf:3000-34ff - rom - map address=00-3f:8000-ffff mask=0x8000 - map address=40-5f:0000-ffff - ram - map address=00-3f,80-bf:6000-7fff size=0x2000 - map address=70-71:0000-ffff - -board: 1DC0N-01 - hitachidsp model=HG51B169 frequency=20000000 - map address=00-3f,80-bf:6c00-6fff,7c00-7fff - map address=70-77:0000-7fff - rom - map address=00-3f,80-bf:8000-ffff mask=0x8000 - drom - dram - map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 - -board: 1DS0B-20 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - necdsp model=uPD96050 frequency=11000000 - map address=60-67,e0-e7:0000-3fff - prom - drom - dram - map address=68-6f,e8-ef:0000-7fff mask=0x8000 - -board: 1J0N-(01,10,20) - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - -board: 1J1M-(11,20) - 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: 1J3B-01 - 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: 1J3M-(01,11,20) - 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: 1J5M-(01,11,20) - 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: 1K0N-01 - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - necdsp model=uPD7725 frequency=8000000 - map address=00-1f,80-9f:6000-7fff mask=0xfff - prom - drom - dram - -board: 1K1B-01 - 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: 1L0N3S-01 - 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: 1L3B-(02,11) - 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: 1L5B-(11,20) - 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: 1N0N-01 - 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: 2A0N-(01,10,11,20) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - map address=40-7d,c0-ff:0000-7fff mask=0x8000 - -board: 2A1M-01 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 2A3B-01 - rom - map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 2A3M-01#R - rom - map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 2A3M-(01,11,20) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 2A5M-01 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: 2B3B-01 - rom - map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - necdsp model=uPD7725 frequency=8000000 - map address=60-6f,e0-ef:0000-7fff mask=0x3fff - prom - drom - dram - -board: 2DC0N-01 - hitachidsp model=HG51B169 frequency=20000000 - map address=00-3f,80-bf:6c00-6fff,7c00-7fff - map address=70-77:0000-7fff - rom - map address=00-3f,80-bf:8000-ffff mask=0x8000 - drom - dram - map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 - -board: 2E3M-01 - 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: 2J0N-(01,10,11,20) - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - -board: 2J3M-(01,11,20) - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - ram - map address=10-1f,30-3f,90-9f,b0-bf:6000-7fff mask=0xe000 - -board: 2J5M-01 - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - ram - map address=10-1f,30-3f,90-9f,b0-bf:6000-7fff mask=0xe000 - -board: 3J0N-01 - rom - map address=00-2f,80-af:8000-ffff - map address=40-6f,c0-ef:0000-ffff - -board: BA0N-(01,10) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - map address=40-7d,c0-ff:0000-7fff mask=0x8000 - -board: BA1M-01 - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 - -board: BA3M-(01,10) - rom - map address=00-7d,80-ff:8000-ffff mask=0x8000 - ram - map address=70-7d,f0-ff:0000-7fff mask=0x8000 + revision: 2018-02-27 board: BANDAI-PT-923 rom @@ -386,25 +20,6 @@ board: BANDAI-PT-923 ram map address=70-7d,f0-ff:0000-ffff -board: BJ0N-(01,20) - rom - map address=00-3f,80-bf:8000-ffff - map address=40-7d,c0-ff:0000-ffff - -board: BJ1M-(10,20) - 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: BJ3M-10 - 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: BSC-1A5M-02 rom map address=00-1f:8000-ffff mask=0x8000 base=0x000000 @@ -482,6 +97,420 @@ board: SGB-R-10 rom gameboy +board: SHVC-1A0N-(01,02,10,20,30) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + map address=40-7d,c0-ff:0000-7fff mask=0x8000 + +board: SHVC-1A1B-(04,05,06) + rom + map address=00-1f,80-9f:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-ffff + +board: SHVC-1A1M-(01,10,11,20) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-1A3B-(11,12,13) + rom + map address=00-1f,80-9f:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-ffff + +board: SHVC-1A3B-20 + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-1A3M-(10,20,21,30) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-1A5B-(02,04) + rom + map address=00-1f,80-9f:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-ffff + +board: SHVC-1A5M-(01,11,20) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-1B0N-(02,03,10) + 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: SHVC-1B5B-02 + 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: SHVC-1C0N + superfx + map address=00-3f,80-bf:3000-34ff + rom + map address=00-1f,80-9f:8000-ffff mask=0x8000 + ram + map address=60-7d,e0-ff:0000-ffff + +board: SHVC-1C0N5S-01 + superfx + map address=00-3f,80-bf:3000-34ff + rom + map address=00-1f,80-9f:8000-ffff mask=0x8000 + ram + map address=60-7d,e0-ff:0000-ffff + +board: SHVC-1CA0N5S-01 + 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 + +board: SHVC-1CA0N6S-01 + 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 + +board: SHVC-1CA6B-01 + 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 + +board: SHVC-1CB0N7S-01 + superfx + map address=00-3f,80-bf:3000-34ff + rom + map address=00-3f:8000-ffff mask=0x8000 + map address=40-5f:0000-ffff + ram + map address=00-3f,80-bf:6000-7fff size=0x2000 + map address=70-71:0000-ffff + +board: SHVC-1CB5B-20 + superfx + map address=00-3f,80-bf:3000-34ff + rom + map address=00-3f:8000-ffff mask=0x8000 + map address=40-5f:0000-ffff + ram + map address=00-3f,80-bf:6000-7fff size=0x2000 + map address=70-71:0000-ffff + +board: SHVC-1CB7B-01 + superfx + map address=00-3f,80-bf:3000-34ff + rom + map address=00-3f:8000-ffff mask=0x8000 + map address=40-5f:0000-ffff + ram + map address=00-3f,80-bf:6000-7fff size=0x2000 + map address=70-71:0000-ffff + +board: SHVC-1DC0N-01 + hitachidsp model=HG51B169 frequency=20000000 + map address=00-3f,80-bf:6c00-6fff,7c00-7fff + map address=70-77:0000-7fff + rom + map address=00-3f,80-bf:8000-ffff mask=0x8000 + drom + dram + map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 + +board: SHVC-1DS0B-20 + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + necdsp model=uPD96050 frequency=11000000 + map address=60-67,e0-e7:0000-3fff + prom + drom + dram + map address=68-6f,e8-ef:0000-7fff mask=0x8000 + +board: SHVC-1J0N-(01,10,20) + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + +board: SHVC-1J1M-(11,20) + 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: SHVC-1J3B-01 + 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: SHVC-1J3M-(01,11,20) + 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: SHVC-1J5M-(01,11,20) + 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: SHVC-1K0N-01 + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + necdsp model=uPD7725 frequency=8000000 + map address=00-1f,80-9f:6000-7fff mask=0xfff + prom + drom + dram + +board: SHVC-1K1B-01 + 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: SHVC-1L0N3S-01 + 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: SHVC-1L3B-(02,11) + 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: SHVC-1L5B-(11,20) + 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: SHVC-1N0N-(01,10) + 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: SHVC-2A0N-01#R + rom + map address=00-2f,80-af:8000-ffff mask=0x8000 + map address=40-6f,c0-ef:0000-ffff mask=0x8000 + +board: SHVC-2A0N-(01,10,11,20) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + map address=40-7d,c0-ff:0000-7fff mask=0x8000 + +board: SHVC-2A1M-01 + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-2A3B-01 + rom + map address=00-3f,80-bf:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-2A3M-01#R + rom + map address=00-3f,80-bf:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-2A3M-(01,11,20) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-2A5M-01 + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-2B3B-01 + rom + map address=00-3f,80-bf:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + necdsp model=uPD7725 frequency=8000000 + map address=60-6f,e0-ef:0000-7fff mask=0x3fff + prom + drom + dram + +board: SHVC-2DC0N-01 + hitachidsp model=HG51B169 frequency=20000000 + map address=00-3f,80-bf:6c00-6fff,7c00-7fff + map address=70-77:0000-7fff + rom + map address=00-3f,80-bf:8000-ffff mask=0x8000 + drom + dram + map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 + +board: SHVC-2E3M-01 + 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: SHVC-2J0N-(01,10,11,20) + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + +board: SHVC-2J3M-(01,11,20) + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + ram + map address=10-1f,30-3f,90-9f,b0-bf:6000-7fff mask=0xe000 + +board: SHVC-2J5M-01 + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + ram + map address=10-1f,30-3f,90-9f,b0-bf:6000-7fff mask=0xe000 + +board: SHVC-3J0N-01 + rom + map address=00-2f,80-af:8000-ffff + map address=40-6f,c0-ef:0000-ffff + +board: SHVC-BA0N-(01,10) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + map address=40-7d,c0-ff:0000-7fff mask=0x8000 + +board: SHVC-BA1M-01 + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-BA3M-(01,10) + rom + map address=00-7d,80-ff:8000-ffff mask=0x8000 + ram + map address=70-7d,f0-ff:0000-7fff mask=0x8000 + +board: SHVC-BJ0N-(01,20) + rom + map address=00-3f,80-bf:8000-ffff + map address=40-7d,c0-ff:0000-ffff + +board: SHVC-BJ1M-(10,20) + 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: SHVC-BJ3M-10 + 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: SHVC-LDH3C-01 + 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:4840-4842 + ram + +board: SHVC-LN3B-01 + 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 + board: SHVC-SGB2-01 rom map address=00-7d,80-ff:8000-ffff mask=0x8000 @@ -491,12 +520,12 @@ board: SHVC-SGB2-01 rom gameboy -board: YA0N-01 +board: SHVC-YA0N-01 rom map address=00-7d,80-ff:8000-ffff mask=0x8000 map address=40-7d,c0-ff:0000-7fff mask=0x8000 -board: YJ0N-01 +board: SHVC-YJ0N-01 rom map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff @@ -504,7 +533,7 @@ board: YJ0N-01 //Boards (Generic) database - revision: 2018-02-21 + revision: 2018-03-04 board: ARM-LOROM-RAM rom @@ -565,15 +594,15 @@ board: BS-SA1-RAM bsmemory board: HIROM - rom + rom name=program.rom map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff board: HIROM-RAM - rom + rom name=program.rom map address=00-3f,80-bf:8000-ffff map address=40-7d,c0-ff:0000-ffff - ram + ram name=save.ram map address=20-3f,a0-bf:6000-7fff mask=0xe000 board: HIROMEX-RAM @@ -597,13 +626,13 @@ board: HITACHI-LOROM map address=00-3f,80-bf:6000-6bff,7000-7bff mask=0xf000 board: LOROM - rom + rom name=program.rom map address=00-7d,80-ff:8000-ffff mask=0x8000 board: LOROM-RAM - rom + rom name=program.rom map address=00-3f,80-bf:8000-ffff mask=0x8000 - ram + ram name=save.ram map address=70-7d,f0-ff:0000-ffff mask=0x8000 board: LOROMEX-RAM diff --git a/hiro/resource/icon/place/settings.png b/hiro/resource/icon/place/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..259ed26dd000fcfb81b2c312980765a181a65486 GIT binary patch literal 629 zcmV-*0*d{KP)i103CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00G%aL_t(I%f*vTYZGA< zg`a6_gEXBqBcUckH-X08gk(ZUidc0eHCc%W6$Bw<{y`C3bs>l=5jQRU1EnnpL$Xl} zSV57z`Iw@D+a#2UG$mQIh#zrbXGq(0)rEI;dC%o=?>Xm%bCz@#@buY}zSBQidVJ>G znA6<7cPFFkaT7p@N){lWGgw_)Ifk7ia|v`kZsv0amSq8$p`c33ZV(Eppkt)Fl@Owm{qp(iw__VPf`x)A0JU1JXWQRj2~pit6y>TUjXqq++zL47=z84M zV#Hy}=L}+rf2;a@KDpU!Zf>k^nVnAOy)1hJ&N=yE|O=HjAr(hPT zmg@ji%XJE7kv)6g$-!_9j#TZtNz^ej(-{i8MJJi&$4?(lCGp&U;s4iPvstez0t~w? P00000NkvXXu0mjf3(pax literal 0 HcmV?d00001 diff --git a/hiro/resource/resource.bml b/hiro/resource/resource.bml index 3c3effbd..d0d12c3d 100644 --- a/hiro/resource/resource.bml +++ b/hiro/resource/resource.bml @@ -84,6 +84,7 @@ namespace name=Icon binary name=Desktop file=icon/place/desktop.png binary name=Home file=icon/place/home.png binary name=Server file=icon/place/server.png + binary name=Settings file=icon/place/settings.png binary name=Share file=icon/place/share.png namespace name=Prompt binary name=Error file=icon/prompt/error.png diff --git a/hiro/resource/resource.cpp b/hiro/resource/resource.cpp index 19096fbd..fbf4cacd 100644 --- a/hiro/resource/resource.cpp +++ b/hiro/resource/resource.cpp @@ -1756,6 +1756,28 @@ const nall::vector Server = { //size: 642 162,75,129,231,151,151,151,31,252,63,158,1,254,0,124,80,17,254,250,115,5,147,0,0,0,0,73,69,78,68,174,66, 96,130, }; +const nall::vector Settings = { //size: 629 + 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,16,0,0,0,16,8,6,0,0,0,31,243,255, + 97,0,0,0,6,98,75,71,68,0,255,0,255,0,255,160,189,167,147,0,0,0,9,112,72,89,115,0,0,11,19,0, + 0,11,19,1,0,154,156,24,0,0,0,7,116,73,77,69,7,213,11,4,11,55,32,209,169,238,103,0,0,0,29,116, + 69,88,116,67,111,109,109,101,110,116,0,67,114,101,97,116,101,100,32,119,105,116,104,32,84,104,101,32,71,73,77,80, + 239,100,37,110,0,0,1,217,73,68,65,84,56,203,197,147,77,107,19,97,20,133,159,105,107,131,52,157,52,35,161,38, + 67,55,129,198,221,132,100,66,72,138,88,117,37,53,89,137,8,21,4,33,100,254,65,17,92,117,33,136,43,17,55,45, + 253,3,165,45,8,67,178,81,12,88,65,145,188,249,152,162,130,219,36,148,137,52,37,89,180,136,31,113,97,103,72,219, + 116,213,133,119,117,121,207,229,112,239,57,231,133,115,150,116,22,240,244,217,147,190,211,63,90,122,124,230,220,152,211,220, + 189,119,39,163,235,113,19,64,136,74,22,32,159,51,88,93,91,57,134,157,36,115,9,116,61,110,230,115,6,150,101,1, + 152,161,160,74,203,110,16,10,170,160,99,166,146,105,52,77,3,232,15,146,140,13,178,89,150,197,165,105,63,183,179,11, + 238,91,44,17,37,70,212,197,79,214,168,211,248,21,191,248,211,255,189,24,185,50,75,171,209,98,251,221,118,175,109,183, + 61,59,214,78,111,202,55,229,153,240,78,80,42,149,16,162,146,253,242,249,235,183,99,27,56,130,133,130,42,0,181,90, + 173,103,219,223,95,9,81,221,84,20,229,170,36,141,62,92,200,220,10,56,231,232,122,220,213,98,196,97,202,231,12,98, + 137,127,171,250,124,62,185,217,108,110,110,172,111,153,157,78,231,189,44,123,3,206,57,249,156,49,220,133,213,181,21,66, + 65,149,88,34,202,193,193,225,225,220,92,122,9,32,28,14,27,221,110,183,7,200,213,114,157,194,110,241,180,6,111,94, + 191,93,246,43,126,49,57,233,93,188,113,237,38,63,127,253,184,208,110,183,3,145,200,236,3,73,226,242,252,245,121,121, + 220,51,78,69,84,16,162,146,125,241,252,229,253,161,54,166,146,105,90,118,3,117,70,69,157,81,47,30,65,178,51,147, + 74,166,1,204,141,245,45,215,198,145,193,117,52,77,99,207,222,167,96,22,169,150,235,0,84,203,117,10,102,145,61,123, + 223,201,193,112,13,142,84,237,187,73,212,49,51,211,25,10,187,69,39,153,230,199,79,31,78,37,241,220,127,225,255,215, + 95,179,89,175,43,2,12,187,45,0,0,0,0,73,69,78,68,174,66,96,130, +}; const nall::vector Share = { //size: 697 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,16,0,0,0,16,8,6,0,0,0,31,243,255, 97,0,0,0,4,115,66,73,84,8,8,8,8,124,8,100,136,0,0,0,9,112,72,89,115,0,0,13,215,0,0,13, diff --git a/hiro/resource/resource.hpp b/hiro/resource/resource.hpp index 5597d3dd..00b73dec 100644 --- a/hiro/resource/resource.hpp +++ b/hiro/resource/resource.hpp @@ -91,6 +91,7 @@ extern const nall::vector Bookmarks; extern const nall::vector Desktop; extern const nall::vector Home; extern const nall::vector Server; +extern const nall::vector Settings; extern const nall::vector Share; } namespace Prompt { diff --git a/icarus/Database/BS Memory.bml b/icarus/Database/BS Memory.bml index 535df0e1..a23b0561 100644 --- a/icarus/Database/BS Memory.bml +++ b/icarus/Database/BS Memory.bml @@ -1,5 +1,5 @@ database - revision: 2018-02-16 + revision: 2018-03-01 //BS Memory (JPN) diff --git a/icarus/Database/Sufami Turbo.bml b/icarus/Database/Sufami Turbo.bml index f807e1b7..9d2f8767 100644 --- a/icarus/Database/Sufami Turbo.bml +++ b/icarus/Database/Sufami Turbo.bml @@ -1,5 +1,5 @@ database - revision: 2018-02-16 + revision: 2018-03-01 //Sufami Turbo (JPN) diff --git a/icarus/Database/Super Famicom.bml b/icarus/Database/Super Famicom.bml index 6fbf45d6..06f97a41 100644 --- a/icarus/Database/Super Famicom.bml +++ b/icarus/Database/Super Famicom.bml @@ -1,5 +1,5 @@ database - revision: 2018-02-16 + revision: 2018-03-01 //Prototypes (JPN) @@ -111,7 +111,19 @@ game //Super Famicom (JPN) database - revision: 2018-02-16 + revision: 2018-03-01 + +game + sha256: 5c4e283efc338958b8dd45ebd6daf133a9eb280420a98e2e1df358ae0242c366 + region: SHVC-ASPJ-JPN + revision: SHVC-ASPJ-0 + board: SHVC-2J0N-11 + name: Amazing Spider-Man, The - Lethal Foes + label: スパイダーマン リーサルフォーズ + memory + type: ROM + size: 0x180000 + name: program.rom game sha256: 6f6bacdd73aef29ff6a015c25db4a5cd8ba31142b2cc3fe56261d23bbf8329ea @@ -145,6 +157,46 @@ game size: 0x8000 name: save.ram +game + sha256: 47779500c43a0c2e75d7684078489a17baea31170a123063b8ece6ce77359413 + region: SHVC-AAGJ-JPN + revision: SHVC-AAGJ-0 + board: SHVC-1A3M-30 + name: Ball Bullet Gun + label: ボール・ブレット・ガン + memory + type: ROM + size: 0x180000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: a05f76cbceffc7b015491a1c4d4913758484d392471bca20af1dce6fd62d878b + region: SHVC-8T + revision: SHVC-8T-0 + board: SHVC-YA0N-01 + name: Battletoads in Battlemaniacs + label: バトルトードインバトルマニアック + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: af12d61733f120ef25cac2c095e0152345143025eb9d8ef820c7f857207d46ac + region: SHVC-BV + revision: SHVC-BV-0 + board: SHVC-1A0N-20 + name: Bio Metal + label: バイオメタル + memory + type: ROM + size: 0x100000 + name: program.rom + game sha256: ecd772c4a21101d079a795e47abbe00052bef69cc1c854a328f0077016c53311 region: SHVC-AH9J-JPN @@ -181,6 +233,51 @@ game size: 0x80000 name: download.ram +game + sha256: 6e7dcbb4df32903d6ff5da1e308342c0a72f5af3f11479cf49391dc3a17d5d7b + region: SHVC-QM + revision: SHVC-QM-0 + board: SHVC-1J0N-20 + name: Captain Commando + label: キャプテンコマンドー + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 0938ff33f5bab359e383bb5499f4fcc2a488fe49747026db355c2d3d5c7c2fdb + region: SHVC-ACTJ-JPN + revision: SHVC-ACTJ-0 + board: SHVC-BJ3M-20 + name: Chrono Trigger + label: クロノ・トリガー + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: 0a8e5b78caf79f4710de3ccc41e2d1975cff3a6cb4146be9ed1c8767be1b0c5d + region: SHVC-AC9J-JPN + revision: SHVC-AC9J-0 + board: SHVC-1J3M-11 + name: Chrono Trigger - Taikenban Sample ROM + label: クロノ・トリガー 体験版サンプルROM + note: No battery on PCB + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: RAM + size: 0x2000 + name: save.ram + game sha256: c195641a1b472590cb3d0be0c48d682b9fee94d7b700dd7bd3297bb995b49307 region: SHVC-B5 @@ -197,6 +294,46 @@ game size: 0x2000 name: save.ram +game + sha256: 7fccf61a698b250f01b548fd20a7c133ef1c6dbb8172d3ee6c24657b60820a00 + region: SHVC-ADTJ-JPN + revision: SHVC-ADTJ-0 + board: SHVC-2A0N-20 + name: Deae Tonosama Appare Ichiban + label: であえ殿さま あっぱれ一番 + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: 248217975279bbf9db8e74da11a906a6dd867a3ec88441b0b031ecf900466618 + region: SHVC-3Z + revision: SHVC-3Z-0 + board: SHVC-1A0N-20 + name: Demon's Blazon - Makaimura Monshou Hen + label: デモンズ・ブレイゾン 魔界村紋章編 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 700e5d0a79a46d343216b822e28e6f3d0f33f68906f59b1c719735365c129553 + region: SHVC-ALGJ-JPN + revision: SHVC-ALGJ-1 + board: SHVC-1A3M-30 + name: Der Langrisser + label: デア ラングリッサー + memory + type: ROM + size: 0x200000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + game sha256: 38a855229eab468c3ede7573db73082c66b157adfc7af787ccac50559b747f5f region: SHVC-ZDBJ-JPN @@ -213,6 +350,18 @@ game size: 0x8000 name: save.ram +game + sha256: b7209ec3a5a0d28724f5867343195aef7cb85aeb453aa84a6cbe201b61b0d083 + region: SHVC-AM4J-JPN + revision: SHVC-AM4J-0 + board: SHVC-1J0N-20 + name: DoReMi Fantasy - Milon no Dokidoki Daibouken + label: ドレミファンタジー ミロンのドキドキ大冒険 + memory + type: ROM + size: 0x200000 + name: program.rom + game sha256: dcb14c95f058a32f40cc329793f5d95fd6cf1755cffe02c0594d1c583a06d356 region: SHVC-AEMJ-JPN @@ -261,6 +410,30 @@ game size: 0x2000 name: save.ram +game + sha256: 69d06a3f3a4f3ba769541fe94e92b42142e423e9f0924eab97865b2d826ec82d + region: SHVC-AZQJ-JPN + revision: SHVC-AZQJ-0 + board: SHVC-LDH3C-01 + name: Far East of Eden - Tengai Makyou Zero - Shounen Jump no Shou + label: Far East of Eden 天外魔境Zero 少年ジャンプの章 + memory + type: ROM + size: 0x100000 + name: program.rom + memory + type: ROM + size: 0x400000 + name: data.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + memory + type: RTC + size: 0x10 + name: rtc.ram + game sha256: 74aa3a26b66f34819fbbdcdb2475cf9161cc2590fb1ec89fb24940ef10e44332 region: SHVC-F4 @@ -277,6 +450,34 @@ game size: 0x2000 name: save.ram +game + sha256: 32125257a20c4a6495131f5df79128d189cf6dfb6d45e5314f8b0173ac6f6ebd + region: SHVC-AFZJ-JPN + revision: SHVC-AFZJ-0 + board: SHVC-1J0N-20 + name: Final Fight Tough + label: ファイナルファイト タフ + memory + type: ROM + size: 0x300000 + name: program.rom + +game + sha256: 2d0e06e970ad7a1305db754a3a92b6e07e2eab848be196c8182b48dc416f1762 + region: SHVC-BFRJ-JPN + revision: SHVC-BFRJ-0 + board: SHVC-1A5M-20 + name: Fire Emblem - Thracia 776 + label: ファイアーエムブレム トラキア776 + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: NVRAM + size: 0x8000 + name: save.ram + game sha256: db337a2e8cf6de653d092ba3489cabc658f91c63ec8a9db4e1866400aadf913f region: SHVC-AGHJ-JPN @@ -293,6 +494,94 @@ game size: 0x2000 name: save.ram +game + sha256: b248b2122a0caf99298ebd9a4f66ad8047dbfce1e4bbac8219ba3ea9fb7488b5 + region: SHVC-ET + revision: SHVC-ET-0 + board: SHVC-1J0N-10 + name: Ghost Chaser Densei + label: ゴーストチェイサー電精 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 3a59d7d8df992e9e19c3944f1e17b8a3e9500b266412f51af306e14ff543ab45 + region: SHVC-AGJJ-JPN + revision: SHVC-AGJJ-0 + board: SHVC-1A0N-30 + name: Ghoul Patrol + label: グール・パトロール + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 4e790991a1dc4a9df209f68895412597b4069b42971683c3a3092a160556f305 + region: SHVC-A3LJ-JPN + revision: SHVC-A3LJ-0 + board: SHVC-1J1M-20 + name: Gokinjo Boukentai + label: ごきんじょ冒険隊 + memory + type: ROM + size: 0x280000 + name: program.rom + memory + type: NVRAM + size: 0x800 + name: save.ram + +game + sha256: 8d4e736e1876182a5cc6d9dcc3ca4eb36b16485bc35e2f40e750d023138ada43 + region: SHVC-AV6J-JPN + revision: SHVC-AV6J-0 + board: SHVC-1A0N-30 + name: Gourmet Sentai - Bara Yarou + label: 美食戦隊 薔薇野郎 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 4a910531609abb6e0a8bab15c1c6269b608eb72cb2fbf227c0e706d0d6f6fe5b + region: SHVC-AG5J-JPN + revision: SHVC-AG5J-0 + board: SHVC-2A0N-20 + name: Great Battle V, The + label: ザ・グレイトバトルV + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: 83a9d5c7732677838fd4812071aacf04e513e43b3a52e68bd7242db23b2ecc95 + region: SHVC-AHGJ-JPN + revision: SHVC-AHGJ-0 + board: SHVC-1J0N-10 + name: Hagane + label: 鋼 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 8e0d620a307a225a757bbc9ef2a2a666792e5d533aa0279d3c0060a1b93ead82 + region: SHVC-AICJ-JPN + revision: SHVC-AICJ-0 + board: SHVC-2A0N-20 + name: Iron Commando - Koutetsu no Senshi + label: アイアンコマンドー 鋼鉄の戦士 + memory + type: ROM + size: 0x140000 + name: program.rom + game sha256: 4dfba33201de6b5dec952d0f327aeb44ed784c025a72c982356dd41b52efc219 region: SHVC-ZBPJ-JPN @@ -329,6 +618,86 @@ game size: 0x2000 name: save.ram +game + sha256: ff19a9c3f5a1ccb3ac6261886f54870ac910b0f25df9e46a436e4a621f8a0a59 + region: SHVC-HV + revision: SHVC-HV-0 + board: SHVC-1A0N-20 + name: Kagakusha Harley no Haran Banjou + label: 化学者ハリーの波乱万丈 + memory + type: ROM + size: 0x80000 + name: program.rom + +game + sha256: f9ec39546e18b15b8f6a738204d0227c1542cd8157e3e0ea16934e76f39e288c + region: SHVC-OH + revision: SHVC-OH-0 + board: SHVC-1A0N-20 + name: Karuraou + label: 迦楼羅王 + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 1281841d3b9624e3b4cc3234f46350ce65473fba8d963b30a9f25b5385b8dd83 + region: SHVC-KK + revision: SHVC-KK-0 + board: SHVC-1A0N-10 + name: Kiki Kaikai - Nazo no Kuro Manto + label: 奇々怪界 謎の黒マント + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 374e411f64e4fd581a32296c90a5c74c0adf2936003077565e0672d0a91affdf + region: SHVC-3N + revision: SHVC-3N-0 + board: SHVC-2A0N-11 + name: Kiki Kaikai - Tsukiyo Soushi + label: 奇々快界 月夜草子 + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: 1906b351d51fc0fc6d5a3cfa0fe7cb45b10d09aba256c411f5abad827bce95c6 + region: SHVC-BKKJ-JPN + revision: SHVC-BKKJ-0 + board: SHVC-1A1M-20 + name: Kirby no Kirakira Kids + label: カービイのきらきらきっず + memory + type: ROM + size: 0x200000 + name: program.rom + memory + type: NVRAM + size: 0x800 + name: save.ram + +game + sha256: 0266520683f2df2179a2e6abf62754d0e8c7d82d12e59d3d3cbf7ae403a2625f + region: SHVC-ALNJ-JPN + revision: SHVC-ALNJ-0 + board: SHVC-1J3M-20 + name: Lennus II - Fuuin no Shito + label: レナスII 封印の使徒 + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + game sha256: fe44f9d0db9f04f704764577b94e5bf2e18bc7a1c4ff1e6bdaca06d49ed6813c region: SHVC-LK @@ -341,6 +710,42 @@ game size: 0x200000 name: program.rom +game + sha256: 106c8158a10f493e0f57bd66ee3b3db36af01964bc44a48819498bf02cb1af7c + region: SHVC-AOQJ-JPN + revision: SHVC-AOQJ-0 + board: SHVC-1J0N-20 + name: Magical Drop 2 - Bunka Housou Special Version + label: マジカルドロップ2 文化放送スペシャルバージョン + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: ed617ad12c865fc9c9c5c75de840d3afeded57d13ca3a3062bf8e30095629414 + region: SHVC-AIAJ-JPN + revision: SHVC-AIAJ-0 + board: SHVC-1A0N-30 + name: Magical Pop'n + label: マジカルポップン + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 78d0f6dd9ce0813e0532c7b25c7fa0b6b945d12a4ace21aa940e98babf4dacb1 + region: SHVC-AOHJ-JPN + revision: SHVC-AOHJ-0 + board: SHVC-1A0N-30 + name: Majuuou + label: 魔獣王 + memory + type: ROM + size: 0x180000 + name: program.rom + game sha256: c51c5930b344f553415d54c3c964c050e1eb6355b10f5966deabb686e70e1750 region: SHVC-WE @@ -369,6 +774,18 @@ game size: 0x8000 name: save.ram +game + sha256: dd314086a62e587bc6ad50c84a38a6ff9082b2d2d06dc50be5fa4c096bed5da3 + region: SHVC-52 + revision: SHVC-52-0 + board: SHVC-1A0N-30 + name: Mighty Morphin Power Rangers + label: マイティ・モーフィン・パワーレンジャー + memory + type: ROM + size: 0x200000 + name: program.rom + game sha256: 2298d92acdfecc7270a6c9a57a6ddc55d7fa841fe9c0e7c0d64e33682fffa429 region: SHVC-A4WJ-JPN @@ -389,6 +806,58 @@ game size: 0x800 name: internal.ram +game + sha256: a5bfdaaf490d834917f7ac23ec115147b4c94bf4c18c62e18c64431d7cc79b01 + region: SHVC-WK + revision: SHVC-WK-0 + board: SHVC-1A0N-20 + name: Motoko-chan no Wonder Kitchen + label: もと子ちゃんのワンダーキッチン + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 97c5dcdc457fb29e6294ed93bc2a74117126c45eb399c7caf5920eca36fb63ec + region: SHVC-ANRJ-JPN + revision: SHVC-ANRJ-0 + board: SHVC-1A0N-30 + name: Ninja Ryuukenden Tomoe + label: 忍者龍剣伝巴 + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: c48a4ca22d001eb269fd85110fbe459034bf89f14b5b2733ee70b2d10c0687c0 + region: SHVC-NI + revision: SHVC-NI-0 + board: SHVC-2A0N-11 + name: Ninja Warriors, The - Again + label: ザ・ニンジャウォリアーズアゲイン + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: b41126e52ce1696da2efe524f7fd7467d76dcc3fbfa52ff6666671137587b089 + region: SHVC-AAPJ-JPN + revision: SHVC-AAPJ-0 + board: SHVC-1J3M-20 + name: Nomark Baku Haitou - Shijou Saikyou no Janshi-tachi + label: ノーマーク暴牌党 史上最強の雀士達 + memory + type: ROM + size: 0x180000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + game sha256: d712adecbde70a74c4a580fe90a45d0d19f2641d1b4e091d507bddeec9601de1 region: SHVC-ZMCJ-JPN @@ -405,6 +874,127 @@ game size: 0x8000 name: save.ram +game + sha256: 18434c35fe5196bf699494bb5dbabda23019cfea099f4ca638437fda43133b39 + region: SHVC-APSJ-JPN + revision: SHVC-APSJ-1 + board: SHVC-1A3M-30 + name: Pachinko Fan - Shouri Sengen + label: パチンコファン 勝利宣言 + memory + type: ROM + size: 0x100000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: 87e8e3f8b4fc83d2e56662c8b6844b104f6b562744c090d96cdacfcb9523af39 + region: SHVC-A77J-JPN + revision: SHVC-A77J-0 + board: SHVC-2A3M-20 + name: Pachinko Tetsujin - Nanaban Shoubu + label: パチンコ鉄人 七番勝負 + memory + type: ROM + size: 0x180000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: e9a1f5cf088e060293b5566e7f518b0da89aeaebffb1c3f73fcc3f36fac036ae + region: SHVC-APAJ-JPN + revision: SHVC-APAJ-0 + board: SHVC-1A0N-30 + name: Pitfall - Maya no Daibouken + label: ピットフォール マヤの大冒険 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 96af51216ee7d2978265a474e382835a88b78d12b456a57f39f944a048e95574 + region: SHVC-P4 + revision: SHVC-P4-0 + board: SHVC-1A0N-10 + name: Plok! + label: プロック + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: e98821977389fe0ae16ec22e1f63d226698b5f869b2228885bd231a8a551c003 + region: SHVC-APOJ-JPN + revision: SHVC-APOJ-0 + board: SHVC-1A0N-20 + name: Pokonyan! - Henpokorin Adventure + label: ポコニャン! へんぽこりんアドベンチャー + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 82a9ee11b5640409c67772363f1148517b26127cef13aa2a8ffc2480b487d81f + region: SHVC-AVCJ-JPN + revision: SHVC-AVCJ-0 + board: SHVC-1A0N-30 + name: Rendering Ranger R2 + label: レンダリング・レンジャーR² + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 4fc2832e7aa01d105ca67977b38840ec1188869b5e74d20e58613c1cd127d78f + region: SHVC-AR6J-JPN + revision: SHVC-AR6J-0 + board: SHVC-1J1M-20 + name: Rockman & Forte + label: ロックマン&フォルテ + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: NVRAM + size: 0x800 + name: save.ram + +game + sha256: 2626625f29e451746c8762f9e313d1140457fe68b27d36ce0cbee9b5c5be9743 + region: SHVC-RX + revision: SHVC-RX-0 + board: SHVC-2A0N-01#R + name: Rockman X + label: ロックマンエックス + note: Custom wiring on PCB + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: 6dfc016c571a16e5d42045060b1a88b6f3da5831e05b33c22035e1d990deccf3 + region: SHVC-AL9J-JPN + revision: SHVC-AL9J-0 + board: SHVC-1J0N-20 + name: Romancing SaGa 3 - Taikenban Sample ROM + label: ロマンシング サ・ガ3 体験版サンプルROM + memory + type: ROM + size: 0x400000 + name: program.rom + game sha256: d1e0d1c930011d22423cb7cde8feac445a00705da8067a4e53a735b08389a19d region: SHVC-ZR2J-JPN @@ -421,6 +1011,18 @@ game size: 0x10000 name: save.ram +game + sha256: 00e78318926e5cae79bce0535fddd3dccaa732f5c70e43acefc2769a9899eaed + region: SHVC-R6 + revision: SHVC-R6-0 + board: SHVC-1J0N-01 + name: Rushing Beat Shura + label: ラッシング・ビート修羅 + memory + type: ROM + size: 0x200000 + name: program.rom + game sha256: 3a709383208d8258dceb20a5e566903326515ba42931bf97fd389a415a13a72d region: SHVC-ZS5J-JPN @@ -457,6 +1059,47 @@ game size: 0x800 name: internal.ram +game + sha256: f1acb9fb0c73b4799b28c26d339823a8c6713106fdf1a15260e75ebb47b376f7 + region: SHVC-A3EJ-JPN + revision: SHVC-A3EJ-0 + board: SHVC-1J3M-20 + name: Seiken Densetsu 3 - Taikenban Sample ROM + label: 聖剣伝説3 体験版サンプルROM + note: No battery on PCB + memory + type: ROM + size: 0x400000 + name: program.rom + memory + type: RAM + size: 0x2000 + name: save.ram + +game + sha256: 601161a459e68824a24e635190e9e786dc93081803b4db66ac5a4744bb422841 + region: SHVC-EO + revision: SHVC-EO-0 + board: SHVC-2A3M-11 + name: Shounen Ninja Sasuke + label: 少年忍者サスケ + memory + type: ROM + size: 0x180000 + name: program.rom + +game + sha256: 302ba8a084081bbdd4f1f25bb473fe072b07d1514716c5a3ffd258595e9a176d + region: SHVC-2C + revision: SHVC-2C-0 + board: SHVC-2J0N-11 + name: Sonic Blast Man II + label: ソニックブラストマンII + memory + type: ROM + size: 0x180000 + name: program.rom + game sha256: 7be858fc681df6728650f460d67fe6c80d816d5fbfc530c11153f652f8b1878e region: SHVC-ZSNJ-JPN @@ -473,6 +1116,46 @@ game size: 0x10000 name: save.ram +game + sha256: efae37be832d0ea1490784d57bef00761a8bf0b5bcef9c23f558e063441c3876 + region: SHVC-ARFJ-JPN + revision: SHVC-ARFJ-0 + board: SHVC-LN3B-01 + name: Star Ocean + label: スターオーシャン + memory + type: ROM + size: 0x600000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: e722d20b9c264f81bbdb37d77338c5767f6b549af489486e75a648a0a65d5bfc + region: SHVC-ASOJ-JPN + revision: SHVC-ASOJ-0 + board: SHVC-1A0N-30 + name: Stone Protectors + label: ストーンプロテクターズ + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: f15731675e22dbf3882b777b2d8cd541a637dfdf5d8880c83903cf1e0b64590e + region: SHVC-AUZJ-JPN + revision: SHVC-AUZJ-0 + board: SHVC-1N0N-10 + name: Street Fighter Zero 2 + label: ストリートファイターZero 2 + memory + type: ROM + size: 0x400000 + name: program.rom + game sha256: edacb453da14f825f05d1134d6035f4bf034e55f7cfb97c70c4ee107eabc7342 region: SHVC-A9PJ-JPN @@ -485,6 +1168,18 @@ game size: 0x40000 name: program.rom +game + sha256: e57aa265b2fbfb7ee7f5488a3df06ae771db202d59ebbd13df8fc2db80a856f3 + region: SHVC-B2 + revision: SHVC-B2-0 + board: SHVC-1A0N-10 + name: Super Back to the Future - Part II + label: スーパー・バック・トゥ・ザ・フューチャーII + memory + type: ROM + size: 0x100000 + name: program.rom + game sha256: 442397be57b3740ca236cfb37633b95f88a2c80dafc94b56a805229793563ce1 region: SHVC-9B @@ -513,6 +1208,22 @@ game size: 0x2000 name: save.ram +game + sha256: f73238b97807fc37911d9e94ad7b671be2746baf11200974e12aeb089b7f3c35 + region: SHVC-ADEJ-JPN + revision: SHVC-ADEJ-0 + board: SHVC-2J3M-20 + name: Super Formation Soccer '95 - della Serie A - Xaqua + label: スーパーフォーメーションサッカー95 デッラセリエA ザクア + memory + type: ROM + size: 0x180000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + game sha256: 4d7fc331a811b8dc630b469262fd6f45e289243cef83101f32038158967d1b28 region: SHVC-SGB @@ -593,6 +1304,34 @@ game size: 0x2000 name: save.ram +game + sha256: 68def3754ee32d6bce8f7e346e4d46dc2861c2c590835f8151c291c78f37b21b + region: SHVC-ANWJ-JPN + revision: SHVC-ANWJ-0 + board: SHVC-1J3M-20 + name: Super Momotarou Dentetsu DX - JR Nishi Nihon Presents + label: スーパー桃太郎電鉄DX JR西日本Presents + memory + type: ROM + size: 0x200000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: 3972e52c1a6641842160ed70bac59c51d0d68a234deb8b2ad3b1e5daea38446e + region: SHVC-8Q + revision: SHVC-8Q-0 + board: SHVC-1A0N-20 + name: Super Ninja-kun + label: す~ぱ~忍者くん + memory + type: ROM + size: 0x100000 + name: program.rom + game sha256: ecd462c64516169cc83dd266af354fe676fcf53811863a361d78cc918619da0d region: SHVC-XL @@ -637,6 +1376,66 @@ game size: 0x800 name: save.ram +game + sha256: a72b6f6722decc1c9e3f979f3d637794d3016b525822dd97f2aeba88696959aa + region: SHVC-T9 + revision: SHVC-T9-0 + board: SHVC-1A0N-20 + name: Super Turrican + label: スーパータリカン + memory + type: ROM + size: 0x80000 + name: program.rom + +game + sha256: db04fad1cfb1b8a58cb05ce62ae9e66532923699b54499344869cf8143f06098 + region: SHVC-BSHJ-JPN + revision: SHVC-BSHJ-0 + board: SHVC-1J3M-20 + name: Sutte Hakkun + label: すってはっくん + memory + type: ROM + size: 0x2e0000 + name: program.rom + +game + sha256: c9002e77bcc656e033c35e2574ee6067c4c0d070943359a850806c123a558949 + region: SHVC-J3 + revision: SHVC-J3-0 + board: SHVC-1A0N-20 + name: Tatakae Genshijin 3 - Shuyaku wa Yappari Joe & Mac + label: 戦え原始人3 主役はやっぱりジョーアンドマック + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: b97f1bb3c7258d500660757a57c1c7e1d90a719dfcf7b3de5e8a0d06f7f8e814 + region: SHVC-TM + revision: SHVC-TM-0 + board: SHVC-1A0N-02 + name: Teenage Mutant Ninja Turtles - Turtles in Time + label: ティーンエージ ミュータント ニンジャ タートルズ/タートルズ イン タイム + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: d844223275a9f8d428c73d5540c6e9ddd2781c53ba8a8d733bde5835ebfa4e25 + region: SHVC-Y7 + revision: SHVC-Y7-0 + board: SHVC-1A0N-20 + name: UFO Kamen Yakisoban - Kettler no Kuroi Inbou - Keihinban + label: UFO仮面ヤキソバン ケトラーの黒い陰謀 景品版 + memory + type: ROM + size: 0x100000 + name: program.rom + game sha256: b66da2a23f249e525b1dd444596a3f10559cb3c30fa3c0bca83ed8f4405fcfcf region: SHVC-ANZJ-JPN @@ -653,6 +1452,82 @@ game size: 0x2000 name: save.ram +game + sha256: cb8073cf95eace56ba4324a2106164fa540900c2de083aff490c4afe91ae95f7 + region: SHVC-AUCJ-JPN + revision: SHVC-AUCJ-0 + board: SHVC-1J0N-20 + name: Undercover Cops + label: アンダーカバーコップス + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 6b37c3bd79db2553bf71b79efbb131d96c40462cffac54c40dbc783f1ef44428 + region: SHVC-4W + revision: SHVC-4W-0 + board: SHVC-1A0N-20 + name: Wild Guns + label: ワイルドガンズ + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 491b5d20c0e00eaa7ae89e9f4cde044408258aa31042bb3ed16dff082e01a7a7 + region: SHVC-BWCJ-JPN + revision: SHVC-BWCJ-0 + board: SHVC-1J3M-20 + name: Wrecking Crew '98 + label: レッキングクルー'98 + memory + type: ROM + size: 0x1e0000 + name: program.rom + memory + type: NVRAM + size: 0x2000 + name: save.ram + +game + sha256: c06e3c14a2f73180a7a6ff50ee76790c4542d58e8994bb3fae06412f7303d089 + region: SHVC-UY + revision: SHVC-UY-0 + board: SHVC-1A0N-20 + name: Yamaneko Bubsy no Daibouken + label: やまねこバブジーの大冒険 + memory + type: ROM + size: 0x200000 + name: program.rom + +game + sha256: 2b2fe61ac7a79c3cfaa0bc16f1b1f4da544fcc37cfdf3c18879d31b8b9f87941 + region: SHVC-YO + revision: SHVC-YO-0 + board: SHVC-1A0N-10 + name: Yoshi no Cookie - Kuruppon Oven de Cookie + label: ヨッシーのクッキー クルッポンオーブンでクッキー + memory + type: ROM + size: 0x100000 + name: program.rom + +game + sha256: 64a124461cc12dd073191563729f559d0cf8911890ca7ede051e32024f6d9695 + region: SHVC-AYOJ-JPN + revision: SHVC-AYOJ-0 + board: SHVC-1A0N-30 + name: Youkai Buster - Ruka no Daibouken + label: 妖怪バスター ルカの大冒険 + memory + type: ROM + size: 0x100000 + name: program.rom + //Super Famicom (ROC) database diff --git a/icarus/core/super-famicom.cpp b/icarus/core/super-famicom.cpp index f6895515..54824efd 100644 --- a/icarus/core/super-famicom.cpp +++ b/icarus/core/super-famicom.cpp @@ -3,9 +3,9 @@ auto Icarus::superFamicomManifest(string location) -> string { auto files = directory::files(location, "*.rom"); concatenate(buffer, {location, "program.rom"}); concatenate(buffer, {location, "data.rom" }); - for(auto& file : files.match("*.boot.rom" )) concatenate(buffer, {location, file}); for(auto& file : files.match("*.program.rom")) concatenate(buffer, {location, file}); for(auto& file : files.match("*.data.rom" )) concatenate(buffer, {location, file}); + for(auto& file : files.match("*.boot.rom" )) concatenate(buffer, {location, file}); return superFamicomManifest(buffer, location); } @@ -19,10 +19,7 @@ auto Icarus::superFamicomManifest(vector& buffer, string location) -> s if(settings["icarus/UseHeuristics"].boolean()) { Heuristics::SuperFamicom game{buffer, location}; - if(auto manifest = game.manifest()) { - if(exists({location, "msu1.rom"})) manifest.append(" msu1\n"); - return manifest; - } + if(auto manifest = game.manifest()) return manifest; } return {}; @@ -44,11 +41,12 @@ auto Icarus::superFamicomImport(vector& buffer, string location) -> str if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest); uint offset = 0; auto document = BML::unserialize(manifest); - for(auto rom : document.find("game/memory")) { + for(auto rom : document.find("game/board/memory")) { if(rom["type"].text() != "ROM") continue; - auto name = rom["name"].text(); + auto name = string{rom["part"].text(), ".", rom["category"].text(), ".rom"}.trimLeft(".", 1L).downcase(); 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}); if(location && file::size(location) == size) { write({target, name}, file::read(location)); diff --git a/icarus/heuristics/bs-memory.cpp b/icarus/heuristics/bs-memory.cpp index 0c8c35ae..705c37bc 100644 --- a/icarus/heuristics/bs-memory.cpp +++ b/icarus/heuristics/bs-memory.cpp @@ -23,9 +23,10 @@ auto BSMemory::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("NAND", data.size(), "program.rom")); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("Flash").size(data.size()).category("Program").text()); return output; } diff --git a/icarus/heuristics/famicom.cpp b/icarus/heuristics/famicom.cpp index c51df04e..632eee6c 100644 --- a/icarus/heuristics/famicom.cpp +++ b/icarus/heuristics/famicom.cpp @@ -35,66 +35,66 @@ auto Famicom::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(&data[16], data.size() - 16).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); switch(mapper) { default: - output.append(" board: NES-NROM-256\n"); + output.append(" board: NES-NROM-256\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 1: - output.append(" board: NES-SXROM\n"); + output.append(" board: NES-SXROM\n"); output.append(" chip type=MMC1B2\n"); prgram = 8192; break; case 2: - output.append(" board: NES-UOROM\n"); + output.append(" board: NES-UOROM\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 3: - output.append(" board: NES-CNROM\n"); + output.append(" board: NES-CNROM\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 4: //MMC3 - output.append(" board: NES-TLROM\n"); + output.append(" board: NES-TLROM\n"); output.append(" chip type=MMC3B\n"); prgram = 8192; //MMC6 - //output.append(" board: NES-HKROM\n"); + //output.append(" board: NES-HKROM\n"); //output.append(" chip type=MMC6\n"); //prgram = 1024; break; case 5: - output.append(" board: NES-ELROM\n"); + output.append(" board: NES-ELROM\n"); output.append(" chip type=MMC5\n"); prgram = 65536; break; case 7: - output.append(" board: NES-AOROM\n"); + output.append(" board: NES-AOROM\n"); break; case 9: - output.append(" board: NES-PNROM\n"); + output.append(" board: NES-PNROM\n"); output.append(" chip type=MMC2\n"); prgram = 8192; break; case 10: - output.append(" board: NES-FKROM\n"); + output.append(" board: NES-FKROM\n"); output.append(" chip type=MMC4\n"); prgram = 8192; break; case 16: - output.append(" board: BANDAI-FCG\n"); + output.append(" board: BANDAI-FCG\n"); output.append(" chip type=LZ93D50\n"); break; @@ -102,7 +102,7 @@ auto Famicom::manifest() const -> string { case 23: case 25: //VRC4 - output.append(" board: KONAMI-VRC-4\n"); + output.append(" board: KONAMI-VRC-4\n"); output.append(" chip type=VRC4\n"); output.append(" pinout a0=1 a1=0\n"); prgram = 8192; @@ -110,62 +110,62 @@ auto Famicom::manifest() const -> string { case 22: //VRC2 - output.append(" board: KONAMI-VRC-2\n"); + output.append(" board: KONAMI-VRC-2\n"); output.append(" chip type=VRC2\n"); output.append(" pinout a0=0 a1=1\n"); break; case 24: - output.append(" board: KONAMI-VRC-6\n"); + output.append(" board: KONAMI-VRC-6\n"); output.append(" chip type=VRC6\n"); break; case 26: - output.append(" board: KONAMI-VRC-6\n"); + output.append(" board: KONAMI-VRC-6\n"); output.append(" chip type=VRC6\n"); prgram = 8192; break; case 34: - output.append(" board: NES-BNROM\n"); + output.append(" board: NES-BNROM\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 66: - output.append(" board: NES-GNROM\n"); + output.append(" board: NES-GNROM\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); break; case 69: - output.append(" board: SUNSOFT-5B\n"); + output.append(" board: SUNSOFT-5B\n"); output.append(" chip type=5B\n"); prgram = 8192; break; case 73: - output.append(" board: KONAMI-VRC-3\n"); + output.append(" board: KONAMI-VRC-3\n"); output.append(" chip type=VRC3\n"); output.append(" mirror mode=", mirror == 0 ? "horizontal" : "vertical", "\n"); prgram = 8192; break; case 75: - output.append(" board: KONAMI-VRC-1\n"); + output.append(" board: KONAMI-VRC-1\n"); output.append(" chip type=VRC1\n"); break; case 85: - output.append(" board: KONAMI-VRC-7\n"); + output.append(" board: KONAMI-VRC-7\n"); output.append(" chip type=VRC7\n"); prgram = 8192; break; } - if(prgrom) output.append(memory("ROM", prgrom, "program.rom")); - if(prgram) output.append(memory("NVRAM", prgram, "save.ram")); + if(prgrom) output.append(Memory{}.type("ROM").size(prgrom).category("Program").text()); + if(prgram) output.append(Memory{}.type("RAM").size(prgram).category("Save").battery().text()); - if(chrrom) output.append(memory("ROM", chrrom, "character.rom")); - if(chrram) output.append(memory("RAM", chrram, "character.ram")); + if(chrrom) output.append(Memory{}.type("ROM").size(chrrom).category("Character").text()); + if(chrram) output.append(Memory{}.type("RAM").size(chrram).category("Character").text()); return output; } diff --git a/icarus/heuristics/game-boy-advance.cpp b/icarus/heuristics/game-boy-advance.cpp index ae0f9191..b9f756b6 100644 --- a/icarus/heuristics/game-boy-advance.cpp +++ b/icarus/heuristics/game-boy-advance.cpp @@ -50,16 +50,17 @@ auto GameBoyAdvance::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); if(!list); - else if(list.left().beginsWith("SRAM_V" )) output.append(memory("NVRAM", 0x8000, "save.ram")); - else if(list.left().beginsWith("SRAM_F_V" )) output.append(memory("NVRAM", 0x8000, "save.ram")); - else if(list.left().beginsWith("EEPROM_V" )) output.append(memory("EEPROM", 0x0, "save.ram")); - else if(list.left().beginsWith("FLASH_V" )) output.append(memory("NAND", 0x10000, "save.ram")); - else if(list.left().beginsWith("FLASH512_V")) output.append(memory("NAND", 0x10000, "save.ram")); - else if(list.left().beginsWith("FLASH1M_V" )) output.append(memory("NAND", 0x20000, "save.ram")); + else if(list.left().beginsWith("SRAM_V" )) output.append(Memory{}.type("RAM" ).size( 0x8000).category("Save").text()); + else if(list.left().beginsWith("SRAM_F_V" )) output.append(Memory{}.type("RAM" ).size( 0x8000).category("Save").text()); + else if(list.left().beginsWith("EEPROM_V" )) output.append(Memory{}.type("EEPROM").size( 0x0).category("Save").text()); + else if(list.left().beginsWith("FLASH_V" )) output.append(Memory{}.type("Flash" ).size(0x10000).category("Save").text()); + else if(list.left().beginsWith("FLASH512_V")) output.append(Memory{}.type("Flash" ).size(0x10000).category("Save").text()); + else if(list.left().beginsWith("FLASH1M_V" )) output.append(Memory{}.type("Flash" ).size(0x20000).category("Save").text()); return output; } diff --git a/icarus/heuristics/game-boy.cpp b/icarus/heuristics/game-boy.cpp index 79544c04..850cd52f 100644 --- a/icarus/heuristics/game-boy.cpp +++ b/icarus/heuristics/game-boy.cpp @@ -40,9 +40,9 @@ auto GameBoy::manifest() const -> string { bool accelerometer = false; bool rumble = false; - uint flashSize = 0; uint romSize = 0; uint ramSize = 0; + uint flashSize = 0; uint rtcSize = 0; string mapper = "MBC0"; @@ -218,8 +218,6 @@ auto GameBoy::manifest() const -> string { case 0x54: romSize = 96 * 16 * 1024; break; } - if(mapper == "MBC6" && flash) flashSize = 1024 * 1024; - switch(read(0x0149)) { default: case 0x00: ramSize = 0 * 1024; break; case 0x01: ramSize = 2 * 1024; break; @@ -232,21 +230,28 @@ auto GameBoy::manifest() const -> string { if(mapper == "MBC7" && ram) ramSize = 256; if(mapper == "TAMA" && ram) ramSize = 32; + if(mapper == "MBC6" && flash) flashSize = 1024 * 1024; + if(mapper == "MBC3" && rtc) rtcSize = 13; if(mapper == "TAMA" && rtc) rtcSize = 21; string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" board: ", mapper, "\n"); - if(accelerometer) output.append(" accelerometer\n"); - if(rumble) output.append(" rumble\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); - if(flash && flashSize) output.append(memory("NAND", flashSize, "download.rom")); - if(ram && ramSize) output.append(memory(battery ? "NVRAM" : "RAM", ramSize, "save.ram")); - if(rtc && rtcSize) output.append(memory("RTC", rtcSize, "rtc.ram")); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board: ", mapper, "\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); +if(ram && ramSize) + output.append(Memory{}.type("RAM").size(ramSize).category("Save").battery(battery).text()); +if(flash && flashSize) + output.append(Memory{}.type("Flash").size(flashSize).category("Download").text()); +if(rtc && rtcSize) + output.append(Memory{}.type("RTC").size(rtcSize).category("Time").battery().text()); +if(accelerometer) + output.append(" accelerometer\n"); +if(rumble) + output.append(" rumble\n"); return output; } diff --git a/icarus/heuristics/game-gear.cpp b/icarus/heuristics/game-gear.cpp index c2376c1e..2a316279 100644 --- a/icarus/heuristics/game-gear.cpp +++ b/icarus/heuristics/game-gear.cpp @@ -21,9 +21,11 @@ auto GameGear::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); + output.append(Memory{}.type("RAM").size(0x8000).category("Save").battery().text()); return output; } diff --git a/icarus/heuristics/heuristics.cpp b/icarus/heuristics/heuristics.cpp index dfef71d5..dc2e7d26 100644 --- a/icarus/heuristics/heuristics.cpp +++ b/icarus/heuristics/heuristics.cpp @@ -1,11 +1,40 @@ namespace Heuristics { -auto Heuristics::memory(string type, uint size, string name) const -> string { +auto Memory::text() const -> string { string output; - output.append(" memory\n"); - output.append(" type: ", type, "\n"); - output.append(" size: 0x", hex(size), "\n"); - output.append(" name: ", name, "\n"); + output.append(" memory\n"); + output.append(" type: ", _type, "\n"); + output.append(" size: 0x", hex(_size), "\n"); + output.append(" category: ", _category, "\n"); +if(_manufacturer) + output.append(" manufacturer: ", _manufacturer, "\n"); +if(_part) + output.append(" part: ", _part, "\n"); +if(_note) + output.append(" note: ", _note, "\n"); +if(_battery) + output.append(" battery\n"); + return output; +} + +auto Oscillator::text() const -> string { + string output; + output.append(" oscillator\n"); + output.append(" frequency: ", _frequency, "\n"); +if(_note) + output.append(" note: ", _note, "\n"); + return output; +} + +//deprecated +auto Heuristics::memory(string type, uint size, string name, string metadata) const -> string { + string output; + output.append(" memory\n"); + output.append(" type: ", type, "\n"); + output.append(" size: 0x", hex(size), "\n"); + output.append(" name: ", name, "\n"); +if(metadata) + output.append(" metadata: ", metadata, "\n"); return output; } diff --git a/icarus/heuristics/heuristics.hpp b/icarus/heuristics/heuristics.hpp index 79fcd627..50e21b1e 100644 --- a/icarus/heuristics/heuristics.hpp +++ b/icarus/heuristics/heuristics.hpp @@ -1,7 +1,35 @@ namespace Heuristics { +struct Memory { + auto& type(string type) { _type = type; return *this; } + auto& size(natural size) { _size = size; return *this; } + auto& category(string category) { _category = category; return *this; } + auto& manufacturer(string manufacturer) { _manufacturer = manufacturer; return *this; } + auto& part(string part) { _part = part; return *this; } + auto& battery(boolean battery = true) { _battery = battery; return *this; } + auto& note(string note) { _note = note; return *this; } + auto text() const -> string; + + string _type; + natural _size; + string _category; + string _manufacturer; + string _part; + boolean _battery; + string _note; +}; + +struct Oscillator { + auto& frequency(natural frequency) { _frequency = frequency; return *this; } + auto& note(string note) { _note = note; return *this; } + auto text() const -> string; + + natural _frequency; + string _note; +}; + struct Heuristics { - auto memory(string type, uint size, string name) const -> string; + auto memory(string type, uint size, string name, string metadata = {}) const -> string; }; } diff --git a/icarus/heuristics/master-system.cpp b/icarus/heuristics/master-system.cpp index e8107cd9..33099d73 100644 --- a/icarus/heuristics/master-system.cpp +++ b/icarus/heuristics/master-system.cpp @@ -21,10 +21,11 @@ auto MasterSystem::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); - output.append(memory("NVRAM", 0x8000, "save.ram")); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); + output.append(Memory{}.type("RAM").size(0x8000).category("Save").battery().text()); return output; } diff --git a/icarus/heuristics/mega-drive.cpp b/icarus/heuristics/mega-drive.cpp index 40e02d53..4fa71a79 100644 --- a/icarus/heuristics/mega-drive.cpp +++ b/icarus/heuristics/mega-drive.cpp @@ -71,14 +71,15 @@ auto MegaDrive::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); output.append(" region: ", regions.left(), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); if(ramSize && ramMode != "none") { - output.append(memory("NVRAM", ramSize, "save.ram")); - output.append(" mode: ", ramMode, "\n"); - output.append(" offset: 0x", hex(ramFrom), "\n"); + output.append(Memory{}.type("RAM").size(ramSize).category("Save").text()); + output.append(" mode: ", ramMode, "\n"); + output.append(" offset: 0x", hex(ramFrom), "\n"); } return output; } diff --git a/icarus/heuristics/pc-engine.cpp b/icarus/heuristics/pc-engine.cpp index 43ead635..c1d35ea3 100644 --- a/icarus/heuristics/pc-engine.cpp +++ b/icarus/heuristics/pc-engine.cpp @@ -26,9 +26,10 @@ auto PCEngine::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); + output.append(" label:", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); return output; } diff --git a/icarus/heuristics/sufami-turbo.cpp b/icarus/heuristics/sufami-turbo.cpp index 819f158d..67eacd26 100644 --- a/icarus/heuristics/sufami-turbo.cpp +++ b/icarus/heuristics/sufami-turbo.cpp @@ -27,10 +27,12 @@ auto SufamiTurbo::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); - if(ramSize) output.append(memory("NVRAM", ramSize, "save.ram")); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); +if(ramSize) + output.append(Memory{}.type("RAM").size(ramSize).category("Save").battery().text()); return output; } diff --git a/icarus/heuristics/super-famicom.cpp b/icarus/heuristics/super-famicom.cpp index acb115ac..3a087de8 100644 --- a/icarus/heuristics/super-famicom.cpp +++ b/icarus/heuristics/super-famicom.cpp @@ -57,66 +57,66 @@ auto SuperFamicom::manifest() const -> string { string output; output.append("game\n"); - output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" region: ", region(), "\n"); + output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); + output.append(" label: ", label(), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" region: ", region(), "\n"); output.append(" revision: ", revision(), "\n"); - output.append(" board: ", board(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", label(), "\n"); + output.append(" board: ", board(), "\n"); auto board = this->board().split("-"); - if(board.left() == "ARM") { - output.append(memory("ROM", size() - 0x28000, "program.rom")); - output.append(memory("ROM", 0x20000, {firmwareARM(), ".program.rom"})); - output.append(memory("ROM", 0x8000, {firmwareARM(), ".data.rom"})); - } else if(board.left() == "HITACHI") { - output.append(memory("ROM", size() - 0xc00, "program.rom")); - output.append(memory("ROM", 0xc00, {firmwareHITACHI(), ".data.rom"})); - } else if(board.left() == "NEC") { - output.append(memory("ROM", size() - 0x2000, "program.rom")); - output.append(memory("ROM", 0x1800, {firmwareNEC(), ".program.rom"})); - output.append(memory("ROM", 0x800, {firmwareNEC(), ".data.rom"})); - } else if(board.left() == "NECEX") { - output.append(memory("ROM", size() - 0xd000, "program.rom")); - output.append(memory("ROM", 0xc000, {firmwareNECEX(), ".program.rom"})); - output.append(memory("ROM", 0x1000, {firmwareNECEX(), ".data.rom"})); - } else if(board.left() == "SGB") { - output.append(memory("ROM", size() - 0x100, "program.rom")); - output.append(memory("ROM", 0x100, {firmwareSGB(), ".boot.rom"})); - } else if(board.left() == "SPC7110") { - output.append(memory("ROM", 0x100000, "program.rom")); - output.append(memory("ROM", size() - 0x100000, "data.rom")); - } else { - output.append(memory("ROM", size(), "program.rom")); + if(auto size = romSize()) { + if(board(0) == "SPC7110") size = 0x100000; + output.append(Memory{}.type("ROM").size(size).category("Program").text()); } if(auto size = ramSize()) { - auto type = battery() ? "NVRAM" : "RAM"; - output.append(memory(type, size, "save.ram")); + output.append(Memory{}.type("RAM").size(size).category("Save").battery(battery()).text()); } if(auto size = expansionRamSize()) { - auto type = battery() ? "NVRAM" : "RAM"; - output.append(memory(type, size, "expansion.ram")); + output.append(Memory{}.type("RAM").size(size).category("Expansion").battery(battery()).text()); } - if(board.left() == "ARM") { - output.append(memory("NVRAM", 0x4000, {firmwareARM(), ".data.ram"})); - } else if(board.left() == "BS" && board(1) == "MCC") { - output.append(memory("PSRAM", 0x80000, "download.ram")); - } else if(board.left() == "HITACHI") { - output.append(memory("RAM", 0xc00, {firmwareHITACHI(), ".data.ram"})); - } else if(board.left() == "NEC") { - output.append(memory("RAM", 0x200, {firmwareNEC(), ".data.ram"})); - } else if(board.left() == "NECEX") { - output.append(memory("NVRAM", 0x1000, {firmwareNEC(), ".data.ram"})); - } else if(board.left() == "RTC") { - output.append(memory("NVRAM", 0x10, "sharp.rtc.ram")); - } else if(board.left() == "SA1") { - output.append(memory("RAM", 0x800, "internal.ram")); - } else if(board.left() == "SPC7110" && board(1) == "RTC") { - output.append(memory("NVRAM", 0x10, "epson.rtc.ram")); + if(0) { + } else if(board(0) == "ARM") { + output.append(Memory{}.type("ROM").size(0x20000).manufacturer("SETA").part("ARM").category("Program").text()); + output.append(Memory{}.type("ROM").size( 0x8000).manufacturer("SETA").part("ARM").category("Data").text()); + output.append(Memory{}.type("RAM").size( 0x4000).manufacturer("SETA").part("ARM").category("Data").text()); + output.append(Oscillator{}.frequency(21'440'000).text()); + } else if(board(0) == "BS" && board(1) == "MCC") { + output.append(Memory{}.type("RAM").size(0x80000).category("Download").battery().text()); + output.append(Memory{}.type("RTC").size(0x10).category("Time").text()); + } else if(board(0) == "HITACHI") { + output.append(Memory{}.type("ROM").size(0xc00).manufacturer("Hitachi").part("HG51BS169").category("Data").note(firmwareHITACHI()).text()); + output.append(Memory{}.type("RAM").size(0xc00).manufacturer("Hitachi").part("HG51BS169").category("Data").note(firmwareHITACHI()).text()); + output.append(Oscillator{}.frequency(20'000'000).text()); + } else if(board(0) == "NEC") { + output.append(Memory{}.type("ROM").size(0x1800).manufacturer("NEC").part("uPD7725").category("Program").note(firmwareNEC()).text()); + output.append(Memory{}.type("ROM").size( 0x800).manufacturer("NEC").part("uPD7725").category("Data").note(firmwareNEC()).text()); + output.append(Memory{}.type("RAM").size( 0x200).manufacturer("NEC").part("uPD7725").category("Data").note(firmwareNEC()).text()); + output.append(Oscillator{}.frequency(7'600'000).text()); + } else if(board(0) == "NECEX") { + output.append(Memory{}.type("ROM").size(0xc000).manufacturer("NEC").part("uPD96050").category("Program").note(firmwareNECEX()).text()); + output.append(Memory{}.type("ROM").size(0x1000).manufacturer("NEC").part("uPD96050").category("Data").note(firmwareNECEX()).text()); + output.append(Memory{}.type("RAM").size(0x1000).manufacturer("NEC").part("uPD96050").category("Data").note(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).category("Time").battery().text()); + } else if(board(0) == "SA1") { + output.append(Memory{}.type("RAM").size(0x800).category("Internal").text()); + } else if(board(0) == "SGB") { + output.append(Memory{}.type("ROM").size(0x100).manufacturer("Nintendo").part("SGB").category("Boot").note(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).category("Data").text()); + if(board(1) == "RTC") + output.append(Memory{}.type("RTC").size(0x10).category("Time").battery().text()); + } else if(board(0) == "SUPERFX") { + //todo: MARIO CHIP 1 uses CPU oscillator + output.append(Oscillator{}.frequency(21'440'000).text()); } return output; @@ -151,20 +151,20 @@ auto SuperFamicom::region() const -> string { } if(!region) { - 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"}; + if(E == 0x00) region = {"JPN"}; + if(E == 0x01) region = {"USA"}; + if(E == 0x02) region = {"EUR"}; + if(E == 0x03) region = {"SCN"}; + if(E == 0x06) region = {"FRA"}; + if(E == 0x07) region = {"HOL"}; + if(E == 0x08) region = {"ESP"}; + if(E == 0x09) region = {"NOE"}; + if(E == 0x0a) region = {"ITA"}; + if(E == 0x0b) region = {"ROC"}; + if(E == 0x0d) region = {"KOR"}; + if(E == 0x0f) region = {"CAN"}; + if(E == 0x10) region = {"BRA"}; + if(E == 0x11) region = {"AUS"}; } return region ? region : "NTSC"; @@ -200,20 +200,7 @@ 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}; + revision = {"1.", F}; } return revision ? revision : string{"1.", F}; @@ -410,9 +397,6 @@ auto SuperFamicom::romSize() const -> uint { if((size() & 0xffff) == 0xd000) return size() - 0xd000; if((size() & 0x3ffff) == 0x28000) return size() - 0x28000; return size(); - -//auto romSize = data[headerAddress + 0x27] & 15; -//return 1024 << romSize; } auto SuperFamicom::ramSize() const -> uint { @@ -494,33 +478,33 @@ auto SuperFamicom::scoreHeader(uint address) -> uint { } auto SuperFamicom::firmwareARM() const -> string { - return "st018"; + return "ST018"; } auto SuperFamicom::firmwareHITACHI() const -> string { - return "cx4"; + return "Cx4"; } auto SuperFamicom::firmwareNEC() const -> string { - if(label() == "PILOTWINGS") return "dsp1"; - if(label() == "DUNGEON MASTER") return "dsp2"; - if(label() == "SDガンダムGX") return "dsp3"; - if(label() == "PLANETS CHAMP TG3000") return "dsp4"; - if(label() == "TOP GEAR 3000") return "dsp4"; - return "dsp1b"; + if(label() == "PILOTWINGS") return "DSP1"; + if(label() == "DUNGEON MASTER") return "DSP2"; + if(label() == "SDガンダムGX") return "DSP3"; + if(label() == "PLANETS CHAMP TG3000") return "DSP4"; + if(label() == "TOP GEAR 3000") return "DSP4"; + 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"; + 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"; + if(label() == "Super GAMEBOY") return "SGB1"; + if(label() == "Super GAMEBOY2") return "SGB2"; + return "SGB1"; } } diff --git a/icarus/heuristics/supergrafx.cpp b/icarus/heuristics/supergrafx.cpp index ad657e16..89cb0d3a 100644 --- a/icarus/heuristics/supergrafx.cpp +++ b/icarus/heuristics/supergrafx.cpp @@ -21,9 +21,10 @@ auto SuperGrafx::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); - output.append(" label: ", Location::prefix(location), "\n"); - output.append(memory("ROM", data.size(), "program.rom")); + output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); return output; } diff --git a/icarus/heuristics/wonderswan.cpp b/icarus/heuristics/wonderswan.cpp index 90c5b5e7..a30cde92 100644 --- a/icarus/heuristics/wonderswan.cpp +++ b/icarus/heuristics/wonderswan.cpp @@ -27,11 +27,11 @@ auto WonderSwan::manifest() const -> string { string ramType; uint ramSize = 0; switch(metadata[11]) { - case 0x01: ramType = "NVRAM"; ramSize = 8 * 1024; break; - case 0x02: ramType = "NVRAM"; ramSize = 32 * 1024; break; - case 0x03: ramType = "NVRAM"; ramSize = 128 * 1024; break; - case 0x04: ramType = "NVRAM"; ramSize = 256 * 1024; break; - case 0x05: ramType = "NVRAM"; ramSize = 512 * 1024; break; + case 0x01: ramType = "RAM"; ramSize = 8 * 1024; break; + case 0x02: ramType = "RAM"; ramSize = 32 * 1024; break; + case 0x03: ramType = "RAM"; ramSize = 128 * 1024; break; + case 0x04: ramType = "RAM"; ramSize = 256 * 1024; break; + case 0x05: ramType = "RAM"; ramSize = 512 * 1024; break; case 0x10: ramType = "EEPROM"; ramSize = 128; break; case 0x20: ramType = "EEPROM"; ramSize = 2048; break; case 0x50: ramType = "EEPROM"; ramSize = 1024; break; @@ -43,12 +43,15 @@ auto WonderSwan::manifest() const -> string { string output; output.append("game\n"); output.append(" sha256: ", Hash::SHA256(data).digest(), "\n"); - output.append(" name: ", Location::prefix(location), "\n"); output.append(" label: ", Location::prefix(location), "\n"); + output.append(" name: ", Location::prefix(location), "\n"); output.append(" orientation: ", !orientation ? "horizontal" : "vertical", "\n"); - output.append(memory("ROM", data.size(), "program.rom")); - if(ramType && ramSize) output.append(memory(ramType, ramSize, "save.ram")); - if(hasRTC) output.append(memory("NVRAM", 16, "rtc.ram")); + output.append(" board\n"); + output.append(Memory{}.type("ROM").size(data.size()).category("Program").text()); +if(ramType && ramSize) + output.append(Memory{}.type(ramType).size(ramSize).category("Save").battery(ramType == "RAM").text()); +if(hasRTC) + output.append(Memory{}.type("RTC").size(0x10).category("Time").text()); return output; }