diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index 5c1415f9..e9131a3d 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -49,7 +49,7 @@ static unsigned getModulationandSpeed(uint8_t flags, bool *fm) break; default: - Error() << fmt::format("don't understand IMD disks with this modulation and speed {}", flags); + Error() << fmt::format("IMD: don't understand IMD disks with this modulation and speed {}", flags); throw 0; } } @@ -63,20 +63,23 @@ struct TrackHeader uint8_t SectorSize; }; -static std::string copytostring(std::vector tocopy) -{ - std::string result; - for (int i = 0; i< tocopy.size(); i++) - { +// static std::string copytostring(std::vector tocopy) +// { +// std::string result; +// for (int i = 0; i< tocopy.size(); i++) +// { - result.push_back(tocopy[i]); - } - return result; -} +// result.push_back(tocopy[i]); +// // Logger() << "IMD DEBUG: sector map:" << fmt::format("{}", tocopy[i]); + +// } +// Logger() << "IMD DEBUG: sector map:" << fmt::format("{}", result); + +// return result; +// } static uint8_t setsectorskew(int sectornumber) {//IMD lets the sector map start with 1 so everything we read in the sectormap has to be 1 less for fluxengine - sectornumber--; switch (sectornumber) { case 0: @@ -133,8 +136,11 @@ static uint8_t setsectorskew(int sectornumber) case 17: return 'h'; break; + case 18: + return 'i'; + break; } - Error() << fmt::format("Sector skew {} not in standard range (0-17).", sectornumber); + Error() << fmt::format("IMD: Sector skew {} not in standard range (0-17).", sectornumber); } static unsigned getSectorSize(uint8_t flags) @@ -187,7 +193,7 @@ public: //Read File std::ifstream inputFile(_config.filename(), std::ios::in | std::ios::binary); if (!inputFile.is_open()) - Error() << "cannot open input file"; + Error() << "IMD: cannot open input file"; //define some variables bool fm = false; //define coding just to show in comment for setting the right write parameters inputFile.seekg(0, inputFile.end); @@ -205,15 +211,14 @@ public: unsigned Modulation_Speed = 0; unsigned sectorSize = 0; //std::string sector_skew; - std::vector sector_skew; - std::vector previous_sector_skew; - sector_skew.clear(); + std::string sector_skew; + // sector_skew.clear(); int b; std::string comment; bool blnOptionalCylinderMap = false; bool blnOptionalHeadMap = false; - + bool blnBase0 = false; // unsigned char comment[8192]; //i choose a fixed value. dont know how to make dynamic arrays in C++. This should be enough // Read comment comment.clear(); @@ -221,7 +226,8 @@ public: { comment.push_back(b); n++; - } headerPtr = n; //set pointer to after comment + } + headerPtr = n; //set pointer to after comment // comment[n] = '\0'; // null-terminate the string //write comment to screen // Logger() << fmt::format("IMD: comment: {}", comment); @@ -229,8 +235,6 @@ public: << fmt::format("{}", comment); - bool blnBaseOne = false; - for (;;) { if (headerPtr >= inputFileSize-1) @@ -279,17 +283,29 @@ public: header.Head = header.Head^SEC_HEAD_MAP_FLAG; //remove flag 01000001 ^ 01000001 = 00000001 and 01000000 ^ 0100000 = 00000000 for writing sector head later } //read sector numbering map - std::vector sector_map(header.numSectors); - sector_skew.clear(); +// std::vector sector_map(header.numSectors); + blnBase0 = false; + sector_skew.clear(); + uint8_t t_low = 1; + uint8_t t_high = 1; for (b = 0; b < header.numSectors; b++) { uint8_t t; t = br.read_8(); - headerPtr++; - sector_map[b] = b+1; //fluxengine always starts with 1?? +// Logger() << "IMD DEBUG: t:" << fmt::format(" {0:d}", t); + if (t < t_low) t_low = t; + if (t > t_high) t_high = t; +// if (t == 0) blnBase0 = true; sector_skew.push_back(setsectorskew(t)); + headerPtr++; +// sector_map[b] = b; } - auto ibm = config.mutable_encoder()->mutable_ibm(); + +// for (int i = 0; i < header.numSectors; i++) +// { +// Logger() << "IMD DEBUG: sector map:", sector_skew[1]; +// } + auto ibm = config.mutable_encoder()->mutable_ibm(); // if (!config.drive().has_rotational_period_ms()) // config.mutable_drive()->set_rotational_period_ms(200); @@ -297,8 +313,9 @@ public: auto trackdata = ibm->add_trackdata(); trackdata->set_target_clock_period_us(1e3 / Modulation_Speed); trackdata->set_target_rotational_period_ms(200); - + //trackdata->sector_range().max_sector()=t_high; trackdata->set_use_fm(fm); + //trackdata->set_allocated_sector_range(_IbmDecoderProto_TrackdataProto_SectorRangeProto_default_instance_) auto sectors = trackdata->mutable_sectors(); @@ -307,8 +324,31 @@ public: { Bytes sectordata; Bytes compressed(sectorSize); - - const auto& sector = image->put(header.track, header.Head, sector_map[s]); + unsigned int SectorID; + switch (sector_skew[s]) + { + case '0': SectorID = 0; break; + case '1': SectorID = 1; break; + case '2': SectorID = 2; break; + case '3': SectorID = 3; break; + case '4': SectorID = 4; break; + case '5': SectorID = 5; break; + case '6': SectorID = 6; break; + case '7': SectorID = 7; break; + case '8': SectorID = 8; break; + case '9': SectorID = 9; break; + case 'a': SectorID = 10; break; + case 'b': SectorID = 11; break; + case 'c': SectorID = 12; break; + case 'd': SectorID = 13; break; + case 'e': SectorID = 14; break; + case 'f': SectorID = 15; break; + case 'g': SectorID = 16; break; + case 'h': SectorID = 17; break; + case 'i': SectorID = 18; + } +// const auto& sector = image->put(header.track, header.Head, sector_map[s]); + const auto& sector = image->put(header.track, header.Head, SectorID); //read the status of the sector unsigned int Status_Sector = br.read_8(); headerPtr++; @@ -359,10 +399,16 @@ public: break; case 4: /* Compressed with "Deleted-Data address mark"*/ + compressed[0] = br.read_8(); + headerPtr++; + for (int k = 1; k < sectorSize; k++) + { + //fill data till sector is full + br.seek(headerPtr); + compressed[k] = br.read_8(); + } + sector->data.writer().append(compressed); sector->status = Sector::DATA_MISSING; - sectordata = br.read(sectorSize); - headerPtr += sectorSize; - sector->data.writer().append(sectordata); break; case 5: /* Normal data read with data error*/ @@ -373,10 +419,16 @@ public: break; case 6: /* Compressed read with data error*/ - sectordata = br.read(sectorSize); - headerPtr += sectorSize; + compressed[0] = br.read_8(); + headerPtr++; + for (int k = 1; k < sectorSize; k++) + { + //fill data till sector is full + br.seek(headerPtr); + compressed[k] = br.read_8(); + } + sector->data.writer().append(compressed); sector->status = Sector::BAD_CHECKSUM; - sector->data.writer().append(sectordata); break; case 7: /* Deleted data read with data error*/ @@ -387,14 +439,20 @@ public: break; case 8: /* Compressed, Deleted read with data error*/ - sectordata = br.read(sectorSize); - headerPtr += sectorSize; + compressed[0] = br.read_8(); + headerPtr++; + for (int k = 1; k < sectorSize; k++) + { + //fill data till sector is full + br.seek(headerPtr); + compressed[k] = br.read_8(); + } + sector->data.writer().append(compressed); sector->status = Sector::BAD_CHECKSUM; - sector->data.writer().append(sectordata); break; default: - Error() << fmt::format("Don't understand IMD files with sector status {}, track {}, sector {}", Status_Sector, header.track, s); + Error() << fmt::format("IMD: Don't understand IMD files with sector status {}, track {}, sector {}", Status_Sector, header.track, s); } if (blnOptionalCylinderMap) //there was een optional cylinder map. write it to the sector //The Sector Cylinder Map has one entry for each sector, and contains the logical Cylinder ID for the corresponding sector in the Sector Numbering Map. @@ -423,7 +481,7 @@ public: sector->logicalSide = header.Head; sector->physicalHead = header.Head; } - sector->logicalSector = (sector_map[s]); + sector->logicalSector = SectorID; } } @@ -443,7 +501,7 @@ public: << fmt::format("{} tracks, {} heads; {}; {} kbps; {} sectoren; sectorsize {}; sectormap {}; {} kB total.", header.track + 1, header.Head + 1, fm ? "FM" : "MFM", - Modulation_Speed, header.numSectors, sectorSize, copytostring(sector_skew), (header.track+1) * trackSize / 1024); + Modulation_Speed, header.numSectors, sectorSize, sector_skew, (header.track+1) * trackSize / 1024); if (!config.has_heads()) { @@ -458,6 +516,10 @@ public: tracks->set_start(0); tracks->set_end(geometry.numTracks - 1); } + if (!config.has_sector_mapping()) + { + + } return image;