1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-22 12:33:29 +00:00

Formally introduces fast tape support as an option.

It doesn't feel that fast yet though.
This commit is contained in:
Thomas Harte 2021-03-12 22:57:02 -05:00
parent 7a8317ad81
commit 7d778bc328
3 changed files with 19 additions and 5 deletions

View File

@ -918,7 +918,7 @@ template <bool has_fdc> class ConcreteMachine:
uint16_t address = cycle.address ? *cycle.address : 0x0000; uint16_t address = cycle.address ? *cycle.address : 0x0000;
switch(cycle.operation) { switch(cycle.operation) {
case CPU::Z80::PartialMachineCycle::ReadOpcode: 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; using Parser = Storage::Tape::ZXSpectrum::Parser;
Parser parser(Parser::MachineType::AmstradCPC); Parser parser(Parser::MachineType::AmstradCPC);
@ -965,8 +965,8 @@ template <bool has_fdc> class ConcreteMachine:
*cycle.value = 0xc9; *cycle.value = 0xc9;
break; break;
} }
[[fallthrough]]; [[fallthrough]];
case CPU::Z80::PartialMachineCycle::Read: case CPU::Z80::PartialMachineCycle::Read:
*cycle.value = read_pointers_[address >> 14][address & 16383]; *cycle.value = read_pointers_[address >> 14][address & 16383];
break; break;
@ -1017,6 +1017,7 @@ template <bool has_fdc> class ConcreteMachine:
} }
} }
break; break;
case CPU::Z80::PartialMachineCycle::Input: case CPU::Z80::PartialMachineCycle::Input:
// Default to nothing answering // Default to nothing answering
*cycle.value = 0xff; *cycle.value = 0xff;
@ -1172,12 +1173,15 @@ template <bool has_fdc> class ConcreteMachine:
std::unique_ptr<Reflection::Struct> get_options() final { std::unique_ptr<Reflection::Struct> get_options() final {
auto options = std::make_unique<Options>(Configurable::OptionsType::UserFriendly); auto options = std::make_unique<Options>(Configurable::OptionsType::UserFriendly);
options->output = get_video_signal_configurable(); options->output = get_video_signal_configurable();
options->quickload = allow_fast_tape_hack_;
return options; return options;
} }
void set_options(const std::unique_ptr<Reflection::Struct> &str) { void set_options(const std::unique_ptr<Reflection::Struct> &str) {
const auto options = dynamic_cast<Options *>(str.get()); const auto options = dynamic_cast<Options *>(str.get());
set_video_signal_configurable(options->output); set_video_signal_configurable(options->output);
allow_fast_tape_hack_ = options->quickload;
set_use_fast_tape_hack();
} }
// MARK: - Joysticks // MARK: - Joysticks
@ -1261,6 +1265,11 @@ template <bool has_fdc> class ConcreteMachine:
static constexpr uint16_t tape_speed_value_address = has_fdc ? 0xb1e7 : 0xbc8f; static constexpr uint16_t tape_speed_value_address = has_fdc ? 0xb1e7 : 0xbc8f;
static constexpr uint16_t tape_crc_address = has_fdc ? 0xb1eb : 0xb8d3; static constexpr uint16_t tape_crc_address = has_fdc ? 0xb1eb : 0xb8d3;
CRC::CCITT tape_crc_; 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 clock_offset_;
HalfCycles crtc_counter_; HalfCycles crtc_counter_;

View File

@ -29,12 +29,17 @@ class Machine {
static Machine *AmstradCPC(const Analyser::Static::Target *target, const ROMMachine::ROMFetcher &rom_fetcher); static Machine *AmstradCPC(const Analyser::Static::Target *target, const ROMMachine::ROMFetcher &rom_fetcher);
/// Defines the runtime options available for an Amstrad CPC. /// Defines the runtime options available for an Amstrad CPC.
class Options: public Reflection::StructImpl<Options>, public Configurable::DisplayOption<Options> { class Options: public Reflection::StructImpl<Options>, public Configurable::DisplayOption<Options>, public Configurable::QuickloadOption<Options> {
friend Configurable::DisplayOption<Options>; friend Configurable::DisplayOption<Options>;
friend Configurable::QuickloadOption<Options>;
public: public:
Options(Configurable::OptionsType) : Configurable::DisplayOption<Options>(Configurable::Display::RGB) { Options(Configurable::OptionsType type) :
Configurable::DisplayOption<Options>(Configurable::Display::RGB),
Configurable::QuickloadOption<Options>(type == Configurable::OptionsType::UserFriendly)
{
if(needs_declare()) { if(needs_declare()) {
declare_display_option(); declare_display_option();
declare_quickload_option();
limit_enum(&output, Configurable::Display::RGB, Configurable::Display::CompositeColour, -1); limit_enum(&output, Configurable::Display::RGB, Configurable::Display::CompositeColour, -1);
} }
} }

View File

@ -250,7 +250,7 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K
- (NSString *)optionsPanelNibName { - (NSString *)optionsPanelNibName {
switch(_targets.front()->machine) { 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::AppleII: return @"AppleIIOptions";
case Analyser::Machine::Atari2600: return @"Atari2600Options"; case Analyser::Machine::Atari2600: return @"Atari2600Options";
case Analyser::Machine::AtariST: return @"CompositeOptions"; case Analyser::Machine::AtariST: return @"CompositeOptions";