1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-19 23:32:28 +00:00

Allows the fast-tape mechanism to take ownership of tape handling.

Any successful fast tape interaction will now permanently pause the tape until a failed interaction occurs. This may or may not be a good idea.
This commit is contained in:
Thomas Harte 2018-03-30 21:22:52 -04:00
parent 183a5379de
commit f6fb368d88

View File

@ -545,26 +545,31 @@ class ConcreteMachine:
Storage::Tape::Commodore::Parser parser; Storage::Tape::Commodore::Parser parser;
std::unique_ptr<Storage::Tape::Commodore::Header> header = parser.get_next_header(tape_->get_tape()); std::unique_ptr<Storage::Tape::Commodore::Header> header = parser.get_next_header(tape_->get_tape());
// serialise to wherever b2:b3 points const uint64_t tape_position = tape_->get_tape()->get_offset();
uint16_t tape_buffer_pointer = static_cast<uint16_t>(user_basic_memory_[0xb2]) | static_cast<uint16_t>(user_basic_memory_[0xb3] << 8);
if(header) { if(header) {
// serialise to wherever b2:b3 points
const uint16_t tape_buffer_pointer = static_cast<uint16_t>(user_basic_memory_[0xb2]) | static_cast<uint16_t>(user_basic_memory_[0xb3] << 8);
header->serialise(&user_basic_memory_[tape_buffer_pointer], 0x8000 - tape_buffer_pointer); header->serialise(&user_basic_memory_[tape_buffer_pointer], 0x8000 - tape_buffer_pointer);
hold_tape_ = true;
printf("Found header\n");
} else { } else {
// no header found, so store end-of-tape // no header found, so pretend this hack never interceded
user_basic_memory_[tape_buffer_pointer] = 0x05; // i.e. end of tape tape_->get_tape()->set_offset(tape_position);
hold_tape_ = false;
printf("Didn't find header\n");
} }
// clear status and the verify flag // clear status and the verify flag
user_basic_memory_[0x90] = 0; user_basic_memory_[0x90] = 0;
user_basic_memory_[0x93] = 0; user_basic_memory_[0x93] = 0;
*value = 0x0c; // i.e. NOP abs *value = 0x0c; // i.e. NOP abs, to swallow the entire JSR
} else if(address == 0xf90b) { } else if(address == 0xf90b) {
uint8_t x = static_cast<uint8_t>(m6502_.get_value_of_register(CPU::MOS6502::Register::X)); uint8_t x = static_cast<uint8_t>(m6502_.get_value_of_register(CPU::MOS6502::Register::X));
if(x == 0xe) { if(x == 0xe) {
Storage::Tape::Commodore::Parser parser; Storage::Tape::Commodore::Parser parser;
const uint64_t tape_position = tape_->get_tape()->get_offset(); const uint64_t tape_position = tape_->get_tape()->get_offset();
std::unique_ptr<Storage::Tape::Commodore::Data> data = parser.get_next_data(tape_->get_tape()); const std::unique_ptr<Storage::Tape::Commodore::Data> data = parser.get_next_data(tape_->get_tape());
if(data) { if(data) {
uint16_t start_address, end_address; uint16_t start_address, end_address;
start_address = static_cast<uint16_t>(user_basic_memory_[0xc1] | (user_basic_memory_[0xc2] << 8)); start_address = static_cast<uint16_t>(user_basic_memory_[0xc1] | (user_basic_memory_[0xc2] << 8));
@ -591,8 +596,12 @@ class ConcreteMachine:
// ensure that the PC leaps to 0xfccf // ensure that the PC leaps to 0xfccf
m6502_.set_value_of_register(CPU::MOS6502::Register::ProgramCounter, 0xfccf); m6502_.set_value_of_register(CPU::MOS6502::Register::ProgramCounter, 0xfccf);
*value = 0xea; // i.e. NOP implied *value = 0xea; // i.e. NOP implied
hold_tape_ = true;
printf("Found data\n");
} else { } else {
tape_->get_tape()->set_offset(tape_position); tape_->get_tape()->set_offset(tape_position);
hold_tape_ = false;
printf("Didn't find data\n");
} }
} }
} }
@ -621,7 +630,7 @@ class ConcreteMachine:
typer_.reset(); typer_.reset();
} }
} }
if(!tape_is_sleeping_) tape_->run_for(Cycles(1)); if(!tape_is_sleeping_ && !hold_tape_) tape_->run_for(Cycles(1));
if(c1540_) c1540_->run_for(Cycles(1)); if(c1540_) c1540_->run_for(Cycles(1));
return Cycles(1); return Cycles(1);
@ -755,6 +764,7 @@ class ConcreteMachine:
// Tape // Tape
std::shared_ptr<Storage::Tape::BinaryTapePlayer> tape_; std::shared_ptr<Storage::Tape::BinaryTapePlayer> tape_;
bool use_fast_tape_hack_ = false; bool use_fast_tape_hack_ = false;
bool hold_tape_ = false;
bool allow_fast_tape_hack_ = false; bool allow_fast_tape_hack_ = false;
bool tape_is_sleeping_ = true; bool tape_is_sleeping_ = true;
void set_use_fast_tape() { void set_use_fast_tape() {