| 16 | LDBSImageWriter(const ImageWriterProto& config): ImageWriter(config) {} |
| 17 | |
| 18 | void writeImage(const Image& image) override |
| 19 | { |
| 20 | LDBS ldbs; |
| 21 | |
| 22 | const Geometry geometry = image.getGeometry(); |
| 23 | |
| 24 | log("LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per " |
| 25 | "sector", |
| 26 | geometry.numCylinders, |
| 27 | geometry.numHeads, |
| 28 | geometry.numSectors, |
| 29 | geometry.sectorSize); |
| 30 | |
| 31 | Bytes trackDirectory; |
| 32 | ByteWriter trackDirectoryWriter(trackDirectory); |
| 33 | int trackDirectorySize = 0; |
| 34 | trackDirectoryWriter.write_le16(0); |
| 35 | |
| 36 | LDBSOutputProto::DataRate dataRate = _config.ldbs().data_rate(); |
| 37 | if (dataRate == LDBSOutputProto::RATE_GUESS) |
| 38 | { |
| 39 | dataRate = (geometry.numSectors > 10) ? LDBSOutputProto::RATE_HD |
| 40 | : LDBSOutputProto::RATE_DD; |
| 41 | if (geometry.sectorSize <= 256) |
| 42 | dataRate = LDBSOutputProto::RATE_SD; |
| 43 | log("LDBS: guessing data rate as {}", |
| 44 | LDBSOutputProto::DataRate_Name(dataRate)); |
| 45 | } |
| 46 | |
| 47 | LDBSOutputProto::RecordingMode recordingMode = |
| 48 | _config.ldbs().recording_mode(); |
| 49 | if (recordingMode == LDBSOutputProto::RECMODE_GUESS) |
| 50 | { |
| 51 | recordingMode = LDBSOutputProto::RECMODE_MFM; |
| 52 | log("LDBS: guessing recording mode as {}", |
| 53 | LDBSOutputProto::RecordingMode_Name(recordingMode)); |
| 54 | } |
| 55 | |
| 56 | for (int track = 0; track < geometry.numCylinders; track++) |
| 57 | { |
| 58 | for (int side = 0; side < geometry.numHeads; side++) |
| 59 | { |
| 60 | Bytes trackHeader; |
| 61 | ByteWriter trackHeaderWriter(trackHeader); |
| 62 | |
| 63 | int actualSectors = 0; |
| 64 | for (int sectorId = 0; sectorId < geometry.numSectors; |
| 65 | sectorId++) |
| 66 | { |
| 67 | const auto& sector = image.get(track, side, sectorId); |
| 68 | if (sector) |
| 69 | actualSectors++; |
| 70 | } |
| 71 | |
| 72 | trackHeaderWriter.write_le16( |
| 73 | 0x000C); /* offset of sector sideers */ |
| 74 | trackHeaderWriter.write_le16( |
| 75 | 0x0012); /* length of each sector descriptor */ |