diff --git a/Analyser/Machines.hpp b/Analyser/Machines.hpp index 2f36858bf..7159408f8 100644 --- a/Analyser/Machines.hpp +++ b/Analyser/Machines.hpp @@ -24,7 +24,8 @@ enum class Machine { MSX, Oric, Vic20, - ZX8081 + ZX8081, + ZXSpectrum, }; } diff --git a/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp b/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp index bd9c0acf8..16b772740 100644 --- a/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp +++ b/Analyser/Static/ZXSpectrum/StaticAnalyser.cpp @@ -8,6 +8,48 @@ #include "StaticAnalyser.hpp" -Analyser::Static::TargetList Analyser::Static::ZXSpectrum::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { - return {}; +#include "../../../Storage/Tape/Parsers/Spectrum.hpp" + +namespace { + +bool IsSpectrumTape(const std::shared_ptr &tape) { + using Parser = Storage::Tape::ZXSpectrum::Parser; + Parser parser(Parser::MachineType::ZXSpectrum); + + while(true) { + const auto block = parser.find_block(tape); + if(!block) break; + + // Check for a Spectrum header block. + if(block->type == 0x00) { + return true; + } + } + + return false; +} + +} + +Analyser::Static::TargetList Analyser::Static::ZXSpectrum::GetTargets(const Media &media, const std::string &, TargetPlatform::IntType) { + TargetList destination; + auto target = std::make_unique(); + target->confidence = 0.5; + + if(!media.tapes.empty()) { + bool has_spectrum_tape = false; + for(auto &tape: media.tapes) { + has_spectrum_tape |= IsSpectrumTape(tape); + } + + if(has_spectrum_tape) { + target->media.tapes = media.tapes; + } + } + + // If any media survived, add the target. + if(!target->media.empty()) + destination.push_back(std::move(target)); + + return destination; }