From 2fb6a5fe8d9897582e591fdb31456961f9668b0b Mon Sep 17 00:00:00 2001 From: Jorj Bauer Date: Thu, 21 Jan 2021 23:06:08 -0500 Subject: [PATCH] abstracting aiie-specific changes to WozSerializer --- apple/woz-serializer.cpp | 56 ++++++++++++++++++++++++++++++++++++++++ apple/woz-serializer.h | 7 +++++ apple/woz.cpp | 38 +++------------------------ apple/woz.h | 31 ++++++++++++---------- 4 files changed, 84 insertions(+), 48 deletions(-) diff --git a/apple/woz-serializer.cpp b/apple/woz-serializer.cpp index 890d3eb..4a66508 100644 --- a/apple/woz-serializer.cpp +++ b/apple/woz-serializer.cpp @@ -59,3 +59,59 @@ bool WozSerializer::Deserialize(int8_t fd) return false; } +bool WozSerializer::flush() +{ + // Flush the entire disk image if it's dirty. We could make this + // smarter later. + if (!trackDirty) + return true; + + // The fd should still be open. If it's not, then we can't flush. + if (fd == -1) + return false; + + bool ret = true; + + switch (imageType) { + case T_WOZ: + ret = writeWozFile(fd, imageType); + break; + case T_DSK: + case T_PO: + ret = writeDskFile(fd, imageType); + break; + case T_NIB: + ret = writeNibFile(fd); + break; + default: + fprintf(stderr, "Error: unknown imageType; can't flush\n"); + ret = false; + break; + } + // fsync(fd); // FIXME should not be needed + trackDirty = false; + + return true; +} + +bool WozSerializer::writeNextWozBit(uint8_t datatrack, uint8_t bit) +{ + return Woz::writeNextWozBit(datatrack, bit); +} + +bool WozSerializer::writeNextWozByte(uint8_t datatrack, uint8_t b) +{ + return Woz::writeNextWozByte(datatrack, b); +} + +uint8_t WozSerializer::nextDiskBit(uint8_t datatrack) +{ + return Woz::nextDiskBit(datatrack); +} + +uint8_t WozSerializer::nextDiskByte(uint8_t datatrack) +{ + return Woz::nextDiskByte(datatrack); +} + + diff --git a/apple/woz-serializer.h b/apple/woz-serializer.h index bd4d2de..9964613 100644 --- a/apple/woz-serializer.h +++ b/apple/woz-serializer.h @@ -10,6 +10,13 @@ public: public: bool Serialize(int8_t fd); bool Deserialize(int8_t fd); + + virtual bool flush(); + + virtual bool writeNextWozBit(uint8_t datatrack, uint8_t bit); + virtual bool writeNextWozByte(uint8_t datatrack, uint8_t b); + virtual uint8_t nextDiskBit(uint8_t datatrack); + virtual uint8_t nextDiskByte(uint8_t datatrack); }; diff --git a/apple/woz.cpp b/apple/woz.cpp index a8a0d8a..8ec4d9c 100644 --- a/apple/woz.cpp +++ b/apple/woz.cpp @@ -85,18 +85,18 @@ bool Woz::writeNextWozBit(uint8_t datatrack, uint8_t bit) return false; } - if (trackByteFromDataTrack != datatrack) { + // if (trackByteFromDataTrack != datatrack) { // FIXME what if trackPointer is out of bounds for this track trackByte = tracks[datatrack].trackData[trackPointer]; trackByteFromDataTrack = datatrack; - } + // } if (bit) trackByte |= trackBitIdx; else trackByte &= ~trackBitIdx; - tracks[datatrack].trackData[trackPointer-1] = trackByte; + tracks[datatrack].trackData[trackPointer] = trackByte; advanceBitStream(datatrack); trackDirty = true; @@ -1603,35 +1603,5 @@ uint8_t Woz::dataTrackNumberForQuarterTrack(uint16_t qt) bool Woz::flush() { - // Flush the entire disk image if it's dirty. We could make this - // smarter later. - if (!trackDirty) - return true; - - // The fd should still be open. If it's not, then we can't flush. - if (fd == -1) - return false; - - bool ret = true; - - switch (imageType) { - case T_WOZ: - ret = writeWozFile(fd, imageType); - break; - case T_DSK: - case T_PO: - ret = writeDskFile(fd, imageType); - break; - case T_NIB: - ret = writeNibFile(fd); - break; - default: - fprintf(stderr, "Error: unknown imageType; can't flush\n"); - ret = false; - break; - } - // fsync(fd); // FIXME should not be needed - trackDirty = false; - - return true; + return false; } diff --git a/apple/woz.h b/apple/woz.h index 4858657..759578b 100644 --- a/apple/woz.h +++ b/apple/woz.h @@ -41,7 +41,11 @@ typedef struct _trackInfo { uint8_t *trackData; } trackInfo; +class WozSerializer; + class Woz { + friend class WozSerializer; + public: Woz(bool verbose, uint8_t dumpflags); ~Woz(); @@ -57,17 +61,23 @@ class Woz { uint8_t dataTrackNumberForQuarterTrack(uint16_t qt); - bool flush(); + virtual bool flush(); void debug(); - //protected: +protected: // Interface for AiiE - bool writeNextWozBit(uint8_t datatrack, uint8_t bit); - bool writeNextWozByte(uint8_t datatrack, uint8_t b); - uint8_t nextDiskBit(uint8_t datatrack); - uint8_t nextDiskByte(uint8_t datatrack); - bool skipByte(uint8_t datatrack); + virtual bool writeNextWozBit(uint8_t datatrack, uint8_t bit); + virtual bool writeNextWozByte(uint8_t datatrack, uint8_t b); + virtual uint8_t nextDiskBit(uint8_t datatrack); + virtual uint8_t nextDiskByte(uint8_t datatrack); + + bool writeWozFile(const char *filename, uint8_t subtype); + bool writeWozFile(int fd, uint8_t subtype); + bool writeDskFile(const char *filename, uint8_t subtype); + bool writeDskFile(int fd, uint8_t subtype); + bool writeNibFile(const char *filename); + bool writeNibFile(int fd); private: void loadTrackByte(uint8_t datatrack); @@ -80,13 +90,6 @@ class Woz { bool decodeWozTrackToNibFromDataTrack(uint8_t datatrack, nibSector sectorData[16]); bool decodeWozTrackToDsk(uint8_t phystrack, uint8_t subtype, uint8_t sectorData[256*16]); - bool writeWozFile(const char *filename, uint8_t subtype); - bool writeWozFile(int fd, uint8_t subtype); - bool writeDskFile(const char *filename, uint8_t subtype); - bool writeDskFile(int fd, uint8_t subtype); - bool writeNibFile(const char *filename); - bool writeNibFile(int fd); - bool writeWozTrack(int fd, uint8_t trackToWrite, uint8_t imageType); bool writeDskTrack(int fd, uint8_t trackToWrite, uint8_t imageType); bool writeNibTrack(int fd, uint8_t trackToWrite, uint8_t imageType);