1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-26 09:29:45 +00:00

Collapsed implementations of recalibrate and seek, and decided to intend to go for an upward count on steps taken rather than a downward one. But seek continues presently to fail.

This commit is contained in:
Thomas Harte 2017-08-06 21:52:52 -04:00
parent 90c74043f5
commit d63893a437
2 changed files with 12 additions and 18 deletions

View File

@ -58,7 +58,6 @@ void i8272::run_for(Cycles cycles) {
(drives_[c].drive->get_is_track_zero() && drives_[c].target_head_position == -1)) {
drives_[c].phase = Drive::CompletedSeeking;
if(drives_[c].target_head_position == -1) drives_[c].head_position = 0;
main_status_ &= ~(1 << c);
} else {
int direction = (drives_[c].target_head_position < drives_[c].head_position) ? -1 : 1;
drives_[c].drive->step(direction);
@ -83,7 +82,7 @@ void i8272::set_register(int address, uint8_t value) {
uint8_t i8272::get_register(int address) {
if(address) {
printf("8272 get data\n");
// printf("8272 get data\n");
if(result_stack_.empty()) return 0xff;
uint8_t result = result_stack_.back();
@ -231,8 +230,9 @@ void i8272::posit_event(int event_type) {
FIND_HEADER();
if(!index_hole_limit_) goto read_data_not_found;
READ_HEADER();
printf("Comparing with %02x\n", header_[2]);
if(header_[2] != sector_) goto find_next_sector;
// printf("Comparing with %02x\n", header_[2]);
if(header_[0] != cylinder_ || header_[1] != head_ || header_[2] != sector_ || header_[3] != size_) goto find_next_sector;
FIND_DATA();
distance_into_section_ = 0;
@ -323,12 +323,14 @@ void i8272::posit_event(int event_type) {
goto wait_for_command;
recalibrate:
printf("Recalibrate\n");
seek:
printf((command_.size() > 2) ? "Seek\n" : "Recalibrate\n");
status_[0] = status_[1] = status_[2] = 0;
drives_[command_[1]&3].phase = Drive::Seeking;
drives_[command_[1]&3].permitted_steps = 77;
drives_[command_[1]&3].target_head_position = -1;
drives_[command_[1]&3].steps_taken = 0;
drives_[command_[1]&3].target_head_position = (command_.size() > 2) ? command_[2] : -1;
drives_[command_[1]&3].step_rate_counter = 0;
main_status_ |= (1 << command_[1]&3);
main_status_ |= 1 << (command_[1]&3);
goto wait_for_command;
sense_interrupt_status:
@ -346,6 +348,7 @@ void i8272::posit_event(int event_type) {
if(found_drive != -1) {
drives_[found_drive].phase = Drive::NotSeeking;
status_[0] = (uint8_t)found_drive | 0x20;
main_status_ &= ~(1 << found_drive);
result_stack_.push_back(drives_[found_drive].head_position);
result_stack_.push_back(status_[0]);
@ -368,15 +371,6 @@ void i8272::posit_event(int event_type) {
result_stack_.push_back(status_[3]);
goto post_result;
seek:
printf("Seek\n");
drives_[command_[1]&3].phase = Drive::Seeking;
drives_[command_[1]&3].permitted_steps = -1;
drives_[command_[1]&3].target_head_position = command_[2];
drives_[command_[1]&3].step_rate_counter = 0;
main_status_ |= (1 << command_[1]&3);
goto wait_for_command;
invalid:
// A no-op, causing the FDC to go back into standby mode.
goto wait_for_command;

View File

@ -60,7 +60,7 @@ class i8272: public Storage::Disk::MFMController {
CompletedSeeking
} phase;
int step_rate_counter;
int permitted_steps;
int steps_taken;
int target_head_position; // either an actual number, or -1 to indicate to step until track zero
std::shared_ptr<Storage::Disk::Drive> drive;