diff --git a/apple/woz.cpp b/apple/woz.cpp index 722436d..db21947 100644 --- a/apple/woz.cpp +++ b/apple/woz.cpp @@ -7,9 +7,15 @@ #include "fscompat.h" #endif +extern uint32_t FreeRamEstimate(); + // Block number we start packing data bits after (Woz 2.0 images) #define STARTBLOCK 3 +#ifdef TEENSYDUINO +#define SKIPCHECKSUM +#endif + #define PREP_SECTION(fd, t) { \ uint32_t type = t; \ if (!write32(fd, type)) \ @@ -204,13 +210,6 @@ bool Woz::skipByte(uint8_t datatrack) uint8_t Woz::nextDiskBit(uint8_t datatrack) { - if (!tracks[datatrack].trackData) { - loadMissingTrackFromImage(datatrack); - } - - if (!tracks[datatrack].trackData) - return 0; - static uint8_t head_window = 0; head_window <<= 1; head_window |= getNextWozBit(datatrack); @@ -266,8 +265,9 @@ static bool write32(int fd, uint32_t v) static bool read8(int fd, uint8_t *toWhere) { uint8_t r; - if (read(fd, &r, 1) != 1) + if (read(fd, &r, 1) != 1) { return false; + } *toWhere = r; return true; @@ -303,7 +303,6 @@ static bool read32(int fd, uint32_t *toWhere) } *toWhere = ret; - return true; } @@ -435,7 +434,9 @@ bool Woz::writeWozFile(int fdout, uint8_t subtype) // FIXME: missing the WRIT chunk, if it exists - // Fix up the checksum + // Fix up the checksum. Optional; the spec says it can be 0 meaning + // "don't verify" +#ifndef SKIPCHECKSUM endPos = lseek(fdout, 0, SEEK_CUR); crcDataSize = endPos-crcPos-4; crcData = (uint8_t *)malloc(crcDataSize); @@ -458,12 +459,14 @@ bool Woz::writeWozFile(int fdout, uint8_t subtype) tmp32 = compute_crc_32(crcData, crcDataSize); // Write it back out + lseek(fdout, crcPos, SEEK_SET); if (!write32(fdout, tmp32)) { fprintf(stderr, "ERROR: failed to write CRC\n"); goto done; } - +#endif + retval = true; done: @@ -479,9 +482,24 @@ bool Woz::writeWozTrack(int fdout, uint8_t trackToWrite, uint8_t imageType) if (imageType != T_WOZ) return false; - printf("writeWozTrack not implemented yet\n"); - // FIXME: not implemented - return false; + if (di.version != 2) { + fprintf(stderr, "Don't know how to write this version of WOZ file\n"); + return false; + } + + uint32_t count = tracks[trackToWrite].blockCount * 512; + + if (lseek(fd, tracks[trackToWrite].startingBlock*512, SEEK_SET) != tracks[trackToWrite].startingBlock*512) { + perror("Failed to seek to start of block"); + return false; + } + + if (write(fd, tracks[trackToWrite].trackData, count) != count) { + perror("write"); + return false; + } + + return true; } @@ -532,12 +550,10 @@ bool Woz::writeDskTrack(int fdout, uint8_t trackToWrite, uint8_t imageType) return false; } if (!decodeWozTrackToDsk(trackToWrite, imageType, sectorData)) { - printf("failed to decode to dsk\n"); return false; } if (write(fdout, sectorData, 256*16) != 256*16) { - printf("write failed\n"); return false; } @@ -654,7 +670,7 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) // from the physical track if (datatrack >= 35) { // There are only 35 tracks; the remainder are blank. - tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); + tracks[datatrack].trackData = NULL; return true; } @@ -684,15 +700,14 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) else if (imageType == T_NIB) { if (datatrack >= 35) { // There are only 35 tracks; the remainder are blank. - tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); + tracks[datatrack].trackData = NULL; return true; } // If the source was a NIB file, then the datatrack is directly // mapped 1:1 to the physical track uint8_t phystrack = datatrack; // used for clarity of which kind of track we mean, below - tracks[datatrack].trackData = (uint8_t *)malloc(NIBTRACKSIZE); + tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); if (!tracks[datatrack].trackData) { - printf("Failed to malloc track data\n"); return false; } @@ -809,7 +824,7 @@ bool Woz::readWozFile(const char *filename, bool preloadTracks) perror("Unable to open input file"); return false; } - + // Header uint32_t h; read32(fd, &h); @@ -1157,6 +1172,7 @@ bool Woz::readWozDataTrack(uint8_t datatrack) tracks[datatrack].trackData = (uint8_t *)calloc(count, 1); if (!tracks[datatrack].trackData) { perror("Failed to alloc buf to read track magnetic data"); + return false; } @@ -1238,7 +1254,6 @@ bool Woz::readNibSectorData(uint8_t phystrack, uint8_t sector, nibSector *sector sectorData->sectorEpilog[2] == 0xeb) { // Header is integral. See if it's our sector: uint8_t sectorNum = de44(sectorData->sector44); - printf("Denib: found track/sector %d/%d\n", de44(sectorData->track44), sectorNum); if (sectorNum != sector) { continue; } @@ -1273,16 +1288,6 @@ bool Woz::readNibSectorData(uint8_t phystrack, uint8_t sector, nibSector *sector } } - /* Debugging: dump the track, b/c we failed to find a sector */ - printf("Broken NIB track:\n"); - printf("@d=("); - for (int i=0; i