30 [[nodiscard]]
static bool isValidDmkHeader(
const DmkHeader& header)
36 if (trackLen >= 0x4000)
return false;
37 if (trackLen <= 128)
return false;
38 if (header.
flags & ~0xd0)
return false;
45 , file(std::move(file_))
49 file->read(&header,
sizeof(header));
50 if (!isValidDmkHeader(header)) {
65 void DMKDiskImage::seekTrack(
byte track,
byte side)
67 unsigned t = singleSided ? track : (2 * track + side);
68 file->seek(
sizeof(
DmkHeader) +
t * (dmkTrackLen + 128));
74 output.
clear(dmkTrackLen);
75 if ((singleSided && side) || (track >= numTracks)) {
80 seekTrack(track, side);
84 file->read(idamBuf,
sizeof(idamBuf));
91 for (
auto i :
xrange(64)) {
92 unsigned idx = idamBuf[2 * i + 0] + 256 * idamBuf[2 * i + 1];
106 if (idx >= dmkTrackLen) {
111 if (
int(idx) <= lastIdam) {
125 if (singleSided && (side != 0)) {
131 extendImageToTrack(track);
133 doWriteTrack(track, side, input);
136 void DMKDiskImage::doWriteTrack(
byte track,
byte side,
const RawTrack& input)
138 seekTrack(track, side);
141 byte idamOut[2 * 64] = {};
145 idamOut[2 * i + 0] =
t & 0xff;
146 idamOut[2 * i + 1] =
t >> 8;
148 file->write(idamOut,
sizeof(idamOut));
151 assert(input.
getLength() == dmkTrackLen);
155 void DMKDiskImage::extendImageToTrack(
byte track)
159 byte numSides = singleSided ? 1 : 2;
160 while (numTracks <= track) {
161 for (
auto side :
xrange(numSides)) {
162 doWriteTrack(numTracks, side, emptyTrack);
169 byte numTracksByte = numTracks;
170 file->write(&numTracksByte,
sizeof(numTracksByte));
176 auto [track, side, sector] =
logToPhys(logicalSector);
191 auto [track, side, sector] =
logToPhys(logicalSector);
207 unsigned t = singleSided ? numTracks : (2 * numTracks);
213 return writeProtected || file->isReadOnly();
221 void DMKDiskImage::detectGeometryFallback()
void writeTrackImpl(byte track, byte side, const RawTrack &input) override
DMKDiskImage(Filename filename, std::shared_ptr< File > file)
Sha1Sum getSha1SumImpl(FilePool &filepool) override
void readSectorImpl(size_t sector, SectorBuffer &buf) override
bool isWriteProtectedImpl() const override
void writeSectorImpl(size_t sector, const SectorBuffer &buf) override
size_t getNbSectorsImpl() const override
void readTrack(byte track, byte side, RawTrack &output) override
Read a full track from this disk image.
void writeTrack(byte track, byte side, const RawTrack &input)
Replace a full track in this image with the given track.
unsigned getSectorsPerTrack()
void setNbSides(unsigned num)
void setSectorsPerTrack(unsigned num)
TSS logToPhys(size_t log)
Sha1Sum getSha1Sum(File &file)
Calculate sha1sum for the given File object.
This class represents a filename.
std::optional< Sector > decodeSector(byte sectorNum) const
Get a sector with a specific number.
void addIdam(unsigned idx)
const auto & getIdamBuffer() const
void readBlock(int idx, span< byte > destination) const
Like memcpy() but copy from/to circular buffer.
void clear(unsigned size)
Clear track data.
unsigned getLength() const
Get track length.
void writeBlock(int idx, span< const byte > source)
This class represents the result of a sha1 calculation (a 160-bit value).
constexpr vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
This file implemented 3 utility functions:
constexpr unsigned IDAM_FLAGS_MASK
constexpr unsigned FLAG_MFM_SECTOR
constexpr byte FLAG_SINGLE_SIDED
constexpr const char *const filename
bool all_of(InputRange &&range, UnaryPredicate pred)
constexpr auto xrange(T e)