From 4b5456c9ba3f3aaa89821403536a91977a4bae02 Mon Sep 17 00:00:00 2001 From: Thomas Harte <thomas.harte@gmail.com> Date: Thu, 22 Feb 2024 22:19:10 -0500 Subject: [PATCH] Add Hugo/Nick checks. --- Analyser/Static/Acorn/Disk.cpp | 7 +++++-- Analyser/Static/Acorn/Disk.hpp | 1 + Analyser/Static/Acorn/StaticAnalyser.cpp | 8 +++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Analyser/Static/Acorn/Disk.cpp b/Analyser/Static/Acorn/Disk.cpp index 9b1516381..958baaf8f 100644 --- a/Analyser/Static/Acorn/Disk.cpp +++ b/Analyser/Static/Acorn/Disk.cpp @@ -99,8 +99,11 @@ std::unique_ptr<Catalogue> Analyser::Static::Acorn::GetADFSCatalogue(const std:: // Quick sanity checks. if(root_directory[0x4cb]) return nullptr; - if(root_directory[1] != 'H' || root_directory[2] != 'u' || root_directory[3] != 'g' || root_directory[4] != 'o') return nullptr; - if(root_directory[0x4FB] != 'H' || root_directory[0x4FC] != 'u' || root_directory[0x4FD] != 'g' || root_directory[0x4FE] != 'o') return nullptr; + catalogue->is_hugo = !memcmp(&root_directory[1], "Hugo", 4) && !memcmp(&root_directory[0x4FB], "Hugo", 4); + const bool is_nick = !memcmp(&root_directory[1], "Nick", 4) && !memcmp(&root_directory[0x4FB], "Nick", 4); + if(!catalogue->is_hugo && !is_nick) { + return nullptr; + } switch(free_space_map_second_half->samples[0][0xfd]) { default: catalogue->bootOption = Catalogue::BootOption::None; break; diff --git a/Analyser/Static/Acorn/Disk.hpp b/Analyser/Static/Acorn/Disk.hpp index f77a0fe47..a7305955a 100644 --- a/Analyser/Static/Acorn/Disk.hpp +++ b/Analyser/Static/Acorn/Disk.hpp @@ -15,6 +15,7 @@ namespace Analyser::Static::Acorn { /// Describes a DFS- or ADFS-format catalogue(/directory): the list of files available and the catalogue's boot option. struct Catalogue { + bool is_hugo = false; std::string name; std::vector<File> files; enum class BootOption { diff --git a/Analyser/Static/Acorn/StaticAnalyser.cpp b/Analyser/Static/Acorn/StaticAnalyser.cpp index 0c3eac715..7246972de 100644 --- a/Analyser/Static/Acorn/StaticAnalyser.cpp +++ b/Analyser/Static/Acorn/StaticAnalyser.cpp @@ -101,13 +101,15 @@ Analyser::Static::TargetList Analyser::Static::Acorn::GetTargets(const Media &me } if(!media.disks.empty()) { - // TODO: check for 'Hugo' versus 'Nick' in an ADFS catalogue as a hint for the Archimedes; - + // TODO: below requires an [8-bit compatible] 'Hugo' ADFS catalogue, disallowing + // [Archimedes-exclusive] 'Nick' catalogues. + // + // Would be better to form the appropriate target in the latter case. std::shared_ptr<Storage::Disk::Disk> disk = media.disks.front(); std::unique_ptr<Catalogue> dfs_catalogue, adfs_catalogue; dfs_catalogue = GetDFSCatalogue(disk); if(dfs_catalogue == nullptr) adfs_catalogue = GetADFSCatalogue(disk); - if(dfs_catalogue || adfs_catalogue) { + if(dfs_catalogue || (adfs_catalogue && adfs_catalogue->is_hugo)) { // Accept the disk and determine whether DFS or ADFS ROMs are implied. // Use the Pres ADFS if using an ADFS, as it leaves Page at &EOO. target->media.disks = media.disks;