mirror of
https://github.com/TomHarte/CLK.git
synced 2024-08-16 16:28:59 +00:00
Factored out the standard [M]FM gap and mark groups, to increase 8272 readability and because it's pretty-much certain I'll need them again if ever I try to tackle e.g. the 8271.
This commit is contained in:
parent
4df9307d25
commit
a366298022
@ -427,31 +427,11 @@ void i8272::posit_event(int event_type) {
|
|||||||
write_data_found_header:
|
write_data_found_header:
|
||||||
begin_writing();
|
begin_writing();
|
||||||
|
|
||||||
if(get_is_double_density()) {
|
write_id_data_joiner((command_[0] & 0x1f) == 0x09);
|
||||||
write_n_bytes(50, 0x4e);
|
|
||||||
write_n_bytes(12, 0x00);
|
|
||||||
} else {
|
|
||||||
write_n_bytes(11, 0xff);
|
|
||||||
write_n_bytes(6, 0x00);
|
|
||||||
}
|
|
||||||
|
|
||||||
WAIT_FOR_EVENT(Event::DataWritten);
|
|
||||||
|
|
||||||
{
|
|
||||||
bool is_deleted = (command_[0] & 0x1f) == 0x09;
|
|
||||||
if(get_is_double_density()) {
|
|
||||||
get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue);
|
|
||||||
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync);
|
|
||||||
write_byte(is_deleted ? Storage::Encodings::MFM::DeletedDataAddressByte : Storage::Encodings::MFM::DataAddressByte);
|
|
||||||
} else {
|
|
||||||
get_crc_generator().reset();
|
|
||||||
get_crc_generator().add(is_deleted ? Storage::Encodings::MFM::DeletedDataAddressByte : Storage::Encodings::MFM::DataAddressByte);
|
|
||||||
write_raw_short(is_deleted ? Storage::Encodings::MFM::FMDeletedDataAddressMark : Storage::Encodings::MFM::FMDataAddressMark);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDataDirectionFromProcessor();
|
SetDataDirectionFromProcessor();
|
||||||
SetDataRequest();
|
SetDataRequest();
|
||||||
|
WAIT_FOR_EVENT(Event::DataWritten);
|
||||||
expects_input_ = true;
|
expects_input_ = true;
|
||||||
distance_into_section_ = 0;
|
distance_into_section_ = 0;
|
||||||
|
|
||||||
@ -563,32 +543,12 @@ void i8272::posit_event(int event_type) {
|
|||||||
begin_writing();
|
begin_writing();
|
||||||
|
|
||||||
// Write start-of-track.
|
// Write start-of-track.
|
||||||
if(get_is_double_density()) {
|
write_start_of_track();
|
||||||
write_n_bytes(80, 0x4e);
|
|
||||||
write_n_bytes(12, 0x00);
|
|
||||||
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMIndexSync);
|
|
||||||
write_byte(Storage::Encodings::MFM::IndexAddressByte);
|
|
||||||
write_n_bytes(50, 0x4e);
|
|
||||||
} else {
|
|
||||||
write_n_bytes(40, 0xff);
|
|
||||||
write_n_bytes(6, 0x00);
|
|
||||||
write_raw_short(Storage::Encodings::MFM::FMIndexAddressMark);
|
|
||||||
write_n_bytes(26, 0xff);
|
|
||||||
}
|
|
||||||
WAIT_FOR_EVENT(Event::DataWritten);
|
WAIT_FOR_EVENT(Event::DataWritten);
|
||||||
sector_ = 0;
|
sector_ = 0;
|
||||||
|
|
||||||
format_track_write_sector:
|
format_track_write_sector:
|
||||||
if(get_is_double_density()) {
|
write_id_joiner();
|
||||||
write_n_bytes(12, 0x00);
|
|
||||||
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync);
|
|
||||||
get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue);
|
|
||||||
write_byte(Storage::Encodings::MFM::IDAddressByte);
|
|
||||||
} else {
|
|
||||||
write_n_bytes(6, 0x00);
|
|
||||||
get_crc_generator().reset();
|
|
||||||
write_raw_short(Storage::Encodings::MFM::FMIDAddressMark);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the sector header, obtaining its contents
|
// Write the sector header, obtaining its contents
|
||||||
// from the processor.
|
// from the processor.
|
||||||
@ -610,18 +570,7 @@ void i8272::posit_event(int event_type) {
|
|||||||
write_crc();
|
write_crc();
|
||||||
|
|
||||||
// Write the sector body.
|
// Write the sector body.
|
||||||
if(get_is_double_density()) {
|
write_id_data_joiner(false);
|
||||||
write_n_bytes(22, 0x4e);
|
|
||||||
write_n_bytes(12, 0x00);
|
|
||||||
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync);
|
|
||||||
get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue);
|
|
||||||
write_byte(Storage::Encodings::MFM::DataAddressByte);
|
|
||||||
} else {
|
|
||||||
write_n_bytes(11, 0xff);
|
|
||||||
write_n_bytes(6, 0x00);
|
|
||||||
get_crc_generator().reset();
|
|
||||||
write_raw_short(Storage::Encodings::MFM::FMDataAddressMark);
|
|
||||||
}
|
|
||||||
write_n_bytes(128 << command_[2], command_[5]);
|
write_n_bytes(128 << command_[2], command_[5]);
|
||||||
write_crc();
|
write_crc();
|
||||||
|
|
||||||
|
@ -185,3 +185,55 @@ void MFMController::write_crc() {
|
|||||||
void MFMController::write_n_bytes(int quantity, uint8_t value) {
|
void MFMController::write_n_bytes(int quantity, uint8_t value) {
|
||||||
while(quantity--) write_byte(value);
|
while(quantity--) write_byte(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MFMController::write_id_joiner() {
|
||||||
|
if(get_is_double_density()) {
|
||||||
|
write_n_bytes(12, 0x00);
|
||||||
|
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync);
|
||||||
|
get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue);
|
||||||
|
write_byte(Storage::Encodings::MFM::IDAddressByte);
|
||||||
|
} else {
|
||||||
|
write_n_bytes(6, 0x00);
|
||||||
|
get_crc_generator().reset();
|
||||||
|
write_raw_short(Storage::Encodings::MFM::FMIDAddressMark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MFMController::write_id_data_joiner(bool is_deleted) {
|
||||||
|
if(get_is_double_density()) {
|
||||||
|
write_n_bytes(22, 0x4e);
|
||||||
|
write_n_bytes(12, 0x00);
|
||||||
|
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMSync);
|
||||||
|
get_crc_generator().set_value(Storage::Encodings::MFM::MFMPostSyncCRCValue);
|
||||||
|
write_byte(is_deleted ? Storage::Encodings::MFM::DeletedDataAddressByte : Storage::Encodings::MFM::DataAddressByte);
|
||||||
|
} else {
|
||||||
|
write_n_bytes(11, 0xff);
|
||||||
|
write_n_bytes(6, 0x00);
|
||||||
|
get_crc_generator().reset();
|
||||||
|
get_crc_generator().add(is_deleted ? Storage::Encodings::MFM::DeletedDataAddressByte : Storage::Encodings::MFM::DataAddressByte);
|
||||||
|
write_raw_short(is_deleted ? Storage::Encodings::MFM::FMDeletedDataAddressMark : Storage::Encodings::MFM::FMDataAddressMark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MFMController::write_post_data_gap() {
|
||||||
|
if(get_is_double_density()) {
|
||||||
|
write_n_bytes(54, 0x4e);
|
||||||
|
} else {
|
||||||
|
write_n_bytes(27, 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MFMController::write_start_of_track() {
|
||||||
|
if(get_is_double_density()) {
|
||||||
|
write_n_bytes(80, 0x4e);
|
||||||
|
write_n_bytes(12, 0x00);
|
||||||
|
for(int c = 0; c < 3; c++) write_raw_short(Storage::Encodings::MFM::MFMIndexSync);
|
||||||
|
write_byte(Storage::Encodings::MFM::IndexAddressByte);
|
||||||
|
write_n_bytes(50, 0x4e);
|
||||||
|
} else {
|
||||||
|
write_n_bytes(40, 0xff);
|
||||||
|
write_n_bytes(6, 0x00);
|
||||||
|
write_raw_short(Storage::Encodings::MFM::FMIndexAddressMark);
|
||||||
|
write_n_bytes(26, 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -118,6 +118,31 @@ class MFMController: public Controller {
|
|||||||
*/
|
*/
|
||||||
void write_n_bytes(int quantity, uint8_t value);
|
void write_n_bytes(int quantity, uint8_t value);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Writes everything that should, per the spec, appear prior to the address contained
|
||||||
|
in an ID mark — proper gaps and the ID mark — and appropriate seeds the CRC generator.
|
||||||
|
*/
|
||||||
|
void write_id_joiner();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Writes everything that should, per the spec, appear after the ID's CRC, up to and
|
||||||
|
including the mark that indicates the beginning of data, appropriately seeding
|
||||||
|
the CRC generator.
|
||||||
|
*/
|
||||||
|
void write_id_data_joiner(bool is_deleted);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Writes the gap expected after a sector's data CRC and before the beginning of the
|
||||||
|
next ID joiner.
|
||||||
|
*/
|
||||||
|
void write_post_data_gap();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Writes everything that should, per the spec, following the index hole and prior
|
||||||
|
to any sectors.
|
||||||
|
*/
|
||||||
|
void write_start_of_track();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Storage::Disk::Controller
|
// Storage::Disk::Controller
|
||||||
virtual void process_input_bit(int value, unsigned int cycles_since_index_hole);
|
virtual void process_input_bit(int value, unsigned int cycles_since_index_hole);
|
||||||
|
Loading…
Reference in New Issue
Block a user