diff --git a/arch/ibm/decoder.cc b/arch/ibm/decoder.cc index b3f2bc9b..bc882f2b 100644 --- a/arch/ibm/decoder.cc +++ b/arch/ibm/decoder.cc @@ -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 requiredSectors(unsigned cylinder, unsigned head) const override { - return iterate(_config.required_sectors()); + std::set s; + for (int sectorId : _config.sectors().sector()) + s.insert(sectorId); + return s; } private: diff --git a/arch/ibm/encoder.cc b/arch/ibm/encoder.cc index be51fa66..3308ae76 100644 --- a/arch/ibm/encoder.cc +++ b/arch/ibm/encoder.cc @@ -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(); - } + 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); diff --git a/arch/ibm/ibm.proto b/arch/ibm/ibm.proto index 549f778b..afd55536 100644 --- a/arch/ibm/ibm.proto +++ b/arch/ibm/ibm.proto @@ -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; diff --git a/lib/globals.h b/lib/globals.h index 88a31d86..499c19d3 100644 --- a/lib/globals.h +++ b/lib/globals.h @@ -11,6 +11,7 @@ #include #include #include +#include #if defined(_WIN32) || defined(__WIN32__) #include diff --git a/lib/image.cc b/lib/image.cc index 582bd771..70ba4948 100644 --- a/lib/image.cc +++ b/lib/image.cc @@ -36,6 +36,7 @@ const std::shared_ptr& 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; } diff --git a/lib/image.h b/lib/image.h index 1036da92..80aa5c70 100644 --- a/lib/image.h +++ b/lib/image.h @@ -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; diff --git a/lib/imagereader/imagereader.proto b/lib/imagereader/imagereader.proto index 3e181bc6..927087f8 100644 --- a/lib/imagereader/imagereader.proto +++ b/lib/imagereader/imagereader.proto @@ -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)"]; diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index 89dadf99..1b333818 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -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 getSectors(const ImgInputOutputProto::TrackdataProto& trackdata) + { + std::vector 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 ImageReader::createImgImageReader( diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index a3d664e9..ec0b1350 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -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++) { diff --git a/lib/imagewriter/imagewriter.proto b/lib/imagewriter/imagewriter.proto index 6561b431..6585e026 100644 --- a/lib/imagewriter/imagewriter.proto +++ b/lib/imagewriter/imagewriter.proto @@ -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 {} diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index 8d40e6a6..de66a33a 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -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 getSectors(const ImgInputOutputProto::TrackdataProto& trackdata) + { + std::vector 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 ImageWriter::createImgImageWriter( diff --git a/lib/imagewriter/ldbsimagewriter.cc b/lib/imagewriter/ldbsimagewriter.cc index 71ed390b..89923a37 100644 --- a/lib/imagewriter/ldbsimagewriter.cc +++ b/lib/imagewriter/ldbsimagewriter.cc @@ -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 */ diff --git a/scripts/mac400_test.textpb b/scripts/mac400_test.textpb index 015cec5e..0476399f 100644 --- a/scripts/mac400_test.textpb +++ b/scripts/mac400_test.textpb @@ -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 + } } } } diff --git a/scripts/mac800_test.textpb b/scripts/mac800_test.textpb index 09e615ff..97ddc030 100644 --- a/scripts/mac800_test.textpb +++ b/scripts/mac800_test.textpb @@ -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 + } } } } + diff --git a/src/formats/acornadfs.textpb b/src/formats/acornadfs.textpb index 9a53b6db..24f32bbd 100644 --- a/src/formats/acornadfs.textpb +++ b/src/formats/acornadfs.textpb @@ -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 { diff --git a/src/formats/acorndfs.textpb b/src/formats/acorndfs.textpb index 5a15c8ca..71dc7fca 100644 --- a/src/formats/acorndfs.textpb +++ b/src/formats/acorndfs.textpb @@ -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 { diff --git a/src/formats/amiga.textpb b/src/formats/amiga.textpb index 26d0b107..d112507f 100644 --- a/src/formats/amiga.textpb +++ b/src/formats/amiga.textpb @@ -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 + } } } } diff --git a/src/formats/ampro.textpb b/src/formats/ampro.textpb index 8c547482..501cdbc2 100644 --- a/src/formats/ampro.textpb +++ b/src/formats/ampro.textpb @@ -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 { diff --git a/src/formats/atarist360.textpb b/src/formats/atarist360.textpb index fb0aa564..d48a40b9 100644 --- a/src/formats/atarist360.textpb +++ b/src/formats/atarist360.textpb @@ -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 + } } } } diff --git a/src/formats/atarist370.textpb b/src/formats/atarist370.textpb index 9f640d4c..04a07cc0 100644 --- a/src/formats/atarist370.textpb +++ b/src/formats/atarist370.textpb @@ -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 + } } } } diff --git a/src/formats/atarist400.textpb b/src/formats/atarist400.textpb index 6d48232a..3258ae62 100644 --- a/src/formats/atarist400.textpb +++ b/src/formats/atarist400.textpb @@ -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 + } } } } diff --git a/src/formats/atarist410.textpb b/src/formats/atarist410.textpb index 1aa93bb9..e20731a8 100644 --- a/src/formats/atarist410.textpb +++ b/src/formats/atarist410.textpb @@ -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 + } } } } diff --git a/src/formats/atarist720.textpb b/src/formats/atarist720.textpb index ebb2f06f..c3219f92 100644 --- a/src/formats/atarist720.textpb +++ b/src/formats/atarist720.textpb @@ -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 + } } } } diff --git a/src/formats/atarist740.textpb b/src/formats/atarist740.textpb index 88842e3b..2e72b8bb 100644 --- a/src/formats/atarist740.textpb +++ b/src/formats/atarist740.textpb @@ -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 + } } } } diff --git a/src/formats/atarist800.textpb b/src/formats/atarist800.textpb index 5cfd83ce..7cbf0e80 100644 --- a/src/formats/atarist800.textpb +++ b/src/formats/atarist800.textpb @@ -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 + } } } } diff --git a/src/formats/atarist820.textpb b/src/formats/atarist820.textpb index 4a5c8418..f36e4832 100644 --- a/src/formats/atarist820.textpb +++ b/src/formats/atarist820.textpb @@ -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 + } } } } diff --git a/src/formats/brother120.textpb b/src/formats/brother120.textpb index b6b5713e..65beef8e 100644 --- a/src/formats/brother120.textpb +++ b/src/formats/brother120.textpb @@ -6,8 +6,11 @@ image_reader { tracks: 39 sides: 1 trackdata { - sectors: 12 sector_size: 256 + sector_range { + start_sector: 0 + sector_count: 12 + } } } } diff --git a/src/formats/brother240.textpb b/src/formats/brother240.textpb index 04a13c67..3506476f 100644 --- a/src/formats/brother240.textpb +++ b/src/formats/brother240.textpb @@ -6,8 +6,11 @@ image_reader { tracks: 78 sides: 1 trackdata { - sectors: 12 sector_size: 256 + sector_range { + start_sector: 0 + sector_count: 12 + } } } } diff --git a/src/formats/commodore1581.textpb b/src/formats/commodore1581.textpb index 2251ef46..57dc62fe 100644 --- a/src/formats/commodore1581.textpb +++ b/src/formats/commodore1581.textpb @@ -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 } } diff --git a/src/formats/eco1.textpb b/src/formats/eco1.textpb index e7d74f22..b5a6cac4 100644 --- a/src/formats/eco1.textpb +++ b/src/formats/eco1.textpb @@ -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 + } } } } diff --git a/src/formats/hplif770.textpb b/src/formats/hplif770.textpb index decb325c..4f7a2919 100644 --- a/src/formats/hplif770.textpb +++ b/src/formats/hplif770.textpb @@ -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 + } } } } diff --git a/src/formats/ibm1200_525.textpb b/src/formats/ibm1200_525.textpb index 8a619fbf..e3a68838 100644 --- a/src/formats/ibm1200_525.textpb +++ b/src/formats/ibm1200_525.textpb @@ -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 + } } } } diff --git a/src/formats/ibm1440.textpb b/src/formats/ibm1440.textpb index af9cdf1b..7710eea7 100644 --- a/src/formats/ibm1440.textpb +++ b/src/formats/ibm1440.textpb @@ -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 + } } } } diff --git a/src/formats/ibm180_525.textpb b/src/formats/ibm180_525.textpb index 510bc380..b40e5bae 100644 --- a/src/formats/ibm180_525.textpb +++ b/src/formats/ibm180_525.textpb @@ -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 + } } } } diff --git a/src/formats/ibm360_525.textpb b/src/formats/ibm360_525.textpb index 9ce8ffbc..52d7f91e 100644 --- a/src/formats/ibm360_525.textpb +++ b/src/formats/ibm360_525.textpb @@ -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 + } } } } diff --git a/src/formats/ibm720.textpb b/src/formats/ibm720.textpb index d9054908..900870cd 100644 --- a/src/formats/ibm720.textpb +++ b/src/formats/ibm720.textpb @@ -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 + } } } } diff --git a/src/formats/ibm720_525.textpb b/src/formats/ibm720_525.textpb index 8c70c52e..e5f78521 100644 --- a/src/formats/ibm720_525.textpb +++ b/src/formats/ibm720_525.textpb @@ -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 + } } } } diff --git a/src/formats/tids990.textpb b/src/formats/tids990.textpb index 577440bc..80db5efd 100644 --- a/src/formats/tids990.textpb +++ b/src/formats/tids990.textpb @@ -6,8 +6,11 @@ image_reader { tracks: 77 sides: 2 trackdata { - sectors: 26 sector_size: 288 + sector_range { + start_sector: 0 + sector_count: 26 + } } } }