Merge from master.

This commit is contained in:
David Given
2021-08-03 22:46:08 +02:00
38 changed files with 624 additions and 114 deletions

View File

@@ -140,7 +140,7 @@ public:
br.read_8(); /* skip ID byte */
_sector->logicalTrack = br.read_8();
_sector->logicalSide = br.read_8();
_sector->logicalSector = br.read_8() - _config.sector_id_base();
_sector->logicalSector = br.read_8();
_currentSectorSize = 1 << (br.read_8() + 7);
uint16_t wantCrc = br.read_be16();
uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, _currentHeaderLength + 5));
@@ -171,7 +171,10 @@ public:
std::set<unsigned> requiredSectors(unsigned cylinder, unsigned head) const override
{
return iterate(_config.required_sectors());
std::set<unsigned> s;
for (int sectorId : _config.sectors().sector())
s.insert(sectorId);
return s;
}
private:

View File

@@ -57,13 +57,6 @@
* mfm: 01 01 01 01 01 00 01 01 = 0x5545
*/
static int charToInt(char c)
{
if (isdigit(c))
return c - '0';
return 10 + tolower(c) - 'a';
}
static uint8_t decodeUint16(uint16_t raw)
{
Bytes b;
@@ -116,9 +109,8 @@ public:
getTrackFormat(trackdata, physicalTrack, physicalSide);
int logicalSide = physicalSide ^ trackdata.swap_sides();
for (char sectorChar : trackdata.sector_skew())
for (int sectorId : trackdata.sectors().sector())
{
int sectorId = charToInt(sectorChar);
const auto& sector = image.get(physicalTrack, logicalSide, sectorId);
if (sector)
sectors.push_back(sector);
@@ -185,19 +177,15 @@ public:
int logicalSide = physicalSide ^ trackdata.swap_sides();
bool first = true;
for (char sectorChar : trackdata.sector_skew())
for (int sectorId : trackdata.sectors().sector())
{
int sectorId = charToInt(sectorChar);
if (!first)
writeFillerBytes(trackdata.gap3(), gapFill);
first = false;
const auto& sectorData = image.get(physicalTrack, logicalSide, sectorId);
if (!sectorData)
{
/* If there are any missing sectors, this is an empty track. */
return std::unique_ptr<Fluxmap>();
}
continue;
/* Writing the sector and data records are fantastically annoying.
* The CRC is calculated from the *very start* of the record, and
@@ -220,7 +208,7 @@ public:
bw.write_8(idamUnencoded);
bw.write_8(sectorData->logicalTrack);
bw.write_8(sectorData->logicalSide);
bw.write_8(sectorData->logicalSector + trackdata.start_sector_id());
bw.write_8(sectorData->logicalSector);
bw.write_8(sectorSize);
uint16_t crc = crc16(CCITT_POLY, header);
bw.write_be16(crc);

View File

@@ -2,22 +2,30 @@ syntax = "proto2";
import "lib/common.proto";
// Next: 6
message IbmDecoderProto {
optional int32 sector_id_base = 1 [default = 1, (help) = "ID of first sector"];
message SectorsProto {
repeated int32 sector = 1 [(help) = "require these sectors to exist for a good read"];
}
optional bool ignore_side_byte = 2 [default = false, (help) = "ignore side byte in sector header"];
optional RangeProto required_sectors = 3 [(help) = "require these sectors to exist for a good read"];
optional bool swap_sides = 4 [default = false, (help) = "put logical side 1 on physical side 0"];
optional SectorsProto sectors = 5 [(help) = "require these sectors to exist for a good read"];
}
message IbmEncoderProto {
// Next: 18
message TrackdataProto {
message SectorsProto {
repeated int32 sector = 1 [(help) = "write these sectors (in order) on each track"];
}
optional int32 cylinder = 15 [(help) = "if set, the format applies only to this track"];
optional int32 head = 16 [(help) = "if set, the format applies only to this head"];
optional double track_length_ms = 1 [(help) = "length of track"];
optional int32 sector_size = 2 [default=512, (help) = "number of bytes per sector"];
optional bool emit_iam = 3 [default=true, (help) = "whether to emit an IAM record"];
optional int32 start_sector_id = 4 [default=1, (help) = "ID of first sector"];
optional double clock_rate_khz = 5 [(help) = "data clock rate"];
optional bool use_fm = 6 [default=false, (help) = "whether to use FM encoding rather than MFM"];
optional int32 idam_byte = 7 [default=0x5554, (help) = "16-bit raw bit pattern of IDAM byte"];
@@ -26,8 +34,8 @@ message IbmEncoderProto {
optional int32 gap1 = 10 [default=50, (help) = "size of gap 2 (the post-ID gap)"];
optional int32 gap2 = 11 [default=22, (help) = "size of gap 3 (the pre-data gap)"];
optional int32 gap3 = 12 [default=80, (help) = "size of gap 4 (the post-data or format gap)"];
optional string sector_skew = 13 [(help) = "order to emit sectors"];
optional bool swap_sides = 14 [default=false, (help) = "swap side bytes when writing"];
optional SectorsProto sectors = 17 [(help) = "write these sectors (in order) on each track"];
}
repeated TrackdataProto trackdata = 1;

View File

@@ -11,6 +11,7 @@
#include <vector>
#include <set>
#include <cassert>
#include <climits>
#if defined(_WIN32) || defined(__WIN32__)
#include <direct.h>

View File

@@ -36,6 +36,7 @@ const std::shared_ptr<Sector>& Image::put(unsigned track, unsigned side, unsigne
void Image::calculateSize()
{
_geometry = {};
unsigned maxSector = 0;
for (const auto& i : _sectors)
{
const auto& sector = i.second;
@@ -43,9 +44,11 @@ void Image::calculateSize()
{
_geometry.numTracks = std::max(_geometry.numTracks, (unsigned)sector->logicalTrack+1);
_geometry.numSides = std::max(_geometry.numSides, (unsigned)sector->logicalSide+1);
_geometry.numSectors = std::max(_geometry.numSectors, (unsigned)sector->logicalSector+1);
_geometry.firstSector = std::min(_geometry.firstSector, (unsigned)sector->logicalSector);
maxSector = std::max(maxSector, (unsigned)sector->logicalSector);
_geometry.sectorSize = std::max(_geometry.sectorSize, (unsigned)sector->data.size());
}
}
_geometry.numSectors = maxSector - _geometry.firstSector + 1;
}

View File

@@ -5,6 +5,7 @@ struct Geometry
{
unsigned numTracks = 0;
unsigned numSides = 0;
unsigned firstSector = UINT_MAX;
unsigned numSectors = 0;
unsigned sectorSize = 0;
bool irregular = false;

View File

@@ -3,14 +3,26 @@ syntax = "proto2";
import "lib/common.proto";
message ImgInputOutputProto {
// NEXT: 6
message SectorsProto {
repeated int32 sector = 1 [(help) = "sector ID"];
}
message SectorRangeProto {
optional int32 start_sector = 1 [default=0, (help) = "first sector ID"];
optional int32 sector_count = 2 [default=1, (help) = "total number of sectors"];
}
message TrackdataProto {
optional int32 track = 1 [(help) = "if present, this format only applies to this track"];
optional int32 up_to_track = 5 [(help) = "if present, forms a range with track"];
optional int32 side = 2 [(help) = "if present, this format only applies to this side"];
optional int32 sector_size = 3 [default=512, (help) = "number of bytes per sector"];
optional int32 sectors = 4 [(help) = "number of sectors in this track"];
oneof sectors_oneof {
SectorsProto sectors = 4 [(help) = "use a list of sector IDs"];
SectorRangeProto sector_range = 6 [(help) = "use a range of contiguous IDs"];
}
}
repeated TrackdataProto trackdata = 4 [(help) = "per-track format information (repeatable)"];

View File

@@ -39,7 +39,7 @@ public:
ImgInputOutputProto::TrackdataProto trackdata;
getTrackFormat(_config.img(), trackdata, track, side);
for (int sectorId = 0; sectorId < trackdata.sectors(); sectorId++)
for (int sectorId : getSectors(trackdata))
{
Bytes data(trackdata.sector_size());
inputFile.read((char*) data.begin(), data.size());
@@ -64,6 +64,32 @@ public:
inputFile.tellg() / 1024);
return image;
}
std::vector<unsigned> getSectors(const ImgInputOutputProto::TrackdataProto& trackdata)
{
std::vector<unsigned> sectors;
switch (trackdata.sectors_oneof_case())
{
case ImgInputOutputProto::TrackdataProto::SectorsOneofCase::kSectors:
{
for (int sectorId : trackdata.sectors().sector())
sectors.push_back(sectorId);
break;
}
case ImgInputOutputProto::TrackdataProto::SectorsOneofCase::kSectorRange:
{
int sectorId = trackdata.sector_range().start_sector();
for (int i=0; i<trackdata.sector_range().sector_count(); i++)
sectors.push_back(sectorId + i);
break;
}
default:
Error() << "no list of sectors provided in track format";
}
return sectors;
}
};
std::unique_ptr<ImageReader> ImageReader::createImgImageReader(

View File

@@ -126,8 +126,12 @@ void ImageWriter::printMap(const Image& image)
for (int side = 0; side < geometry.numSides; side++)
{
for (int sectorId = 0; sectorId < geometry.numSectors; sectorId++)
int maxSector = geometry.firstSector + geometry.numSectors - 1;
for (int sectorId = 0; sectorId <= maxSector; sectorId++)
{
if (sectorId < geometry.firstSector)
continue;
std::cout << fmt::format("{}.{:2} ", side, sectorId);
for (int track = 0; track < geometry.numTracks; track++)
{

View File

@@ -4,7 +4,29 @@ import "lib/imagereader/imagereader.proto";
import "lib/common.proto";
message D64OutputProto {}
message LDBSOutputProto {}
message LDBSOutputProto {
enum DataRate {
RATE_HD = 0;
RATE_DD = 1;
RATE_SD = 2;
RATE_ED = 3;
RATE_GUESS = -1;
}
enum RecordingMode {
RECMODE_MFM = 0;
RECMODE_FM = 1;
RECMODE_GCR_MAC = 0x12;
RECMODE_GCR_PRODOS = 0x14;
RECMODE_GCR_LISA = 0x22;
RECMODE_GUESS = -1;
}
optional DataRate data_rate = 1 [default=RATE_GUESS, (help) = "data rate to use in LDBS file"];
optional RecordingMode recording_mode = 2 [default=RECMODE_GUESS, (help) = "recording mode to use in LDBS file"];
}
message DiskCopyOutputProto {}
message NsiOutputProto {}

View File

@@ -35,10 +35,17 @@ public:
ImgInputOutputProto::TrackdataProto trackdata;
getTrackFormat(_config.img(), trackdata, track, side);
int numSectors = trackdata.has_sectors() ? trackdata.sectors() : geometry.numSectors;
auto sectors = getSectors(trackdata);
if (sectors.empty())
{
int maxSector = geometry.firstSector + geometry.numSectors - 1;
for (int i=geometry.firstSector; i<=maxSector; i++)
sectors.push_back(i);
}
int sectorSize = trackdata.has_sector_size() ? trackdata.sector_size() : geometry.sectorSize;
for (int sectorId = 0; sectorId < numSectors; sectorId++)
for (int sectorId : sectors)
{
const auto& sector = image.get(track, side, sectorId);
if (sector)
@@ -53,6 +60,29 @@ public:
tracks, sides,
outputFile.tellp() / 1024);
}
std::vector<unsigned> getSectors(const ImgInputOutputProto::TrackdataProto& trackdata)
{
std::vector<unsigned> sectors;
switch (trackdata.sectors_oneof_case())
{
case ImgInputOutputProto::TrackdataProto::SectorsOneofCase::kSectors:
{
for (int sectorId : trackdata.sectors().sector())
sectors.push_back(sectorId);
break;
}
case ImgInputOutputProto::TrackdataProto::SectorsOneofCase::kSectorRange:
{
int sectorId = trackdata.sector_range().start_sector();
for (int i=0; i<trackdata.sector_range().sector_count(); i++)
sectors.push_back(sectorId + i);
break;
}
}
return sectors;
}
};
std::unique_ptr<ImageWriter> ImageWriter::createImgImageWriter(

View File

@@ -23,7 +23,7 @@ public:
const Geometry geometry = image.getGeometry();
std::cout << fmt::format("writing {} tracks, {} sides, {} sectors, {} bytes per sector",
std::cout << fmt::format("LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per sector",
geometry.numTracks, geometry.numSides, geometry.numSectors,
geometry.sectorSize)
<< std::endl;
@@ -33,6 +33,22 @@ public:
int trackDirectorySize = 0;
trackDirectoryWriter.write_le16(0);
LDBSOutputProto::DataRate dataRate = _config.ldbs().data_rate();
if (dataRate == LDBSOutputProto::RATE_GUESS)
{
dataRate = (geometry.numSectors > 10) ? LDBSOutputProto::RATE_HD : LDBSOutputProto::RATE_DD;
if (geometry.sectorSize <= 256)
dataRate = LDBSOutputProto::RATE_SD;
std::cout << fmt::format("LDBS: guessing data rate as {}\n", LDBSOutputProto::DataRate_Name(dataRate));
}
LDBSOutputProto::RecordingMode recordingMode = _config.ldbs().recording_mode();
if (recordingMode == LDBSOutputProto::RECMODE_GUESS)
{
recordingMode = LDBSOutputProto::RECMODE_MFM;
std::cout << fmt::format("LDBS: guessing recording mode as {}\n", LDBSOutputProto::RecordingMode_Name(recordingMode));
}
for (int track = 0; track < geometry.numTracks; track++)
{
for (int side = 0; side < geometry.numSides; side++)
@@ -51,8 +67,8 @@ public:
trackHeaderWriter.write_le16(0x000C); /* offset of sector sideers */
trackHeaderWriter.write_le16(0x0012); /* length of each sector descriptor */
trackHeaderWriter.write_le16(actualSectors);
trackHeaderWriter.write_8(0); /* data rate unknown */
trackHeaderWriter.write_8(0); /* recording mode unknown */
trackHeaderWriter.write_8(dataRate);
trackHeaderWriter.write_8(recordingMode);
trackHeaderWriter.write_8(0); /* format gap length */
trackHeaderWriter.write_8(0); /* filler byte */
trackHeaderWriter.write_le16(0); /* approximate track length */

View File

@@ -4,31 +4,44 @@ image_reader {
sides: 1
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sectors: 12
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sectors: 11
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sectors: 10
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sectors: 9
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sectors: 8
sector_range {
sector_count: 8
}
}
}
}
@@ -39,31 +52,44 @@ image_writer {
sides: 1
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sectors: 12
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sectors: 11
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sectors: 10
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sectors: 9
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sectors: 8
sector_range {
sector_count: 8
}
}
}
}

View File

@@ -4,31 +4,44 @@ image_reader {
sides: 2
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sectors: 12
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sectors: 11
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sectors: 10
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sectors: 9
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sectors: 8
sector_range {
sector_count: 8
}
}
}
}
@@ -39,32 +52,46 @@ image_writer {
sides: 2
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sectors: 12
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sectors: 11
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sectors: 10
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sectors: 9
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sectors: 8
sector_range {
sector_count: 8
}
}
}
}

View File

@@ -2,13 +2,17 @@ comment: 'Acorn ADFS L/D/E/F 640kB/800kB/1600kB 3.5" or 5.25" 80-track DS (ro)'
image_writer {
filename: "acornadfs.img"
img {}
img {
trackdata {
sector_range {
start_sector: 0
}
}
}
}
decoder {
ibm {
sector_id_base: 0
}
ibm {}
}
cylinders {

View File

@@ -2,13 +2,17 @@ comment: 'Acorn DFS 100kB/200kB 3.5" or 5.25" 40- or 80-track SS (ro)'
image_writer {
filename: "acorndfs.img"
img {}
img {
trackdata {
sector_range {
start_sector: 0
}
}
}
}
decoder {
ibm {
sector_id_base: 0
}
ibm {}
}
cylinders {

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 11
sector_size: 512
sector_range {
start_sector: 0
sector_count: 11
}
}
}
}
@@ -19,7 +22,10 @@ image_writer {
sides: 2
trackdata {
sector_size: 512
sectors: 11
sector_range {
start_sector: 0
sector_count: 11
}
}
}
}

View File

@@ -2,13 +2,17 @@ comment: 'Ampro 400kB/800kB 5.25" 40/80 track SSDD/DSDD (ro)'
image_writer {
filename: "ampro.img"
img {}
img {
trackdata {
sector_range {
start_sector: 17
}
}
}
}
decoder {
ibm {
sector_id_base: 17
}
ibm {}
}
cylinders {

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 80
sides: 1
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
image_writer {
filename: "atarist360.st"
img {}
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
encoder {
@@ -26,8 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
sector_size: 512
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 82
sides: 1
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
image_writer {
filename: "atarist370.st"
img {}
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
encoder {
@@ -26,7 +39,17 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 80
sides: 1
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
image_writer {
filename: "atarist400.st"
img {}
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
encoder {
@@ -26,7 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 82
sides: 1
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
image_writer {
filename: "atarist410.st"
img {}
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
encoder {
@@ -26,7 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
image_writer {
filename: "atarist720.st"
img {}
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
encoder {
@@ -26,7 +39,17 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 82
sides: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
image_writer {
filename: "atarist740.st"
img {}
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 9
}
}
}
}
encoder {
@@ -26,7 +39,17 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
image_writer {
filename: "atarist800.st"
img {}
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
encoder {
@@ -26,7 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,15 +6,28 @@ image_reader {
tracks: 82
sides: 2
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
image_writer {
filename: "atarist820.st"
img {}
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
encoder {
@@ -26,7 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 39
sides: 1
trackdata {
sectors: 12
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 78
sides: 1
trackdata {
sectors: 12
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
@@ -18,8 +21,11 @@ image_writer {
tracks: 80
sides: 2
trackdata {
sectors: 10
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
}
@@ -33,7 +39,18 @@ encoder {
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
swap_sides: true
}
}

View File

@@ -6,20 +6,29 @@ image_writer {
tracks: 77
sides: 2
trackdata {
sectors: 16
sector_size: 512
sector_range {
start_sector: 1
sector_count: 16
}
}
trackdata {
track: 0
side: 0
sectors: 26
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
}
trackdata {
track: 0
side: 1
sectors: 26
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 77
sides: 2
trackdata {
sectors: 5
sector_size: 1024
sector_range {
start_sector: 0
sector_count: 5
}
}
}
}
@@ -21,7 +24,13 @@ encoder {
gap0: 80
gap2: 22
gap3: 44
sector_skew: "01234"
sectors {
sector: 0
sector: 1
sector: 2
sector: 3
sector: 4
}
}
}
}

View File

@@ -18,8 +18,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 15
sector_size: 512
sector_range {
start_sector: 1
sector_count: 15
}
}
}
}
@@ -34,7 +37,23 @@ encoder {
trackdata {
track_length_ms: 167
clock_rate_khz: 500
sector_skew: "0123456789abcde"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
sector: 10
sector: 11
sector: 12
sector: 13
sector: 14
sector: 15
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 18
sector_size: 512
sector_range {
start_sector: 1
sector_count: 18
}
}
}
}
@@ -22,7 +25,26 @@ encoder {
trackdata {
track_length_ms: 200
clock_rate_khz: 500
sector_skew: "0123456789abcdefgh"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
sector: 10
sector: 11
sector: 12
sector: 13
sector: 14
sector: 15
sector: 16
sector: 17
sector: 18
}
}
}
}

View File

@@ -7,8 +7,11 @@ image_reader {
sides: 1
physical_step: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
}
@@ -23,7 +26,17 @@ encoder {
trackdata {
track_length_ms: 167
clock_rate_khz: 300
sector_skew: "012345678"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -7,8 +7,11 @@ image_reader {
sides: 2
physical_step: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
}
@@ -23,7 +26,17 @@ encoder {
trackdata {
track_length_ms: 167
clock_rate_khz: 300
sector_skew: "012345678"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
}
@@ -22,7 +25,17 @@ encoder {
trackdata {
track_length_ms: 200
clock_rate_khz: 250
sector_skew: "012345678"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 80
sides: 2
trackdata {
sectors: 9
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
}
@@ -22,7 +25,17 @@ encoder {
trackdata {
track_length_ms: 167
clock_rate_khz: 300
sector_skew: "012345678"
sectors {
sector: 1
sector: 2
sector: 3
sector: 4
sector: 5
sector: 6
sector: 7
sector: 8
sector: 9
}
}
}
}

View File

@@ -6,8 +6,11 @@ image_reader {
tracks: 77
sides: 2
trackdata {
sectors: 26
sector_size: 288
sector_range {
start_sector: 0
sector_count: 26
}
}
}
}