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

Made an attempt to add MFM decoding to the 1770; ensured something is returned when reading the Plus 3 status register again.

This commit is contained in:
Thomas Harte 2016-09-25 21:38:52 -04:00
parent 572d5587d9
commit 4db086949a
3 changed files with 42 additions and 2 deletions

View File

@ -17,7 +17,8 @@ WD1770::WD1770() :
interesting_event_mask_(Event::Command),
resume_point_(0),
delay_time_(0),
index_hole_count_target_(-1)
index_hole_count_target_(-1),
is_awaiting_marker_value_(false)
{
set_is_double_density(false);
posit_event(Event::Command);
@ -30,6 +31,8 @@ void WD1770::set_is_double_density(bool is_double_density)
bit_length.length = 1;
bit_length.clock_rate = is_double_density ? 500000 : 250000;
set_expected_bit_length(bit_length);
if(!is_double_density) is_awaiting_marker_value_ = false;
}
void WD1770::set_register(int address, uint8_t value)
@ -104,7 +107,19 @@ void WD1770::process_input_bit(int value, unsigned int cycles_since_index_hole)
}
else
{
// TODO: MFM
switch(shift_register_ & 0xffff)
{
case Storage::Encodings::MFM::MFMIndexAddressMark:
bits_since_token_ = 0;
is_awaiting_marker_value_ = true;
return;
case Storage::Encodings::MFM::MFMAddressMark:
bits_since_token_ = 0;
is_awaiting_marker_value_ = true;
return;
default:
break;
}
}
if(token_type != Token::Byte)
@ -128,6 +143,28 @@ void WD1770::process_input_bit(int value, unsigned int cycles_since_index_hole)
((shift_register_ & 0x1000) >> 6) |
((shift_register_ & 0x4000) >> 7));
bits_since_token_ = 0;
if(is_awaiting_marker_value_ && is_double_density_)
{
is_awaiting_marker_value_ = false;
switch(latest_token_.byte_value)
{
case Storage::Encodings::MFM::MFMIndexAddressByte:
latest_token_.type = Token::Index;
break;
case Storage::Encodings::MFM::MFMIDAddressByte:
latest_token_.type = Token::ID;
break;
case Storage::Encodings::MFM::MFMDataAddressByte:
latest_token_.type = Token::Data;
break;
case Storage::Encodings::MFM::MFMDeletedDataAddressByte:
latest_token_.type = Token::DeletedData;
break;
default: break;
}
}
posit_event(Event::Token);
return;
}

View File

@ -49,6 +49,7 @@ class WD1770: public Storage::Disk::Controller {
int index_hole_count_target_;
int bits_since_token_;
int distance_into_section_;
bool is_awaiting_marker_value_;
int step_direction_;
void set_interrupt_request(bool interrupt_request) {}

View File

@ -322,6 +322,8 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
{
_plus3->set_control_register(*value);
}
else
*value = 1;
}
break;