Allow the LDBS data rate and recording mode to be specified, or (crudely)

guessed if not.
This commit is contained in:
David Given
2021-08-03 22:31:33 +02:00
parent 2ff50c0c56
commit 1177ef6f8d
2 changed files with 42 additions and 4 deletions

View File

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

View File

@@ -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 */