mirror of
https://github.com/TomHarte/CLK.git
synced 2025-12-22 04:18:01 +00:00
Apply filename constraint.
This commit is contained in:
@@ -155,14 +155,34 @@ struct TapeHandler: public ClockingHint::Observer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: search for file matching raw_name.
|
|
||||||
Storage::Tape::Commodore::Parser parser(TargetPlatform::Plus4);
|
|
||||||
const auto start_offset = tape_player_->serialiser()->offset();
|
const auto start_offset = tape_player_->serialiser()->offset();
|
||||||
const auto header = parser.get_next_header(*tape_player_->serialiser());
|
const auto abort = [&]() {
|
||||||
if(header && header->parity_was_valid) {
|
tape_player_->serialiser()->set_offset(start_offset);
|
||||||
const auto body = parser.get_next_data(*tape_player_->serialiser());
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Search for first thing that matches the file name.
|
||||||
|
Storage::Tape::Commodore::Parser parser(TargetPlatform::Plus4);
|
||||||
|
auto &serialiser = *tape_player_->serialiser();
|
||||||
|
std::unique_ptr<Storage::Tape::Commodore::Header> header;
|
||||||
|
while(true) {
|
||||||
|
if(parser.is_at_end(serialiser)) {
|
||||||
|
return abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
header = parser.get_next_header(serialiser);
|
||||||
|
if(header && header->parity_was_valid) {
|
||||||
|
if(raw_name.empty() || raw_name == header->raw_name) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto body = parser.get_next_data(*tape_player_->serialiser());
|
||||||
|
if(!body || !body->parity_was_valid) {
|
||||||
|
return abort();
|
||||||
|
}
|
||||||
|
|
||||||
if(body && body->parity_was_valid) {
|
|
||||||
// Copy header into place.
|
// Copy header into place.
|
||||||
header->serialise(&ram[HeaderBuffer], uint16_t(ram.size() - HeaderBuffer));
|
header->serialise(&ram[HeaderBuffer], uint16_t(ram.size() - HeaderBuffer));
|
||||||
|
|
||||||
@@ -220,11 +240,6 @@ struct TapeHandler: public ClockingHint::Observer {
|
|||||||
m6502.set_registers(registers);
|
m6502.set_registers(registers);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tape_player_->serialiser()->set_offset(start_offset);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename M6502T, typename MemoryT>
|
template <typename M6502T, typename MemoryT>
|
||||||
std::optional<AcceleratedRange> accelerated_range(const uint16_t pc, M6502T &, MemoryT &map) {
|
std::optional<AcceleratedRange> accelerated_range(const uint16_t pc, M6502T &, MemoryT &map) {
|
||||||
|
|||||||
Reference in New Issue
Block a user