From 1177ef6f8d8ee382c8446a18bd1ac35aef209305 Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 3 Aug 2021 22:31:33 +0200 Subject: [PATCH] Allow the LDBS data rate and recording mode to be specified, or (crudely) guessed if not. --- lib/imagewriter/imagewriter.proto | 24 +++++++++++++++++++++++- lib/imagewriter/ldbsimagewriter.cc | 22 +++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) 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/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 */