MCPcopy Create free account
hub / github.com/davidgiven/fluxengine / writeImage

Method writeImage

lib/imagewriter/d88imagewriter.cc:29–133  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27 D88ImageWriter(const ImageWriterProto& config): ImageWriter(config) {}
28
29 void writeImage(const Image& image) override
30 {
31 const Geometry geometry = image.getGeometry();
32
33 int tracks = geometry.numCylinders;
34 int sides = geometry.numHeads;
35
36 std::ofstream outputFile(
37 _config.filename(), std::ios::out | std::ios::binary);
38 if (!outputFile.is_open())
39 error("cannot open output file");
40
41 Bytes header;
42 ByteWriter headerWriter(header);
43 for (int i = 0; i < 26; i++)
44 {
45 headerWriter.write_8(0x0); // image name + reserved bytes
46 }
47 headerWriter.write_8(0x00); // not write protected
48 if (geometry.numCylinders > 42)
49 {
50 headerWriter.write_8(0x20); // 2HD
51 }
52 else
53 {
54 headerWriter.write_8(0x00); // 2D
55 }
56 headerWriter.write_le32(
57 0); // disk size (will be overridden at the end of writing)
58 for (int i = 0; i < 164; i++)
59 {
60 headerWriter.write_le32(
61 0); // track pointer (will be overridden in track loop)
62 }
63 header.writeTo(outputFile);
64
65 uint32_t trackOffset = 688;
66
67 for (int track = 0; track < geometry.numCylinders * geometry.numHeads;
68 track++)
69 {
70 headerWriter.seek(0x20 + 4 * track);
71 headerWriter.write_le32(trackOffset);
72 int side = track & 1;
73 std::vector<std::shared_ptr<const Sector>> sectors;
74 for (int sectorId = geometry.firstSector;
75 sectorId <= geometry.numSectors;
76 sectorId++)
77 {
78 const auto& sector = image.get(track >> 1, side, sectorId);
79 if (sector)
80 {
81 sectors.push_back(sector);
82 }
83 }
84 std::sort(begin(sectors),
85 end(sectors),
86 [](std::shared_ptr<const Sector> a,

Callers

nothing calls this directly

Calls 8

errorFunction · 0.85
countl_zeroFunction · 0.85
writeToMethod · 0.80
logFunction · 0.50
seekMethod · 0.45
getMethod · 0.45
push_backMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected