1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-16 18:30:32 +00:00

Merge pull request #1299 from TomHarte/SpectreNIB

Mildly clean up around NIBs.
This commit is contained in:
Thomas Harte 2024-01-02 09:52:55 -05:00 committed by GitHub
commit ce2337f91e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 9 deletions

View File

@ -61,7 +61,12 @@ void DiskII::set_control(Control control, bool on) {
if(stepper_mask_&2) direction += (((stepper_position_ - 2) + 4)&7) - 4; if(stepper_mask_&2) direction += (((stepper_position_ - 2) + 4)&7) - 4;
if(stepper_mask_&4) direction += (((stepper_position_ - 4) + 4)&7) - 4; if(stepper_mask_&4) direction += (((stepper_position_ - 4) + 4)&7) - 4;
if(stepper_mask_&8) direction += (((stepper_position_ - 6) + 4)&7) - 4; if(stepper_mask_&8) direction += (((stepper_position_ - 6) + 4)&7) - 4;
const int bits_set = (stepper_mask_&1) + ((stepper_mask_ >> 1)&1) + ((stepper_mask_ >> 2)&1) + ((stepper_mask_ >> 3)&1);
// TODO: when adopting C++20, replace with std::popcount.
int bits_set = stepper_mask_;
bits_set = (bits_set & 0x5) + ((bits_set >> 1) & 0x5);
bits_set = (bits_set & 0x3) + ((bits_set >> 2) & 0x3);
direction /= bits_set; direction /= bits_set;
// Compare to the stepper position to decide whether that pulls in the current cog notch, // Compare to the stepper position to decide whether that pulls in the current cog notch,
@ -126,7 +131,7 @@ void DiskII::run_for(const Cycles cycles) {
if(inputs_&input_mode) { if(inputs_&input_mode) {
// state_ & 0x80 should be the current level sent to the disk; // state_ & 0x80 should be the current level sent to the disk;
// therefore transitions in that bit should become flux transitions // therefore transitions in that bit should become flux transitions
drives_[active_drive_].write_bit(!!((state_ ^ address) & 0x80)); drives_[active_drive_].write_bit((state_ ^ address) & 0x80);
} }
// TODO: surely there's a less heavyweight solution than inline updates? // TODO: surely there's a less heavyweight solution than inline updates?
@ -179,7 +184,7 @@ void DiskII::decide_clocking_preference() {
} }
bool DiskII::is_write_protected() { bool DiskII::is_write_protected() {
return !!(stepper_mask_ & 2) | drives_[active_drive_].get_is_read_only(); return (stepper_mask_ & 2) || drives_[active_drive_].get_is_read_only();
} }
void DiskII::set_state_machine(const std::vector<uint8_t> &state_machine) { void DiskII::set_state_machine(const std::vector<uint8_t> &state_machine) {

View File

@ -55,6 +55,8 @@ long NIB::file_offset(Track::Address address) {
} }
std::shared_ptr<::Storage::Disk::Track> NIB::get_track_at_position(::Storage::Disk::Track::Address address) { std::shared_ptr<::Storage::Disk::Track> NIB::get_track_at_position(::Storage::Disk::Track::Address address) {
static constexpr size_t MinimumSyncByteCount = 4;
// NIBs contain data for a fixed quantity of integer-position tracks underneath a single head only. // NIBs contain data for a fixed quantity of integer-position tracks underneath a single head only.
// //
// Therefore: // Therefore:
@ -77,9 +79,9 @@ std::shared_ptr<::Storage::Disk::Track> NIB::get_track_at_position(::Storage::Di
} }
// NIB files leave sync bytes implicit and make no guarantees // NIB files leave sync bytes implicit and make no guarantees
// about overall track positioning. The attempt works by locating // about overall track positioning. This attempt to map to real
// any single run of FF that is sufficiently long and marking the last // flux locates any single run of FF that is sufficiently long
// five as including slip bits. // and marks the last few as including slip bits.
std::set<size_t> sync_locations; std::set<size_t> sync_locations;
for(size_t index = 0; index < track_data.size(); ++index) { for(size_t index = 0; index < track_data.size(); ++index) {
// Count the number of FFs starting from here. // Count the number of FFs starting from here.
@ -90,9 +92,9 @@ std::shared_ptr<::Storage::Disk::Track> NIB::get_track_at_position(::Storage::Di
++length; ++length;
} }
// If that's at least five, regress and mark all as syncs. // If that's long enough, regress and mark syncs.
if(length >= 5) { if(length >= MinimumSyncByteCount) {
for(int c = 0; c < 5; c++) { for(int c = 0; c < int(MinimumSyncByteCount); c++) {
end = (end + track_data.size() - 1) % track_data.size(); end = (end + track_data.size() - 1) % track_data.size();
sync_locations.insert(end); sync_locations.insert(end);
} }