diff --git a/Machines/Utility/ROMCatalogue.cpp b/Machines/Utility/ROMCatalogue.cpp index a4975220c..1122b2900 100644 --- a/Machines/Utility/ROMCatalogue.cpp +++ b/Machines/Utility/ROMCatalogue.cpp @@ -8,20 +8,23 @@ #include "ROMCatalogue.hpp" +#include #include using namespace ROM; -Request::Request(Name name, bool optional) : - node.name(name), node.is_optional(optional) {} - -Request::Request() {} +Request::Request(Name name, bool optional) { + node.name = name; + node.is_optional = optional; +} Request Request::operator &&(const Request &rhs) { + (void)rhs; return *this; } Request Request::operator ||(const Request &rhs) { + (void)rhs; return *this; } @@ -31,12 +34,12 @@ bool Request::validate(const Map &) const { } std::vector Request::all_descriptions() const { - std::vector() result; + std::vector result; node.add_descriptions(result); return result; } -void Request::Node::add_descriptions(std::vector &result) { +void Request::Node::add_descriptions(std::vector &result) const { if(type == Type::One) { result.push_back(name); return; @@ -47,40 +50,53 @@ void Request::Node::add_descriptions(std::vector &result) { } } +std::optional Description::from_crc(uint32_t crc32) { + for(int name = 1; name <= SpectrumPlus3; name++) { + const Description candidate = Description(ROM::Name(name)); + + const auto found_crc = std::find(candidate.crc32s.begin(), candidate.crc32s.end(), crc32); + if(found_crc != candidate.crc32s.end()) { + return candidate; + } + } + + return std::nullopt; +} + Description::Description(Name name) { switch(name) { default: assert(false); break; case Name::AMSDOS: - *this = Request("AmstradCPC", "the Amstrad Disk Operating System", "amsdos.rom", 16*1024, 0x1fe22ecdu); + *this = Description(name, "AmstradCPC", "the Amstrad Disk Operating System", "amsdos.rom", 16*1024, 0x1fe22ecdu); break; case Name::CPC464Firmware: - *this = Request("AmstradCPC", "the CPC 464 firmware", "os464.rom", 16*1024, 0x815752dfu); + *this = Description(name, "AmstradCPC", "the CPC 464 firmware", "os464.rom", 16*1024, 0x815752dfu); break; case Name::CPC464BASIC: - *this = Request("AmstradCPC", "the CPC 464 BASIC ROM", "basic464.rom", 16*1024, 0x7d9a3bacu); + *this = Description(name, "AmstradCPC", "the CPC 464 BASIC ROM", "basic464.rom", 16*1024, 0x7d9a3bacu); break; case Name::CPC664Firmware: - *this = Request("AmstradCPC", "the CPC 664 firmware", "os664.rom", 16*1024, 0x3f5a6dc4u); + *this = Description(name, "AmstradCPC", "the CPC 664 firmware", "os664.rom", 16*1024, 0x3f5a6dc4u); break; case Name::CPC664BASIC: - *this = Request("AmstradCPC", "the CPC 664 BASIC ROM", "basic664.rom", 16*1024, 0x32fee492u); + *this = Description(name, "AmstradCPC", "the CPC 664 BASIC ROM", "basic664.rom", 16*1024, 0x32fee492u); break; case Name::CPC6128Firmware: - *this = Request("AmstradCPC", "the CPC 6128 firmware", "os664.rom", 16*1024, 0x0219bb74u); + *this = Description(name, "AmstradCPC", "the CPC 6128 firmware", "os664.rom", 16*1024, 0x0219bb74u); break; case Name::CPC6128BASIC: - *this = Request("AmstradCPC", "the CPC 6128 BASIC ROM", "basic664.rom", 16*1024, 0xca6af63du); + *this = Description(name, "AmstradCPC", "the CPC 6128 BASIC ROM", "basic664.rom", 16*1024, 0xca6af63du); break; //"AppleII" - AppleIIOriginal, - AppleIIPlus, - AppleIICharacter, - AppleIIe, - AppleIIeCharacter, - AppleIIEnhancedE, - AppleIIEnhancedECharacter, +// AppleIIOriginal, +// AppleIIPlus, +// AppleIICharacter, +// AppleIIe, +// AppleIIeCharacter, +// AppleIIEnhancedE, +// AppleIIEnhancedECharacter, } // rom_descriptions.push_back(video_.rom_description(Video::VideoBase::CharacterROM::EnhancedIIe)); diff --git a/Machines/Utility/ROMCatalogue.hpp b/Machines/Utility/ROMCatalogue.hpp index baf3f19d0..9af771f3e 100644 --- a/Machines/Utility/ROMCatalogue.hpp +++ b/Machines/Utility/ROMCatalogue.hpp @@ -10,6 +10,8 @@ #define ROMCatalogue_hpp #include +#include +#include #include namespace ROM { @@ -135,11 +137,19 @@ struct Description { /// Constructs the @c Description that correlates to @c name. Description(Name name); + + /// Constructs the @c Description that correlates to @c crc32. + static std::optional from_crc(uint32_t crc32); + + private: + template Description( + Name name, std::string machine_name, std::string descriptive_name, FileNameT file_names, size_t size, CRC32T crc32s + ) : name{name}, machine_name{machine_name}, descriptive_name{descriptive_name}, file_names{file_names}, size{size}, crc32s{crc32s} {} }; struct Request { Request(Name name, bool optional = false); - Request(); + Request() {} Request operator &&(const Request &); Request operator ||(const Request &); @@ -163,7 +173,7 @@ struct Request { bool is_optional = false; std::vector children; - void add_descriptions(std::vector &); + void add_descriptions(std::vector &) const; }; Node node; }; diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 5c90eb50a..b5932eb04 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -12,6 +12,8 @@ 4B0333AF2094081A0050B93D /* AppleDSK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0333AD2094081A0050B93D /* AppleDSK.cpp */; }; 4B0333B02094081A0050B93D /* AppleDSK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0333AD2094081A0050B93D /* AppleDSK.cpp */; }; 4B049CDD1DA3C82F00322067 /* BCDTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B049CDC1DA3C82F00322067 /* BCDTest.swift */; }; + 4B051C912669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; + 4B051C922669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; 4B05401E219D1618001BF69C /* ScanTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B05401D219D1618001BF69C /* ScanTarget.cpp */; }; 4B05401F219D1618001BF69C /* ScanTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B05401D219D1618001BF69C /* ScanTarget.cpp */; }; 4B055A7A1FAE78A00060FFFF /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B055A771FAE78210060FFFF /* SDL2.framework */; }; @@ -5325,6 +5327,7 @@ 4BB0A65C2044FD3000FB3688 /* SN76489.cpp in Sources */, 4B595FAE2086DFBA0083CAA8 /* AudioToggle.cpp in Sources */, 4B0F1C242605996900B85C66 /* ZXSpectrumTAP.cpp in Sources */, + 4B051C912669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */, 4B055AB91FAE86170060FFFF /* Acorn.cpp in Sources */, 4B302185208A550100773308 /* DiskII.cpp in Sources */, 4B0F1BB32602645900B85C66 /* StaticAnalyser.cpp in Sources */, @@ -5541,6 +5544,7 @@ 4B15A9FC208249BB005E6C8D /* StaticAnalyser.cpp in Sources */, 4B5FADC01DE3BF2B00AEC565 /* Microdisc.cpp in Sources */, 4B0F1BDA2602FF9800B85C66 /* Video.cpp in Sources */, + 4B051C922669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */, 4B54C0C81F8D91E50050900F /* Keyboard.cpp in Sources */, 4B79A5011FC913C900EEDAD5 /* MSX.cpp in Sources */, 4BEE0A701D72496600532C7B /* PRG.cpp in Sources */,