1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-19 23:32:28 +00:00

Ensures that all result phases are exactly the intended length by replacing accumulation with assignment.

Also attempts a different version of control mark behaviour. Experiments.
This commit is contained in:
Thomas Harte 2017-09-15 22:59:26 -04:00
parent da082673d7
commit 98751e6ac8

View File

@ -44,6 +44,7 @@ using namespace Intel::i8272;
#define SetMissingAddressMark() (status_[1] |= 0x01) #define SetMissingAddressMark() (status_[1] |= 0x01)
#define SetControlMark() (status_[2] |= 0x40) #define SetControlMark() (status_[2] |= 0x40)
#define ClearControlMark() (status_[2] &= ~0x40)
#define ControlMark() (status_[2] & 0x40) #define ControlMark() (status_[2] & 0x40)
#define SetDataFieldDataError() (status_[2] |= 0x20) #define SetDataFieldDataError() (status_[2] |= 0x20)
@ -437,6 +438,7 @@ void i8272::posit_event(int event_type) {
// flag doesn't match the sort the command was looking for. // flag doesn't match the sort the command was looking for.
read_data_found_header: read_data_found_header:
FIND_DATA(); FIND_DATA();
ClearControlMark();
if(event_type == (int)Event::Token) { if(event_type == (int)Event::Token) {
if(get_latest_token().type != Token::Data && get_latest_token().type != Token::DeletedData) { if(get_latest_token().type != Token::Data && get_latest_token().type != Token::DeletedData) {
// Something other than a data mark came next — impliedly an ID or index mark. // Something other than a data mark came next — impliedly an ID or index mark.
@ -779,10 +781,9 @@ void i8272::posit_event(int event_type) {
main_status_ &= ~(1 << found_drive); main_status_ &= ~(1 << found_drive);
SetSeekEnd(); SetSeekEnd();
result_stack_.push_back(drives_[found_drive].head_position); result_stack_ = { drives_[found_drive].head_position, status_[0]};
result_stack_.push_back(status_[0]);
} else { } else {
result_stack_.push_back(0x80); result_stack_ = { 0x80 };
} }
} }
goto post_result; goto post_result;
@ -805,20 +806,22 @@ void i8272::posit_event(int event_type) {
{ {
int drive = command_[1] & 3; int drive = command_[1] & 3;
select_drive(drive); select_drive(drive);
result_stack_.push_back( result_stack_= {
(command_[1] & 7) | // drive and head number static_cast<uint8_t>(
0x08 | // single sided (command_[1] & 7) | // drive and head number
(get_drive().get_is_track_zero() ? 0x10 : 0x00) | 0x08 | // single sided
(get_drive().get_is_ready() ? 0x20 : 0x00) | (get_drive().get_is_track_zero() ? 0x10 : 0x00) |
(get_drive().get_is_read_only() ? 0x40 : 0x00) (get_drive().get_is_ready() ? 0x20 : 0x00) |
); (get_drive().get_is_read_only() ? 0x40 : 0x00)
)
};
} }
goto post_result; goto post_result;
// Performs any invalid command. // Performs any invalid command.
invalid: invalid:
// A no-op, but posts ST0 (but which ST0?) // A no-op, but posts ST0 (but which ST0?)
result_stack_.push_back(0x80); result_stack_ = {0x80};
goto post_result; goto post_result;
// Sets abnormal termination of the current command and proceeds to an ST0, ST1, ST2, C, H, R, N result phase. // Sets abnormal termination of the current command and proceeds to an ST0, ST1, ST2, C, H, R, N result phase.
@ -831,14 +834,7 @@ void i8272::posit_event(int event_type) {
post_st012chrn: post_st012chrn:
SCHEDULE_HEAD_UNLOAD(); SCHEDULE_HEAD_UNLOAD();
result_stack_.push_back(size_); result_stack_ = {size_, sector_, head_, cylinder_, status_[2], status_[1], status_[0]};
result_stack_.push_back(sector_);
result_stack_.push_back(head_);
result_stack_.push_back(cylinder_);
result_stack_.push_back(status_[2]);
result_stack_.push_back(status_[1]);
result_stack_.push_back(status_[0]);
goto post_result; goto post_result;