diff --git a/apple/diskii.cpp b/apple/diskii.cpp index eb3515d..d80f338 100644 --- a/apple/diskii.cpp +++ b/apple/diskii.cpp @@ -49,8 +49,6 @@ DiskII::~DiskII() bool DiskII::Serialize(int8_t fd) { - return false; - g_filemanager->writeByte(fd, DISKIIMAGIC); g_filemanager->writeByte(fd, readWriteLatch); @@ -110,11 +108,18 @@ bool DiskII::Serialize(int8_t fd) if (disk[i]) { g_filemanager->writeByte(fd, 1); + // FIXME: this ONLY works for builds using the filemanager to read + // the disk image, so it's broken until we port Woz to do that! + const char *fn = disk[i]->diskName(); + for (int j=0; jwriteByte(fd, fn[j]); + } + g_filemanager->writeByte(fd, 0); + if (!disk[i]->Serialize(fd)) + return false; } else { g_filemanager->writeByte(fd, 0); } - if (!disk[i]->Serialize(fd)) - return false; } g_filemanager->writeByte(fd, DISKIIMAGIC); @@ -167,6 +172,24 @@ bool DiskII::Deserialize(int8_t fd) delete disk[i]; if (g_filemanager->readByte(fd) == 1) { disk[i] = new WozSerializer(); + char buf[MAXPATH]; + char c; + int ptr = 0; + while ( (c = g_filemanager->readByte(fd) != 0) ) { + buf[ptr++] = c; + } + buf[ptr] = 0; + if (buf[0]) { +#ifdef TEENSYDUINO + disk[i]->readFile(buf, false, T_AUTO); // FIXME error checking +#else + disk[i]->readFile(buf, true, T_AUTO); // FIXME error checking +#endif + } else { + // ERROR: there's a disk but we don't have the path to its image? + return false; + } + if (!disk[i]->Deserialize(fd)) return false; } else { diff --git a/apple/woz-serializer.cpp b/apple/woz-serializer.cpp index 19eaa33..e5c15bc 100644 --- a/apple/woz-serializer.cpp +++ b/apple/woz-serializer.cpp @@ -1,18 +1,76 @@ #include "woz-serializer.h" +#include "globals.h" + +#define WOZMAGIC 0xD5 WozSerializer::WozSerializer() : Woz(0,0) { } +const char *WozSerializer::diskName() +{ + if (fd != -1) { + return g_filemanager->fileName(fd); + } + return ""; +} + bool WozSerializer::Serialize(int8_t fd) { - // *** - return false; + // FIXME: if trackDirty is set, we MUST flush first before exiting! + + g_filemanager->writeByte(fd, WOZMAGIC); + + // We need the internal state about data but not much else + g_filemanager->writeByte(fd, + (trackPointer >> 24) & 0xFF); + g_filemanager->writeByte(fd, + (trackPointer >> 16) & 0xFF); + g_filemanager->writeByte(fd, + (trackPointer >> 8) & 0xFF); + g_filemanager->writeByte(fd, + (trackPointer ) & 0xFF); + + g_filemanager->writeByte(fd, + (trackBitCounter >> 24) & 0xFF); + g_filemanager->writeByte(fd, + (trackBitCounter >> 16) & 0xFF); + g_filemanager->writeByte(fd, + (trackBitCounter >> 8) & 0xFF); + g_filemanager->writeByte(fd, + (trackBitCounter ) & 0xFF); + + g_filemanager->writeByte(fd, trackByte); + g_filemanager->writeByte(fd, trackBitIdx); + g_filemanager->writeByte(fd, trackLoopCounter); + + g_filemanager->writeByte(fd, WOZMAGIC); + return true; } bool WozSerializer::Deserialize(int8_t fd) { - // *** - return false; + // Before deserializing, the caller has to re-load the right disk image! + if (g_filemanager->readByte(fd) != WOZMAGIC) + return false; + + trackPointer = g_filemanager->readByte(fd); + trackPointer <<= 8; trackPointer |= g_filemanager->readByte(fd); + trackPointer <<= 8; trackPointer |= g_filemanager->readByte(fd); + trackPointer <<= 8; trackPointer |= g_filemanager->readByte(fd); + + trackBitCounter = g_filemanager->readByte(fd); + trackBitCounter <<= 8; trackBitCounter |= g_filemanager->readByte(fd); + trackBitCounter <<= 8; trackBitCounter |= g_filemanager->readByte(fd); + trackBitCounter <<= 8; trackBitCounter |= g_filemanager->readByte(fd); + + trackByte = g_filemanager->readByte(fd); + trackBitIdx = g_filemanager->readByte(fd); + trackLoopCounter = g_filemanager->readByte(fd); + + if (g_filemanager->readByte(fd) != WOZMAGIC) + return false; + + return true; } diff --git a/apple/woz-serializer.h b/apple/woz-serializer.h index 21c85af..bd4d2de 100644 --- a/apple/woz-serializer.h +++ b/apple/woz-serializer.h @@ -5,6 +5,7 @@ class WozSerializer: public virtual Woz { public: WozSerializer(); + const char *diskName(); public: bool Serialize(int8_t fd); diff --git a/apple/woz.h b/apple/woz.h index 5f937e0..edc2276 100644 --- a/apple/woz.h +++ b/apple/woz.h @@ -100,7 +100,6 @@ class Woz { void _initInfo(); private: - int fd; uint8_t imageType; bool verbose; @@ -114,11 +113,15 @@ class Woz { trackInfo tracks[160]; // cursor for track enumeration +protected: + int fd; + uint32_t trackPointer; uint32_t trackBitCounter; uint8_t trackByte; uint8_t trackBitIdx; uint8_t trackLoopCounter; +private: char *metaData; uint8_t randData, randPtr; };