mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-21 05:29:13 +00:00
Adds detection of Spectrum-bootable disks.
This commit is contained in:
parent
3c1131a84b
commit
b76c923ff4
@ -11,12 +11,12 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "Target.hpp"
|
|
||||||
|
|
||||||
#include "../../../Storage/Disk/Parsers/CPM.hpp"
|
#include "../../../Storage/Disk/Parsers/CPM.hpp"
|
||||||
#include "../../../Storage/Disk/Encodings/MFM/Parser.hpp"
|
#include "../../../Storage/Disk/Encodings/MFM/Parser.hpp"
|
||||||
#include "../../../Storage/Tape/Parsers/Spectrum.hpp"
|
#include "../../../Storage/Tape/Parsers/Spectrum.hpp"
|
||||||
|
|
||||||
|
#include "Target.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool strcmp_insensitive(const char *a, const char *b) {
|
bool strcmp_insensitive(const char *a, const char *b) {
|
||||||
|
@ -128,7 +128,7 @@ static Media GetMediaAndPlatforms(const std::string &file_name, TargetPlatform::
|
|||||||
Format( "dsk",
|
Format( "dsk",
|
||||||
result.disks,
|
result.disks,
|
||||||
Disk::DiskImageHolder<Storage::Disk::CPCDSK>,
|
Disk::DiskImageHolder<Storage::Disk::CPCDSK>,
|
||||||
TargetPlatform::AmstradCPC | TargetPlatform::Oric) // DSK (Amstrad CPC)
|
TargetPlatform::AmstradCPC | TargetPlatform::Oric | TargetPlatform::ZXSpectrum) // DSK (Amstrad CPC, etc)
|
||||||
Format("dsk", result.disks, Disk::DiskImageHolder<Storage::Disk::AppleDSK>, TargetPlatform::DiskII) // DSK (Apple II)
|
Format("dsk", result.disks, Disk::DiskImageHolder<Storage::Disk::AppleDSK>, TargetPlatform::DiskII) // DSK (Apple II)
|
||||||
Format("dsk", result.disks, Disk::DiskImageHolder<Storage::Disk::MacintoshIMG>, TargetPlatform::Macintosh) // DSK (Macintosh, floppy disk)
|
Format("dsk", result.disks, Disk::DiskImageHolder<Storage::Disk::MacintoshIMG>, TargetPlatform::Macintosh) // DSK (Macintosh, floppy disk)
|
||||||
Format("dsk", result.mass_storage_devices, MassStorage::HFV, TargetPlatform::Macintosh) // DSK (Macintosh, hard disk)
|
Format("dsk", result.mass_storage_devices, MassStorage::HFV, TargetPlatform::Macintosh) // DSK (Macintosh, hard disk)
|
||||||
|
@ -8,7 +8,9 @@
|
|||||||
|
|
||||||
#include "StaticAnalyser.hpp"
|
#include "StaticAnalyser.hpp"
|
||||||
|
|
||||||
|
#include "../../../Storage/Disk/Encodings/MFM/Parser.hpp"
|
||||||
#include "../../../Storage/Tape/Parsers/Spectrum.hpp"
|
#include "../../../Storage/Tape/Parsers/Spectrum.hpp"
|
||||||
|
|
||||||
#include "Target.hpp"
|
#include "Target.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -30,6 +32,28 @@ bool IsSpectrumTape(const std::shared_ptr<Storage::Tape::Tape> &tape) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSpectrumDisk(const std::shared_ptr<Storage::Disk::Disk> &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) {
|
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 any media survived, add the target.
|
||||||
if(!target->media.empty())
|
if(!target->media.empty())
|
||||||
destination.push_back(std::move(target));
|
destination.push_back(std::move(target));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user