| 20 | DimImageReader(const ImageReaderProto& config): ImageReader(config) {} |
| 21 | |
| 22 | std::unique_ptr<Image> readImage() override |
| 23 | { |
| 24 | std::ifstream inputFile( |
| 25 | _config.filename(), std::ios::in | std::ios::binary); |
| 26 | if (!inputFile.is_open()) |
| 27 | error("cannot open input file"); |
| 28 | |
| 29 | Bytes header(256); |
| 30 | inputFile.read((char*)header.begin(), header.size()); |
| 31 | if (header.slice(0xAB, 13) != Bytes("DIFC HEADER ")) |
| 32 | error("DIM: could not find DIM header, is this a DIM file?"); |
| 33 | |
| 34 | // the DIM header technically has a bit field for sectors present, |
| 35 | // however it is currently ignored by this reader |
| 36 | |
| 37 | char mediaByte = header[0]; |
| 38 | int tracks; |
| 39 | int sectorsPerTrack; |
| 40 | int sectorSize; |
| 41 | switch (mediaByte) |
| 42 | { |
| 43 | case 0: |
| 44 | tracks = 77; |
| 45 | sectorsPerTrack = 8; |
| 46 | sectorSize = 1024; |
| 47 | break; |
| 48 | case 1: |
| 49 | tracks = 80; |
| 50 | sectorsPerTrack = 9; |
| 51 | sectorSize = 1024; |
| 52 | break; |
| 53 | case 2: |
| 54 | tracks = 80; |
| 55 | sectorsPerTrack = 15; |
| 56 | sectorSize = 512; |
| 57 | break; |
| 58 | case 3: |
| 59 | tracks = 80; |
| 60 | sectorsPerTrack = 18; |
| 61 | sectorSize = 512; |
| 62 | break; |
| 63 | default: |
| 64 | error("DIM: unsupported media byte"); |
| 65 | break; |
| 66 | } |
| 67 | |
| 68 | std::unique_ptr<Image> image(new Image); |
| 69 | int trackCount = 0; |
| 70 | for (int track = 0; track < tracks; track++) |
| 71 | { |
| 72 | if (inputFile.eof()) |
| 73 | break; |
| 74 | |
| 75 | for (int side = 0; side < 2; side++) |
| 76 | { |
| 77 | std::vector<unsigned> sectors; |
| 78 | for (int i = 0; i < sectorsPerTrack; i++) |
| 79 | sectors.push_back(i + 1); |