mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Merge from master.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <cassert>
|
||||
#include <climits>
|
||||
|
||||
#if defined(_WIN32) || defined(__WIN32__)
|
||||
#include <direct.h>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)"];
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,11 @@ image_reader {
|
||||
tracks: 39
|
||||
sides: 1
|
||||
trackdata {
|
||||
sectors: 12
|
||||
sector_size: 256
|
||||
sector_range {
|
||||
start_sector: 0
|
||||
sector_count: 12
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,11 @@ image_reader {
|
||||
tracks: 78
|
||||
sides: 1
|
||||
trackdata {
|
||||
sectors: 12
|
||||
sector_size: 256
|
||||
sector_range {
|
||||
start_sector: 0
|
||||
sector_count: 12
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,11 @@ image_reader {
|
||||
tracks: 77
|
||||
sides: 2
|
||||
trackdata {
|
||||
sectors: 26
|
||||
sector_size: 288
|
||||
sector_range {
|
||||
start_sector: 0
|
||||
sector_count: 26
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user