mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-15 14:27:29 +00:00
Fixed Oric .DSK handling, per my latest understanding. Which creates a desire to write shorts directly to the disk surface, so exposed that in the encoder.
This commit is contained in:
@@ -48,10 +48,10 @@ class Encoder {
|
|||||||
virtual void add_ID_address_mark() = 0;
|
virtual void add_ID_address_mark() = 0;
|
||||||
virtual void add_data_address_mark() = 0;
|
virtual void add_data_address_mark() = 0;
|
||||||
virtual void add_deleted_data_address_mark() = 0;
|
virtual void add_deleted_data_address_mark() = 0;
|
||||||
|
virtual void output_short(uint16_t value);
|
||||||
void add_crc();
|
void add_crc();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void output_short(uint16_t value);
|
|
||||||
NumberTheory::CRC16 crc_generator_;
|
NumberTheory::CRC16 crc_generator_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -57,6 +57,7 @@ std::shared_ptr<Track> OricMFMDSK::get_uncached_track_at_position(unsigned int h
|
|||||||
size_t track_offset = 0;
|
size_t track_offset = 0;
|
||||||
uint8_t last_header[6];
|
uint8_t last_header[6];
|
||||||
std::unique_ptr<Encodings::MFM::Encoder> encoder = Encodings::MFM::GetMFMEncoder(segment.data);
|
std::unique_ptr<Encodings::MFM::Encoder> encoder = Encodings::MFM::GetMFMEncoder(segment.data);
|
||||||
|
bool did_sync = false;
|
||||||
while(track_offset < 6250)
|
while(track_offset < 6250)
|
||||||
{
|
{
|
||||||
uint8_t next_byte = (uint8_t)fgetc(file_);
|
uint8_t next_byte = (uint8_t)fgetc(file_);
|
||||||
@@ -65,32 +66,46 @@ std::shared_ptr<Track> OricMFMDSK::get_uncached_track_at_position(unsigned int h
|
|||||||
switch(next_byte)
|
switch(next_byte)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
encoder->add_byte(next_byte);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xfe: // an ID synchronisation
|
|
||||||
{
|
{
|
||||||
encoder->add_ID_address_mark();
|
encoder->add_byte(next_byte);
|
||||||
|
if(did_sync)
|
||||||
for(int byte = 0; byte < 6; byte++)
|
|
||||||
{
|
{
|
||||||
last_header[byte] = (uint8_t)fgetc(file_);
|
switch(next_byte)
|
||||||
encoder->add_byte(last_header[byte]);
|
{
|
||||||
track_offset++;
|
default: break;
|
||||||
if(track_offset == 6250) break;
|
|
||||||
|
case 0xfe:
|
||||||
|
for(int byte = 0; byte < 6; byte++)
|
||||||
|
{
|
||||||
|
last_header[byte] = (uint8_t)fgetc(file_);
|
||||||
|
encoder->add_byte(last_header[byte]);
|
||||||
|
track_offset++;
|
||||||
|
if(track_offset == 6250) break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xfb:
|
||||||
|
for(int byte = 0; byte < (128 << last_header[3]) + 2; byte++)
|
||||||
|
{
|
||||||
|
encoder->add_byte((uint8_t)fgetc(file_));
|
||||||
|
track_offset++;
|
||||||
|
if(track_offset == 6250) break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
did_sync = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xfb: // a data synchronisation
|
case 0xa1: // a synchronisation mark that implies a sector or header coming
|
||||||
encoder->add_data_address_mark();
|
encoder->output_short(Storage::Encodings::MFM::MFMSync);
|
||||||
|
did_sync = true;
|
||||||
|
break;
|
||||||
|
|
||||||
for(int byte = 0; byte < (128 << last_header[3]) + 2; byte++)
|
case 0xc2: // an 'ordinary' synchronisation mark
|
||||||
{
|
encoder->output_short(Storage::Encodings::MFM::MFMIndexSync);
|
||||||
encoder->add_byte((uint8_t)fgetc(file_));
|
|
||||||
track_offset++;
|
|
||||||
if(track_offset == 6250) break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user