diff --git a/Machines/AmstradCPC/AmstradCPC.cpp b/Machines/AmstradCPC/AmstradCPC.cpp index 69aeee9bb..4458cf809 100644 --- a/Machines/AmstradCPC/AmstradCPC.cpp +++ b/Machines/AmstradCPC/AmstradCPC.cpp @@ -918,7 +918,7 @@ template class ConcreteMachine: uint16_t address = cycle.address ? *cycle.address : 0x0000; switch(cycle.operation) { case CPU::Z80::PartialMachineCycle::ReadOpcode: - if(address == tape_read_byte_address && read_pointers_[0] == roms_[ROMType::OS].data()) { + if(use_fast_tape_hack_ && address == tape_read_byte_address && read_pointers_[0] == roms_[ROMType::OS].data()) { using Parser = Storage::Tape::ZXSpectrum::Parser; Parser parser(Parser::MachineType::AmstradCPC); @@ -965,8 +965,8 @@ template class ConcreteMachine: *cycle.value = 0xc9; break; } - [[fallthrough]]; + case CPU::Z80::PartialMachineCycle::Read: *cycle.value = read_pointers_[address >> 14][address & 16383]; break; @@ -1017,6 +1017,7 @@ template class ConcreteMachine: } } break; + case CPU::Z80::PartialMachineCycle::Input: // Default to nothing answering *cycle.value = 0xff; @@ -1172,12 +1173,15 @@ template class ConcreteMachine: std::unique_ptr get_options() final { auto options = std::make_unique(Configurable::OptionsType::UserFriendly); options->output = get_video_signal_configurable(); + options->quickload = allow_fast_tape_hack_; return options; } void set_options(const std::unique_ptr &str) { const auto options = dynamic_cast(str.get()); set_video_signal_configurable(options->output); + allow_fast_tape_hack_ = options->quickload; + set_use_fast_tape_hack(); } // MARK: - Joysticks @@ -1261,6 +1265,11 @@ template class ConcreteMachine: static constexpr uint16_t tape_speed_value_address = has_fdc ? 0xb1e7 : 0xbc8f; static constexpr uint16_t tape_crc_address = has_fdc ? 0xb1eb : 0xb8d3; CRC::CCITT tape_crc_; + bool use_fast_tape_hack_ = false; + bool allow_fast_tape_hack_ = false; + void set_use_fast_tape_hack() { + use_fast_tape_hack_ = allow_fast_tape_hack_ && tape_player_.has_tape(); + } HalfCycles clock_offset_; HalfCycles crtc_counter_; diff --git a/Machines/AmstradCPC/AmstradCPC.hpp b/Machines/AmstradCPC/AmstradCPC.hpp index b12a8c08a..e74d6804d 100644 --- a/Machines/AmstradCPC/AmstradCPC.hpp +++ b/Machines/AmstradCPC/AmstradCPC.hpp @@ -29,12 +29,17 @@ class Machine { static Machine *AmstradCPC(const Analyser::Static::Target *target, const ROMMachine::ROMFetcher &rom_fetcher); /// Defines the runtime options available for an Amstrad CPC. - class Options: public Reflection::StructImpl, public Configurable::DisplayOption { + class Options: public Reflection::StructImpl, public Configurable::DisplayOption, public Configurable::QuickloadOption { friend Configurable::DisplayOption; + friend Configurable::QuickloadOption; public: - Options(Configurable::OptionsType) : Configurable::DisplayOption(Configurable::Display::RGB) { + Options(Configurable::OptionsType type) : + Configurable::DisplayOption(Configurable::Display::RGB), + Configurable::QuickloadOption(type == Configurable::OptionsType::UserFriendly) + { if(needs_declare()) { declare_display_option(); + declare_quickload_option(); limit_enum(&output, Configurable::Display::RGB, Configurable::Display::CompositeColour, -1); } } diff --git a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm index fa0ccf6e3..78317d352 100644 --- a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm +++ b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm @@ -250,7 +250,7 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K - (NSString *)optionsPanelNibName { switch(_targets.front()->machine) { - case Analyser::Machine::AmstradCPC: return @"CompositeOptions"; + case Analyser::Machine::AmstradCPC: return @"QuickLoadCompositeOptions"; case Analyser::Machine::AppleII: return @"AppleIIOptions"; case Analyser::Machine::Atari2600: return @"Atari2600Options"; case Analyser::Machine::AtariST: return @"CompositeOptions";