1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-01 14:29:51 +00:00

Introduced data_mode_ to replace is_reading_data_, representing that there are now three possible modes. When writing, any input from the read head won't affect the CRC generator.

This commit is contained in:
Thomas Harte 2016-12-28 19:26:21 -05:00
parent 720b1e5802
commit 1277a67f9a
2 changed files with 15 additions and 8 deletions

View File

@ -35,7 +35,7 @@ WD1770::WD1770(Personality p) :
delay_time_(0),
index_hole_count_target_(-1),
is_awaiting_marker_value_(false),
is_reading_data_(false),
data_mode_(DataMode::Scanning),
delegate_(nullptr),
personality_(p),
head_is_loaded_(false)
@ -163,11 +163,13 @@ void WD1770::run_for_cycles(unsigned int number_of_cycles)
void WD1770::process_input_bit(int value, unsigned int cycles_since_index_hole)
{
if(data_mode_ == DataMode::Writing) return;
shift_register_ = (shift_register_ << 1) | value;
bits_since_token_++;
Token::Type token_type = Token::Byte;
if(!is_reading_data_)
if(data_mode_ == DataMode::Scanning)
{
if(!is_double_density_)
{
@ -312,7 +314,7 @@ void WD1770::process_write_completed()
#define READ_ID() \
if(new_event_type == Event::Token) \
{ \
if(!distance_into_section_ && latest_token_.type == Token::ID) {is_reading_data_ = true; distance_into_section_++; } \
if(!distance_into_section_ && latest_token_.type == Token::ID) {data_mode_ = DataMode::Reading; distance_into_section_++; } \
else if(distance_into_section_ && distance_into_section_ < 7 && latest_token_.type == Token::Byte) \
{ \
header_[distance_into_section_ - 1] = latest_token_.byte_value; \
@ -343,7 +345,7 @@ void WD1770::posit_event(Event new_event_type)
// Wait for a new command, branch to the appropriate handler.
wait_for_command:
printf("Idle...\n");
is_reading_data_ = false;
data_mode_ = DataMode::Scanning;
index_hole_count_ = 0;
update_status([] (Status &status) {
@ -463,7 +465,7 @@ void WD1770::posit_event(Event new_event_type)
}
if(distance_into_section_ == 7)
{
is_reading_data_ = false;
data_mode_ = DataMode::Scanning;
// TODO: CRC check
if(header_[0] == track_)
{
@ -539,7 +541,7 @@ void WD1770::posit_event(Event new_event_type)
if(distance_into_section_ == 7)
{
printf("Considering %d/%d\n", header_[0], header_[2]);
is_reading_data_ = false;
data_mode_ = DataMode::Scanning;
if(header_[0] == track_ && header_[2] == sector_ &&
(has_motor_on_line() || !(command_&0x02) || ((command_&0x08) >> 3) == header_[1]))
{
@ -575,7 +577,7 @@ void WD1770::posit_event(Event new_event_type)
status.record_type = (latest_token_.type == Token::DeletedData);
});
distance_into_section_ = 0;
is_reading_data_ = true;
data_mode_ = DataMode::Reading;
goto type2_read_byte;
}
goto type2_read_data;
@ -641,6 +643,7 @@ void WD1770::posit_event(Event new_event_type)
WAIT_FOR_BYTES(11);
}
data_mode_ = DataMode::Writing;
begin_writing();
for(int c = 0; c < (is_double_density_ ? 12 : 6); c++)
{

View File

@ -95,7 +95,11 @@ class WD1770: public Storage::Disk::Controller {
void update_status(std::function<void(Status &)> updater);
// Tokeniser
bool is_reading_data_;
enum DataMode {
Scanning,
Reading,
Writing
} data_mode_;
bool is_double_density_;
int shift_register_;
struct Token {