From 1011143dbe608d5c39b6bb1c23738f052cef5d9e Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 13 Aug 2017 21:52:48 -0400 Subject: [PATCH] Sought to correct my interpretation of 'gap 3'. --- Components/8272/i8272.cpp | 25 ++++++++++++++++++++----- Storage/Disk/Encodings/MFM.cpp | 21 ++++++++++----------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Components/8272/i8272.cpp b/Components/8272/i8272.cpp index 30542dad1..78a24a89a 100644 --- a/Components/8272/i8272.cpp +++ b/Components/8272/i8272.cpp @@ -92,6 +92,7 @@ void i8272::run_for(Cycles cycles) { // Check for completion. if(drives_[c].seek_is_satisfied()) { drives_[c].phase = Drive::CompletedSeeking; + main_status_ &= ~(1 << c); if(drives_[c].target_head_position == -1) drives_[c].head_position = 0; break; } @@ -438,17 +439,29 @@ void i8272::posit_event(int event_type) { write_data_found_header: begin_writing(); - // Write out the requested gap between ID and data. - for(int c = 0; c < command_[7]; c++) { - write_byte(0x4e); + if(get_is_double_density()) { + for(int c = 0; c < 50; c++) { + write_byte(0x4e); + } + for(int c = 0; c < 12; c++) { + write_byte(0x00); + } + } else { + for(int c = 0; c < 11; c++) { + write_byte(0xff); + } + for(int c = 0; c < 6; c++) { + write_byte(0x00); + } } + WAIT_FOR_EVENT(Event::DataWritten); { bool is_deleted = (command_[0] & 0x1f) == 0x09; if(get_is_double_density()) { get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue); - write_raw_short(Storage::Encodings::MFM::MFMSync); + for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync); write_byte(is_deleted ? Storage::Encodings::MFM::DeletedDataAddressByte : Storage::Encodings::MFM::DataAddressByte); } else { get_crc_generator().reset(); @@ -644,6 +657,7 @@ void i8272::posit_event(int event_type) { drives_[drive].target_head_position = (command_.size() > 2) ? command_[2] : -1; drives_[drive].step_rate_counter = 0; drives_[drive].seek_failed = false; + printf("Accepted seek to %d\n", drives_[drive].target_head_position); // Check whether any steps are even needed. if(drives_[drive].seek_is_satisfied()) { @@ -651,6 +665,8 @@ void i8272::posit_event(int event_type) { } else { main_status_ |= 1 << (command_[1]&3); } + } else { + printf("Rejected seek to %d\n", (command_.size() > 2) ? command_[2] : -1); } goto wait_for_command; @@ -672,7 +688,6 @@ void i8272::posit_event(int event_type) { drives_[found_drive].phase = Drive::NotSeeking; status_[0] = (uint8_t)found_drive; SetSeekEnd(); - main_status_ &= ~(1 << found_drive); result_stack_.push_back(drives_[found_drive].head_position); result_stack_.push_back(status_[0]); diff --git a/Storage/Disk/Encodings/MFM.cpp b/Storage/Disk/Encodings/MFM.cpp index aeb47404a..3808baff2 100644 --- a/Storage/Disk/Encodings/MFM.cpp +++ b/Storage/Disk/Encodings/MFM.cpp @@ -120,8 +120,8 @@ template std::shared_ptr size_t post_index_address_mark_bytes, uint8_t post_index_address_mark_value, size_t pre_address_mark_bytes, size_t post_address_mark_bytes, uint8_t post_address_mark_value, - size_t pre_data_mark_bytes, size_t post_data_bytes, - size_t inter_sector_gap, + size_t pre_data_mark_bytes, + size_t post_data_bytes, uint8_t post_data_value, size_t expected_track_bytes) { Storage::Disk::PCMSegment segment; segment.data.reserve(expected_track_bytes); @@ -169,8 +169,7 @@ template std::shared_ptr } // gap - for(size_t c = 0; c < post_data_bytes; c++) shifter.add_byte(0x00); - for(size_t c = 0; c < inter_sector_gap; c++) shifter.add_byte(0x4e); + for(size_t c = 0; c < post_data_bytes; c++) shifter.add_byte(post_data_value); } while(segment.data.size() < expected_track_bytes) shifter.add_byte(0x00); @@ -199,11 +198,11 @@ const size_t Storage::Encodings::MFM::DefaultSectorGapLength = (size_t)~0; std::shared_ptr Storage::Encodings::MFM::GetFMTrackWithSectors(const std::vector §ors, size_t sector_gap_length, uint8_t sector_gap_filler_byte) { return GetTrackWithSectors( sectors, - 16, 0x00, + 26, 0xff, 6, - (sector_gap_length != DefaultSectorGapLength) ? sector_gap_length : 0, sector_gap_filler_byte, - (sector_gap_length != DefaultSectorGapLength) ? 0 : 17, 14, - 0, + 11, 0xff, + 6, + (sector_gap_length != DefaultSectorGapLength) ? sector_gap_length : 27, 0xff, 6250); // i.e. 250kbps (including clocks) * 60 = 15000kpm, at 300 rpm => 50 kbits/rotation => 6250 bytes/rotation } @@ -212,9 +211,9 @@ std::shared_ptr Storage::Encodings::MFM::GetMFMTrackWithSe sectors, 50, 0x4e, 12, - (sector_gap_length != DefaultSectorGapLength) ? sector_gap_length : 22, sector_gap_filler_byte, - (sector_gap_length != DefaultSectorGapLength) ? 0 : 12, 18, - 32, + 22, 0x4e, + 12, + (sector_gap_length != DefaultSectorGapLength) ? sector_gap_length : 54, 0xff, 12500); // unintelligently: double the single-density bytes/rotation (or: 500kps @ 300 rpm) }