mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-25 02:29:08 +00:00
Fixed reporting of data request line, initial status values.
This commit is contained in:
parent
2222cb65d6
commit
b31fd11470
@ -11,6 +11,19 @@
|
|||||||
|
|
||||||
using namespace WD;
|
using namespace WD;
|
||||||
|
|
||||||
|
WD1770::Status::Status() :
|
||||||
|
type(Status::One),
|
||||||
|
write_protect(false),
|
||||||
|
record_type(false),
|
||||||
|
spin_up(false),
|
||||||
|
record_not_found(false),
|
||||||
|
crc_error(false),
|
||||||
|
seek_error(false),
|
||||||
|
lost_data(false),
|
||||||
|
// data_request(false),
|
||||||
|
busy(false)
|
||||||
|
{}
|
||||||
|
|
||||||
WD1770::WD1770(Personality p) :
|
WD1770::WD1770(Personality p) :
|
||||||
Storage::Disk::Controller(8000000, 16, 300),
|
Storage::Disk::Controller(8000000, 16, 300),
|
||||||
interesting_event_mask_(Event::Command),
|
interesting_event_mask_(Event::Command),
|
||||||
@ -87,7 +100,7 @@ uint8_t WD1770::get_register(int address)
|
|||||||
status |=
|
status |=
|
||||||
(status_.record_type ? Flag::RecordType : 0) |
|
(status_.record_type ? Flag::RecordType : 0) |
|
||||||
(status_.lost_data ? Flag::LostData : 0) |
|
(status_.lost_data ? Flag::LostData : 0) |
|
||||||
(status_.data_request ? Flag::DataRequest : 0) |
|
(data_request_line_ ? Flag::DataRequest : 0) |
|
||||||
(status_.record_not_found ? Flag::RecordNotFound : 0);
|
(status_.record_not_found ? Flag::RecordNotFound : 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -297,10 +310,16 @@ void WD1770::posit_event(Event new_event_type)
|
|||||||
is_reading_data_ = false;
|
is_reading_data_ = false;
|
||||||
status_.busy = false;
|
status_.busy = false;
|
||||||
index_hole_count_ = 0;
|
index_hole_count_ = 0;
|
||||||
|
|
||||||
|
if(is_73())
|
||||||
|
{
|
||||||
|
// TODO: ???
|
||||||
|
set_motor_on(false);
|
||||||
|
}
|
||||||
|
|
||||||
set_interrupt_request(true);
|
set_interrupt_request(true);
|
||||||
WAIT_FOR_EVENT(Event::Command);
|
WAIT_FOR_EVENT(Event::Command);
|
||||||
set_interrupt_request(false);
|
set_interrupt_request(false);
|
||||||
// WAIT_FOR_TIME(1); // TODO: what should the time cost here really be?
|
|
||||||
printf("Starting %02x\n", command_);
|
printf("Starting %02x\n", command_);
|
||||||
|
|
||||||
if(is_73())
|
if(is_73())
|
||||||
@ -320,6 +339,7 @@ void WD1770::posit_event(Event new_event_type)
|
|||||||
*/
|
*/
|
||||||
begin_type_1:
|
begin_type_1:
|
||||||
// Set initial flags, skip spin-up if possible.
|
// Set initial flags, skip spin-up if possible.
|
||||||
|
status_.type = Status::One;
|
||||||
status_.seek_error = false;
|
status_.seek_error = false;
|
||||||
status_.crc_error = false;
|
status_.crc_error = false;
|
||||||
set_data_request(false);
|
set_data_request(false);
|
||||||
@ -411,6 +431,7 @@ void WD1770::posit_event(Event new_event_type)
|
|||||||
Type 2 entry point.
|
Type 2 entry point.
|
||||||
*/
|
*/
|
||||||
begin_type_2:
|
begin_type_2:
|
||||||
|
status_.type = Status::Two;
|
||||||
status_.lost_data = status_.record_not_found = status_.write_protect = status_.record_type = false;
|
status_.lost_data = status_.record_not_found = status_.write_protect = status_.record_type = false;
|
||||||
set_data_request(false);
|
set_data_request(false);
|
||||||
distance_into_section_ = 0;
|
distance_into_section_ = 0;
|
||||||
@ -508,6 +529,7 @@ void WD1770::posit_event(Event new_event_type)
|
|||||||
printf("!!!TODO: data portion of sector!!!\n");
|
printf("!!!TODO: data portion of sector!!!\n");
|
||||||
|
|
||||||
begin_type_3:
|
begin_type_3:
|
||||||
|
status_.type = Status::Three;
|
||||||
printf("!!!TODO: type 3 commands!!!\n");
|
printf("!!!TODO: type 3 commands!!!\n");
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,6 +58,7 @@ class WD1770: public Storage::Disk::Controller {
|
|||||||
inline bool is_73() { return (personality_ == P1793 ) || (personality_ == P1773); }
|
inline bool is_73() { return (personality_ == P1793 ) || (personality_ == P1773); }
|
||||||
|
|
||||||
struct Status {
|
struct Status {
|
||||||
|
Status();
|
||||||
bool write_protect;
|
bool write_protect;
|
||||||
bool record_type;
|
bool record_type;
|
||||||
bool spin_up;
|
bool spin_up;
|
||||||
@ -65,7 +66,7 @@ class WD1770: public Storage::Disk::Controller {
|
|||||||
bool crc_error;
|
bool crc_error;
|
||||||
bool seek_error;
|
bool seek_error;
|
||||||
bool lost_data;
|
bool lost_data;
|
||||||
bool data_request;
|
// bool data_request; // TODO: pick between this and data_request_line_
|
||||||
bool busy;
|
bool busy;
|
||||||
enum {
|
enum {
|
||||||
One, Two, Three
|
One, Two, Three
|
||||||
|
Loading…
x
Reference in New Issue
Block a user