From b76c923ff4dd8ad25fa6cd2f6aede40a2fa42b1a Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Mar 2021 19:53:51 -0400 Subject: [PATCH] Adds detection of Spectrum-bootable disks. --- Analyser/Static/AmstradCPC/StaticAnalyser.cpp | 4 +- Analyser/Static/StaticAnalyser.cpp | 2 +- Analyser/Static/ZXSpectrum/StaticAnalyser.cpp | 37 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Analyser/Static/AmstradCPC/StaticAnalyser.cpp b/Analyser/Static/AmstradCPC/StaticAnalyser.cpp index 500e3ce55..2ca6924b6 100644 --- a/Analyser/Static/AmstradCPC/StaticAnalyser.cpp +++ b/Analyser/Static/AmstradCPC/StaticAnalyser.cpp @@ -11,12 +11,12 @@ #include #include -#include "Target.hpp" - #include "../../../Storage/Disk/Parsers/CPM.hpp" #include "../../../Storage/Disk/Encodings/MFM/Parser.hpp" #include "../../../Storage/Tape/Parsers/Spectrum.hpp" +#include "Target.hpp" + namespace { bool strcmp_insensitive(const char *a, const char *b) { diff --git a/Analyser/Static/StaticAnalyser.cpp b/Analyser/Static/StaticAnalyser.cpp index 28cfc894e..7fe020af2 100644 --- a/Analyser/Static/StaticAnalyser.cpp +++ b/Analyser/Static/StaticAnalyser.cpp @@ -128,7 +128,7 @@ static Media GetMediaAndPlatforms(const std::string &file_name, TargetPlatform:: Format( "dsk", result.disks, Disk::DiskImageHolder, - TargetPlatform::AmstradCPC | TargetPlatform::Oric) // DSK (Amstrad CPC) + TargetPlatform::AmstradCPC | TargetPlatform::Oric | TargetPlatform::ZXSpectrum) // DSK (Amstrad CPC, etc) Format("dsk", result.disks, Disk::DiskImageHolder, TargetPlatform::DiskII) // DSK (Apple II) Format("dsk", result.disks, Disk::DiskImageHolder, TargetPlatform::Macintosh) // DSK (Macintosh, floppy disk) Format("dsk", result.mass_storage_devices, MassStorage::HFV, TargetPlatform::Macintosh) // DSK (Macintosh, hard disk) diff --git a/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp b/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp index 637a106a2..cb3e0f687 100644 --- a/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp +++ b/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp @@ -8,7 +8,9 @@ #include "StaticAnalyser.hpp" +#include "../../../Storage/Disk/Encodings/MFM/Parser.hpp" #include "../../../Storage/Tape/Parsers/Spectrum.hpp" + #include "Target.hpp" namespace { @@ -30,6 +32,28 @@ bool IsSpectrumTape(const std::shared_ptr &tape) { return false; } +bool IsSpectrumDisk(const std::shared_ptr &disk) { + Storage::Encodings::MFM::Parser parser(true, disk); + + // Get logical sector 1; the Spectrum appears to support various physical + // sectors as sector 1. + Storage::Encodings::MFM::Sector *boot_sector = nullptr; + uint8_t sector_mask = 0; + while(!boot_sector) { + boot_sector = parser.get_sector(0, 0, sector_mask + 1); + sector_mask += 0x40; + if(!sector_mask) break; + } + if(!boot_sector) return false; + + // Test that the contents of the boot sector sum to 3, modulo 256. + uint8_t byte_sum = 0; + for(auto byte: boot_sector->samples[0]) { + byte_sum += byte; + } + return byte_sum == 3; +} + } Analyser::Static::TargetList Analyser::Static::ZXSpectrum::GetTargets(const Media &media, const std::string &, TargetPlatform::IntType) { @@ -48,6 +72,19 @@ Analyser::Static::TargetList Analyser::Static::ZXSpectrum::GetTargets(const Medi } } + if(!media.disks.empty()) { + bool has_spectrum_disk = false; + + for(auto &disk: media.disks) { + has_spectrum_disk |= IsSpectrumDisk(disk); + } + + if(has_spectrum_disk) { + target->media.disks = media.disks; + target->model = Target::Model::Plus3; + } + } + // If any media survived, add the target. if(!target->media.empty()) destination.push_back(std::move(target));