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;