Refactor disk layout information out of ImgReaderWriterProto into a new

top-level config paragraph.
This commit is contained in:
David Given
2022-08-25 22:51:26 +02:00
parent e733dc90d8
commit 1dd94a7d82
49 changed files with 883 additions and 1458 deletions

View File

@@ -92,6 +92,7 @@ all: binaries tests
PROTOS = \
arch/aeslanier/aeslanier.proto \
arch/agat/agat.proto \
arch/amiga/amiga.proto \
arch/apple2/apple2.proto \
arch/brother/brother.proto \
@@ -100,25 +101,25 @@ PROTOS = \
arch/fb100/fb100.proto \
arch/ibm/ibm.proto \
arch/macintosh/macintosh.proto \
arch/micropolis/micropolis.proto \
arch/mx/mx.proto \
arch/northstar/northstar.proto \
arch/tids990/tids990.proto \
arch/victor9k/victor9k.proto \
arch/zilogmcz/zilogmcz.proto \
arch/tids990/tids990.proto \
arch/micropolis/micropolis.proto \
arch/northstar/northstar.proto \
arch/agat/agat.proto \
lib/common.proto \
lib/config.proto \
lib/decoders/decoders.proto \
lib/drive.proto \
lib/encoders/encoders.proto \
lib/fl2.proto \
lib/fluxsink/fluxsink.proto \
lib/fluxsource/fluxsource.proto \
lib/imagereader/imagereader.proto \
lib/imagewriter/imagewriter.proto \
lib/usb/usb.proto \
lib/common.proto \
lib/fl2.proto \
lib/config.proto \
lib/layout.proto \
lib/mapper.proto \
lib/drive.proto \
lib/usb/usb.proto \
tests/testproto.proto \
PROTO_HDRS = $(patsubst %.proto, $(OBJDIR)/%.pb.h, $(PROTOS))

View File

@@ -10,12 +10,15 @@ import "lib/usb/usb.proto";
import "lib/drive.proto";
import "lib/mapper.proto";
import "lib/common.proto";
import "lib/layout.proto";
// NEXT_TAG: 17
// NEXT_TAG: 18
message ConfigProto {
optional string comment = 8;
optional bool is_extension = 13;
optional LayoutProto layout = 17;
optional ImageReaderProto image_reader = 12;
optional ImageWriterProto image_writer = 9;

View File

@@ -3,38 +3,6 @@ syntax = "proto2";
import "lib/common.proto";
message ImgInputOutputProto {
enum Order {
UNDEFINED = 0;
CHS = 1;
HCS = 2;
}
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"];
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)"];
optional int32 tracks = 5 [default=0, (help) = "number of tracks in image"];
optional int32 sides = 6 [default=0, (help) = "number of sides in image"];
optional Order order = 9 [default=CHS, (help) = "the order in which to emit tracks in the image"];
}
message DiskCopyInputProto {}

View File

@@ -6,6 +6,8 @@
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "lib/layout.pb.h"
#include "lib/proto.h"
#include "imginputoutpututils.h"
#include "fmt/format.h"
#include <algorithm>
@@ -24,12 +26,13 @@ public:
if (!inputFile.is_open())
Error() << "cannot open input file";
if (!_config.img().tracks() || !_config.img().sides())
auto layout = config.layout();
if (!layout.tracks() || !layout.sides())
Error() << "IMG: bad configuration; did you remember to set the "
"tracks, sides and trackdata fields?";
"tracks, sides and trackdata fields in the layout?";
std::unique_ptr<Image> image(new Image);
for (const auto& p : getTrackOrdering(_config.img()))
for (const auto& p : getTrackOrdering(layout))
{
int track = p.first;
int side = p.second;
@@ -37,10 +40,9 @@ public:
if (inputFile.eof())
break;
ImgInputOutputProto::TrackdataProto trackdata;
getTrackFormat(_config.img(), trackdata, track, side);
auto trackdata = getTrackFormat(layout, track, side);
for (int sectorId : getSectors(trackdata))
for (int sectorId : getTrackSectors(trackdata))
{
Bytes data(trackdata.sector_size());
inputFile.read((char*)data.begin(), data.size());
@@ -48,7 +50,8 @@ public:
const auto& sector = image->put(track, side, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->physicalTrack =
Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = side;
sector->logicalSector = sectorId;
sector->data = data;
@@ -63,36 +66,6 @@ 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

@@ -3,8 +3,10 @@
#include "sector.h"
#include "imagewriter/imagewriter.h"
#include "image.h"
#include "lib/proto.h"
#include "lib/config.pb.h"
#include "imginputoutpututils.h"
#include "lib/layout.pb.h"
#include "fmt/format.h"
#include "logger.h"
#include <algorithm>
@@ -14,85 +16,58 @@
class ImgImageWriter : public ImageWriter
{
public:
ImgImageWriter(const ImageWriterProto& config):
ImageWriter(config)
{}
ImgImageWriter(const ImageWriterProto& config): ImageWriter(config) {}
void writeImage(const Image& image)
{
const Geometry geometry = image.getGeometry();
void writeImage(const Image& image)
{
const Geometry geometry = image.getGeometry();
int tracks = _config.img().has_tracks() ? _config.img().tracks() : geometry.numTracks;
int sides = _config.img().has_sides() ? _config.img().sides() : geometry.numSides;
auto& layout = config.layout();
int tracks = layout.has_tracks() ? layout.tracks() : geometry.numTracks;
int sides = layout.has_sides() ? layout.sides() : geometry.numSides;
std::ofstream outputFile(_config.filename(), std::ios::out | std::ios::binary);
if (!outputFile.is_open())
Error() << "cannot open output file";
std::ofstream outputFile(
_config.filename(), std::ios::out | std::ios::binary);
if (!outputFile.is_open())
Error() << "cannot open output file";
for (const auto& p : getTrackOrdering(_config.img(), tracks, sides))
{
int track = p.first;
int side = p.second;
for (const auto& p : getTrackOrdering(layout, tracks, sides))
{
int track = p.first;
int side = p.second;
ImgInputOutputProto::TrackdataProto trackdata;
getTrackFormat(_config.img(), trackdata, track, side);
auto trackdata = getTrackFormat(layout, track, side);
auto sectors = getTrackSectors(trackdata, geometry.numSectors);
if (sectors.empty())
{
int maxSector = geometry.firstSector + geometry.numSectors - 1;
for (int i = geometry.firstSector; i <= maxSector; i++)
sectors.push_back(i);
}
auto sectors = getSectors(trackdata, geometry.numSectors);
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;
int sectorSize = trackdata.has_sector_size() ? trackdata.sector_size() : geometry.sectorSize;
for (int sectorId : sectors)
{
const auto& sector = image.get(track, side, sectorId);
if (sector)
sector->data.slice(0, sectorSize).writeTo(outputFile);
else
outputFile.seekp(sectorSize, std::ios::cur);
}
}
for (int sectorId : sectors)
{
const auto& sector = image.get(track, side, sectorId);
if (sector)
sector->data.slice(0, sectorSize).writeTo(outputFile);
else
outputFile.seekp(sectorSize, std::ios::cur);
}
}
Logger() << fmt::format("IMG: wrote {} tracks, {} sides, {} kB total",
tracks, sides,
outputFile.tellp() / 1024);
}
std::vector<unsigned> getSectors(const ImgInputOutputProto::TrackdataProto& trackdata, unsigned numSectors)
{
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();
if (trackdata.sector_range().has_sector_count())
numSectors = trackdata.sector_range().sector_count();
for (int i=0; i<numSectors; i++)
sectors.push_back(sectorId + i);
break;
}
default:
break;
}
return sectors;
}
Logger() << fmt::format("IMG: wrote {} tracks, {} sides, {} kB total",
tracks,
sides,
outputFile.tellp() / 1024);
}
};
std::unique_ptr<ImageWriter> ImageWriter::createImgImageWriter(
const ImageWriterProto& config)
const ImageWriterProto& config)
{
return std::unique_ptr<ImageWriter>(new ImgImageWriter(config));
}

View File

@@ -1,57 +1,92 @@
#include "globals.h"
#include "lib/imagereader/imagereader.pb.h"
#include "lib/layout.pb.h"
#include "imginputoutpututils.h"
std::vector<std::pair<int, int>> getTrackOrdering(const ImgInputOutputProto& config,
unsigned numTracks, unsigned numSides)
std::vector<std::pair<int, int>> getTrackOrdering(
const LayoutProto& config, unsigned numTracks, unsigned numSides)
{
int tracks = config.has_tracks() ? config.tracks() : numTracks;
int sides = config.has_sides() ? config.sides() : numSides;
int tracks = config.has_tracks() ? config.tracks() : numTracks;
int sides = config.has_sides() ? config.sides() : numSides;
std::vector<std::pair<int, int>> ordering;
switch (config.order())
{
case ImgInputOutputProto::CHS:
{
for (int track = 0; track < tracks; track++)
{
for (int side = 0; side < sides; side++)
ordering.push_back(std::make_pair(track, side));
}
break;
}
case ImgInputOutputProto::HCS:
{
for (int side = 0; side < sides; side++)
{
for (int track = 0; track < tracks; track++)
ordering.push_back(std::make_pair(track, side));
}
break;
}
default:
Error() << "IMG: invalid track ordering";
}
std::vector<std::pair<int, int>> ordering;
switch (config.order())
{
case LayoutProto::CHS:
{
for (int track = 0; track < tracks; track++)
{
for (int side = 0; side < sides; side++)
ordering.push_back(std::make_pair(track, side));
}
break;
}
return ordering;
case LayoutProto::HCS:
{
for (int side = 0; side < sides; side++)
{
for (int track = 0; track < tracks; track++)
ordering.push_back(std::make_pair(track, side));
}
break;
}
default:
Error() << "IMG: invalid track ordering";
}
return ordering;
}
void getTrackFormat(const ImgInputOutputProto& config,
ImgInputOutputProto::TrackdataProto& trackdata, unsigned track, unsigned side)
LayoutProto::TrackdataProto getTrackFormat(const LayoutProto& config,
unsigned track,
unsigned side)
{
trackdata.Clear();
for (const ImgInputOutputProto::TrackdataProto& f : config.trackdata())
{
if (f.has_track() && f.has_up_to_track() && ((track < f.track()) || (track > f.up_to_track())))
continue;
if (f.has_track() && !f.has_up_to_track() && (track != f.track()))
continue;
if (f.has_side() && (f.side() != side))
continue;
LayoutProto::TrackdataProto trackdata;
trackdata.MergeFrom(f);
}
for (const auto& f : config.trackdata())
{
if (f.has_track() && f.has_up_to_track() &&
((track < f.track()) || (track > f.up_to_track())))
continue;
if (f.has_track() && !f.has_up_to_track() && (track != f.track()))
continue;
if (f.has_side() && (f.side() != side))
continue;
trackdata.MergeFrom(f);
}
return trackdata;
}
std::vector<unsigned> getTrackSectors(
const LayoutProto::TrackdataProto& trackdata, unsigned numSectors)
{
std::vector<unsigned> sectors;
switch (trackdata.sectors_oneof_case())
{
case LayoutProto::TrackdataProto::SectorsOneofCase::kSectors:
{
for (int sectorId : trackdata.sectors().sector())
sectors.push_back(sectorId);
break;
}
case LayoutProto::TrackdataProto::SectorsOneofCase::
kSectorRange:
{
int sectorId = trackdata.sector_range().start_sector();
if (trackdata.sector_range().has_sector_count())
numSectors = trackdata.sector_range().sector_count();
for (int i = 0; i < numSectors; i++)
sectors.push_back(sectorId + i);
break;
}
default:
break;
}
return sectors;
}

View File

@@ -1,12 +1,16 @@
#ifndef IMGINPUTOUTPUTUTILS_H
#define IMGINPUTOUTPUTUTILS_H
extern std::vector<std::pair<int, int>> getTrackOrdering(const ImgInputOutputProto& config,
unsigned numTracks = 0, unsigned numSides = 0);
extern std::vector<std::pair<int, int>> getTrackOrdering(
const LayoutProto& config,
unsigned numTracks = 0,
unsigned numSides = 0);
extern void getTrackFormat(const ImgInputOutputProto& config,
ImgInputOutputProto::TrackdataProto& trackdata, unsigned track, unsigned side);
extern LayoutProto::TrackdataProto getTrackFormat(const LayoutProto& config,
unsigned track,
unsigned side);
extern std::vector<unsigned> getTrackSectors(
const LayoutProto::TrackdataProto& trackdata, unsigned numSectors = 0);
#endif

39
lib/layout.proto Normal file
View File

@@ -0,0 +1,39 @@
syntax = "proto2";
import "lib/common.proto";
message LayoutProto {
enum Order {
UNDEFINED = 0;
CHS = 1;
HCS = 2;
}
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"];
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 = 1 [(help) = "per-track format information (repeatable)"];
optional int32 tracks = 2 [default=0, (help) = "number of tracks in image"];
optional int32 sides = 3 [default=0, (help) = "number of sides in image"];
optional Order order = 4 [default=CHS, (help) = "the order of sectors in the filesystem"];
}

View File

@@ -1,96 +1,7 @@
image_reader {
img {
tracks: 80
sides: 1
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}
image_writer {
img {
tracks: 80
sides: 1
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}

View File

@@ -1,97 +1,9 @@
image_reader {
img {
tracks: 80
sides: 2
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}
image_writer {
img {
tracks: 80
sides: 2
trackdata {
sector_size: 524
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}

View File

@@ -2,11 +2,13 @@ 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 {
trackdata {
sector_range {
start_sector: 0
}
img {}
}
layout {
trackdata {
sector_range {
start_sector: 0
}
}
}

View File

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

View File

@@ -2,11 +2,13 @@ comment: 'Agat 840kB 5.25" 80-track DS (ro)'
image_writer {
filename: "agat.img"
img {
trackdata {
sector_range {
start_sector: 0
}
img {}
}
layout {
trackdata {
sector_range {
start_sector: 0
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Amiga 880kB 3.5" DSDD'
image_reader {
filename: "amiga.adf"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 11
}
}
}
img {}
}
image_writer {
filename: "amiga.adf"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 11
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 11
}
}
}

View File

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

View File

@@ -2,15 +2,17 @@ comment: 'Apple II 140kB DOS 3.3 5.25" 40 track SSSD'
image_reader {
filename: "apple2.img"
img {
tracks: 40
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 40
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 360kB 3.5" 80-track 9-sector SSDD'
image_reader {
filename: "atarist360.st"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
filename: "atarist360.st"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
img {}
}
layout {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 370kB 3.5" 82-track 9-sector SSDD'
image_reader {
filename: "atarist370.st"
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
filename: "atarist370.st"
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
img {}
}
layout {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 400kB 3.5" 80-track 10-sector SSDD'
image_reader {
filename: "atarist400.st"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
filename: "atarist400.st"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
img {}
}
layout {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 410kB 3.5" 82-track 10-sector SSDD'
image_reader {
filename: "atarist410.st"
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
filename: "atarist410.st"
img {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
img {}
}
layout {
tracks: 82
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 720kB 3.5" 80-track 9-sector DSDD'
image_reader {
filename: "atarist720.st"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
filename: "atarist720.st"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 740kB 3.5" 82-track 9-sector DSDD'
image_reader {
filename: "atarist740.st"
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
filename: "atarist740.st"
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
img {}
}
layout {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 800kB 3.5" 80-track 10-sector DSDD'
image_reader {
filename: "atarist800.st"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
filename: "atarist800.st"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Atari ST 820kB 3.5" 82-track 10-sector DSDD'
image_reader {
filename: "atarist820.st"
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
filename: "atarist820.st"
img {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
img {}
}
layout {
tracks: 82
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}

View File

@@ -2,17 +2,7 @@ comment: 'BK 800kB 5.25"/3.5" 80-track 10-sector DSDD'
image_reader {
filename: "bk800.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,30 +2,22 @@ comment: 'Brother 120kB 3.5" 39-track SS GCR'
image_reader {
filename: "brother120.img"
img {
tracks: 39
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}
img {}
}
image_writer {
filename: "brother120.img"
img {
tracks: 39
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
img {}
}
layout {
tracks: 39
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Brother 240kB 3.5" 78-track SS GCR'
image_reader {
filename: "brother240.img"
img {
tracks: 78
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}
img {}
}
image_writer {
filename: "brother240.img"
img {
tracks: 78
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
img {}
}
layout {
tracks: 78
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 12
}
}
}

View File

@@ -2,30 +2,22 @@ comment: 'Commodore 1581 800kB 3.5" DSDD'
image_reader {
filename: "commodore1581.d81"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}
img {}
}
image_writer {
filename: "commodore1581.d81"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
sector_count: 10
}
}
}

View File

@@ -2,33 +2,35 @@ comment: 'VDS Eco1 1210kB 77-track mixed format DSHD (ro)'
image_writer {
filename: "eco1.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 16
}
img {}
}
layout {
tracks: 77
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 16
}
trackdata {
track: 0
side: 0
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
}
trackdata {
track: 0
side: 0
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
trackdata {
track: 0
side: 1
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
}
trackdata {
track: 0
side: 1
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
}
}

View File

@@ -2,15 +2,17 @@ comment: 'Hewlett-Packard 9121 264kB 3.5" SSDD'
image_reader {
filename: "hp9121.img"
img {
tracks: 66
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 66
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -7,15 +7,17 @@ drive {
image_reader {
filename: "hplif770.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 1024
sector_range {
start_sector: 1
sector_count: 5
}
img {}
}
layout {
tracks: 77
sides: 2
trackdata {
sector_size: 1024
sector_range {
start_sector: 1
sector_count: 5
}
}
}

View File

@@ -2,17 +2,7 @@ comment: 'PC 1200kB 5.25" 80-track 15-sector DSHD'
image_reader {
filename: "ibm1200.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 15
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 15
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'Japanese PC 1232kB 5.25"/3.5" 77-track 8-sector DSHD'
image_reader {
filename: "ibm1232.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 1024
sector_range {
start_sector: 1
sector_count: 8
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 77
sides: 2
trackdata {
sector_size: 1024
sector_range {
start_sector: 1
sector_count: 8
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'PC 1440kB 3.5" 80-track 18-sector DSHD'
image_reader {
filename: "ibm1440.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 18
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 18
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'PC 180kB 5.25" 40-track 9-sector SSDD'
image_reader {
filename: "ibm180.img"
img {
tracks: 40
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 40
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'PC 360kB 5.25" 40-track 9-sector DSDD'
image_reader {
filename: "ibm360.img"
img {
tracks: 40
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 40
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'PC 720kB 5.25"/3.5" 80-track 9-sector DSDD'
image_reader {
filename: "ibm720.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 9
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,98 +2,56 @@ comment: 'Macintosh 400kB 3.5" SSDD GCR'
image_reader {
filename: "mac400.dsk"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}
image_writer {
filename: "mac400.dsk"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
img {}
}
layout {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}

View File

@@ -2,103 +2,60 @@ comment: 'Macintosh 800kB 3.5" DSDD GCR'
image_reader {
filename: "mac800.dsk"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
img {}
}
image_writer {
filename: "mac800.dsk"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
}
trackdata {
track: 0
up_to_track: 15
sector_range {
sector_count: 12
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
}
trackdata {
track: 16
up_to_track: 31
sector_range {
sector_count: 11
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
}
trackdata {
track: 32
up_to_track: 47
sector_range {
sector_count: 10
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
}
trackdata {
track: 48
up_to_track: 63
sector_range {
sector_count: 9
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
trackdata {
track: 64
up_to_track: 79
sector_range {
sector_count: 8
}
}
}
encoder {
macintosh {}
}

View File

@@ -6,29 +6,21 @@ drive {
image_reader {
filename: "micropolis.img"
img {
tracks: 35
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
img {}
}
image_writer {
filename: "micropolis.img"
img {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -6,29 +6,21 @@ drive {
image_reader {
filename: "micropolis.img"
img {
tracks: 35
sides: 2
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
img {}
}
image_writer {
filename: "micropolis.img"
img {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -6,29 +6,21 @@ drive {
image_reader {
filename: "micropolis.img"
img {
tracks: 77
sides: 1
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
img {}
}
image_writer {
filename: "micropolis.img"
img {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -6,29 +6,21 @@ drive {
image_reader {
filename: "micropolis.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
img {}
}
image_writer {
filename: "micropolis.img"
img {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
img {}
}
layout {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}

View File

@@ -6,48 +6,31 @@ drive {
image_reader {
filename: "n88basic.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
}
trackdata {
track: 0
side: 0
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
}
}
img {}
}
image_writer {
filename: "n88basic.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
img {}
}
layout {
tracks: 77
sides: 2
trackdata {
sector_size: 256
sector_range {
start_sector: 1
sector_count: 26
}
trackdata {
track: 0
side: 0
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
}
trackdata {
track: 0
side: 0
sector_size: 128
sector_range {
start_sector: 1
sector_count: 26
}
}
}

View File

@@ -6,17 +6,7 @@ drive {
image_reader {
filename: "rx50.img"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
img {}
}
image_writer {
@@ -24,6 +14,18 @@ image_writer {
img {}
}
layout {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 1
sector_count: 10
}
}
}
encoder {
ibm {
trackdata {

View File

@@ -2,17 +2,7 @@ comment: 'Texas Instruments DS990 1126kB 8" DSSD'
image_reader {
filename: "tids990.img"
img {
tracks: 77
sides: 2
trackdata {
sector_size: 288
sector_range {
start_sector: 0
sector_count: 26
}
}
}
img {}
}
image_writer {
@@ -20,6 +10,18 @@ image_writer {
img {}
}
layout {
tracks: 77
sides: 2
trackdata {
sector_size: 288
sector_range {
start_sector: 0
sector_count: 26
}
}
}
encoder {
tids990 {}
}

View File

@@ -3,19 +3,17 @@ is_extension: true
image_reader {
filename: "micropolis.vgi"
img {
trackdata {
sector_size: 275
}
}
img {}
}
image_writer {
filename: "micropolis.vgi"
img {
trackdata {
sector_size: 275
}
img {}
}
layout {
trackdata {
sector_size: 275
}
}

View File

@@ -2,284 +2,149 @@ comment: 'Victor 9000 / Sirius One 1224kB DSHD GCR variable sector)'
image_reader {
filename: "victor9k_ds.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
}
trackdata {
side: 0
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
}
trackdata {
side: 0
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
}
trackdata {
side: 0
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
}
trackdata {
side: 0
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
}
trackdata {
side: 0
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
}
trackdata {
side: 0
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
}
trackdata {
side: 0
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
}
trackdata {
side: 0
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
}
trackdata {
side: 1
track: 0
up_to_track: 7
sector_range {
sector_count: 18
}
}
trackdata {
side: 1
track: 8
up_to_track: 18
sector_range {
sector_count: 17
}
}
trackdata {
side: 1
track: 19
up_to_track: 29
sector_range {
sector_count: 16
}
}
trackdata {
side: 1
track: 30
up_to_track: 39
sector_range {
sector_count: 15
}
}
trackdata {
side: 1
track: 40
up_to_track: 51
sector_range {
sector_count: 14
}
}
trackdata {
side: 1
track: 52
up_to_track: 62
sector_range {
sector_count: 13
}
}
trackdata {
side: 1
track: 63
up_to_track: 74
sector_range {
sector_count: 12
}
}
trackdata {
side: 1
track: 75
up_to_track: 79
sector_range {
sector_count: 11
}
}
}
img {}
}
image_writer {
filename: "victor9k_ds.img"
img {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
img {}
}
layout {
tracks: 80
sides: 2
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
trackdata {
side: 0
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
}
trackdata {
side: 0
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
trackdata {
side: 0
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
}
trackdata {
side: 0
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
trackdata {
side: 0
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
}
trackdata {
side: 0
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
trackdata {
side: 0
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
}
trackdata {
side: 0
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
trackdata {
side: 0
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
}
trackdata {
side: 0
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
trackdata {
side: 0
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
}
trackdata {
side: 0
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
trackdata {
side: 0
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
}
trackdata {
side: 0
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
trackdata {
side: 0
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
}
trackdata {
side: 0
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
trackdata {
side: 1
track: 0
up_to_track: 7
sector_range {
sector_count: 18
}
}
trackdata {
side: 1
track: 0
up_to_track: 7
sector_range {
sector_count: 18
}
trackdata {
side: 1
track: 8
up_to_track: 18
sector_range {
sector_count: 17
}
}
trackdata {
side: 1
track: 8
up_to_track: 18
sector_range {
sector_count: 17
}
trackdata {
side: 1
track: 19
up_to_track: 29
sector_range {
sector_count: 16
}
}
trackdata {
side: 1
track: 19
up_to_track: 29
sector_range {
sector_count: 16
}
trackdata {
side: 1
track: 30
up_to_track: 39
sector_range {
sector_count: 15
}
}
trackdata {
side: 1
track: 30
up_to_track: 39
sector_range {
sector_count: 15
}
trackdata {
side: 1
track: 40
up_to_track: 51
sector_range {
sector_count: 14
}
}
trackdata {
side: 1
track: 40
up_to_track: 51
sector_range {
sector_count: 14
}
trackdata {
side: 1
track: 52
up_to_track: 62
sector_range {
sector_count: 13
}
}
trackdata {
side: 1
track: 52
up_to_track: 62
sector_range {
sector_count: 13
}
trackdata {
side: 1
track: 63
up_to_track: 74
sector_range {
sector_count: 12
}
}
trackdata {
side: 1
track: 63
up_to_track: 74
sector_range {
sector_count: 12
}
trackdata {
side: 1
track: 75
up_to_track: 79
sector_range {
sector_count: 11
}
}
trackdata {
side: 1
track: 75
up_to_track: 79
sector_range {
sector_count: 11
}
}
}

View File

@@ -2,140 +2,77 @@ comment: 'Victor 9000 / Sirius One 612kB SSHD GCR variable sector)'
image_reader {
filename: "victor9k.img"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
}
trackdata {
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
}
trackdata {
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
}
trackdata {
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
}
trackdata {
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
}
trackdata {
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
}
trackdata {
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
}
trackdata {
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
}
trackdata {
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
}
}
img {}
}
image_writer {
filename: "victor9k.img"
img {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
img {}
}
layout {
tracks: 80
sides: 1
trackdata {
sector_size: 512
sector_range {
start_sector: 0
}
trackdata {
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
}
trackdata {
track: 0
up_to_track: 3
sector_range {
sector_count: 19
}
trackdata {
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
}
trackdata {
track: 4
up_to_track: 15
sector_range {
sector_count: 18
}
trackdata {
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
}
trackdata {
track: 16
up_to_track: 26
sector_range {
sector_count: 17
}
trackdata {
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
}
trackdata {
track: 27
up_to_track: 37
sector_range {
sector_count: 16
}
trackdata {
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
}
trackdata {
track: 38
up_to_track: 47
sector_range {
sector_count: 15
}
trackdata {
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
}
trackdata {
track: 48
up_to_track: 59
sector_range {
sector_count: 14
}
trackdata {
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
}
trackdata {
track: 60
up_to_track: 70
sector_range {
sector_count: 13
}
trackdata {
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
}
trackdata {
track: 71
up_to_track: 79
sector_range {
sector_count: 12
}
}
}