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:
parent
7a8317ad81
commit
7d778bc328
@ -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_;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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";
|
||||||
|
Loading…
Reference in New Issue
Block a user