mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-21 05:29:13 +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:
parent
572d5587d9
commit
4db086949a
@ -17,7 +17,8 @@ WD1770::WD1770() :
|
|||||||
interesting_event_mask_(Event::Command),
|
interesting_event_mask_(Event::Command),
|
||||||
resume_point_(0),
|
resume_point_(0),
|
||||||
delay_time_(0),
|
delay_time_(0),
|
||||||
index_hole_count_target_(-1)
|
index_hole_count_target_(-1),
|
||||||
|
is_awaiting_marker_value_(false)
|
||||||
{
|
{
|
||||||
set_is_double_density(false);
|
set_is_double_density(false);
|
||||||
posit_event(Event::Command);
|
posit_event(Event::Command);
|
||||||
@ -30,6 +31,8 @@ void WD1770::set_is_double_density(bool is_double_density)
|
|||||||
bit_length.length = 1;
|
bit_length.length = 1;
|
||||||
bit_length.clock_rate = is_double_density ? 500000 : 250000;
|
bit_length.clock_rate = is_double_density ? 500000 : 250000;
|
||||||
set_expected_bit_length(bit_length);
|
set_expected_bit_length(bit_length);
|
||||||
|
|
||||||
|
if(!is_double_density) is_awaiting_marker_value_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WD1770::set_register(int address, uint8_t value)
|
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
|
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)
|
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_ & 0x1000) >> 6) |
|
||||||
((shift_register_ & 0x4000) >> 7));
|
((shift_register_ & 0x4000) >> 7));
|
||||||
bits_since_token_ = 0;
|
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);
|
posit_event(Event::Token);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ class WD1770: public Storage::Disk::Controller {
|
|||||||
int index_hole_count_target_;
|
int index_hole_count_target_;
|
||||||
int bits_since_token_;
|
int bits_since_token_;
|
||||||
int distance_into_section_;
|
int distance_into_section_;
|
||||||
|
bool is_awaiting_marker_value_;
|
||||||
|
|
||||||
int step_direction_;
|
int step_direction_;
|
||||||
void set_interrupt_request(bool interrupt_request) {}
|
void set_interrupt_request(bool interrupt_request) {}
|
||||||
|
@ -322,6 +322,8 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
{
|
{
|
||||||
_plus3->set_control_register(*value);
|
_plus3->set_control_register(*value);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
*value = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user