From 3a254f83f1a3598fccb884cd4609392f0effb03e Mon Sep 17 00:00:00 2001 From: Jorj Bauer Date: Sun, 10 Jan 2021 07:34:57 -0500 Subject: [PATCH] remove single cached track hack; convert to EXTMEM on the Teensy 4 --- apple/woz.cpp | 65 +++++++-------------------------------------------- apple/woz.h | 1 - 2 files changed, 9 insertions(+), 57 deletions(-) diff --git a/apple/woz.cpp b/apple/woz.cpp index 9fa62bf..3f0b36e 100644 --- a/apple/woz.cpp +++ b/apple/woz.cpp @@ -5,14 +5,15 @@ #include "version.h" #include "fscompat.h" -extern uint32_t FreeRamEstimate(); - // Block number we start packing data bits after (Woz 2.0 images) #define STARTBLOCK 3 #ifdef TEENSYDUINO #define SKIPCHECKSUM -#define STATICALLOC +#define malloc extmem_malloc +#define free extmem_free +#define calloc extmem_calloc +#define realloc extmem_realloc #endif #define PREP_SECTION(fd, t) { \ @@ -59,18 +60,12 @@ Woz::~Woz() fd = -1; } -#ifdef STATICALLOC - for (int i=0; i<160; i++) { - tracks[i].trackData = NULL; - } -#else for (int i=0; i<160; i++) { if (tracks[i].trackData) { free(tracks[i].trackData); tracks[i].trackData = NULL; } } -#endif if (metaData) { free(metaData); metaData = NULL; @@ -661,18 +656,12 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) // autoFlushTrackData==true (trying to limit memory use) if (autoFlushTrackData == true) { flush(); -#ifdef STATICALLOC - for (int i=0; i<160; i++) { - tracks[i].trackData = NULL; - } -#else for (int i=0; i<160; i++) { if (tracks[i].trackData) { free(tracks[i].trackData); tracks[i].trackData = NULL; } } -#endif } // Based on the source image type, load the data track we're looking for if (imageType == T_WOZ) { @@ -699,16 +688,12 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) return false; } -#ifdef STATICALLOC - tracks[datatrack].trackData = singleCachedTrack; - memset(singleCachedTrack, 0, sizeof(singleCachedTrack)); -#else tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); if (!tracks[datatrack].trackData) { fprintf(stderr, "Failed to malloc track data\n"); return false; } -#endif + tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image tracks[datatrack].blockCount = 13; uint32_t sizeInBits = nibblizeTrack(tracks[datatrack].trackData, sectorData, imageType, phystrack); @@ -725,15 +710,11 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) // 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 -#ifdef STATICALLOC - tracks[datatrack].trackData = singleCachedTrack; - memset(singleCachedTrack, 0, sizeof(singleCachedTrack)); -#else tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); if (!tracks[datatrack].trackData) { return false; } -#endif + lseek(fd, NIBTRACKSIZE * phystrack, SEEK_SET); read(fd, tracks[datatrack].trackData, NIBTRACKSIZE); // FIXME: no error checking @@ -751,10 +732,6 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack) bool Woz::readDskFile(const char *filename, bool preloadTracks, uint8_t subtype) { -#ifdef STATICALLOC - preloadTracks = false; -#endif - bool retval = false; autoFlushTrackData = !preloadTracks; imageType = subtype; @@ -778,16 +755,12 @@ bool Woz::readDskFile(const char *filename, bool preloadTracks, uint8_t subtype) goto done; } uint8_t datatrack = quarterTrackMap[phystrack*4]; -#ifdef STATICALLOC - tracks[datatrack].trackData = singleCachedTrack; - memset(singleCachedTrack, 0, sizeof(singleCachedTrack)); -#else tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); if (!tracks[datatrack].trackData) { fprintf(stderr, "Failed to malloc track data\n"); goto done; } -#endif + tracks[datatrack].startingBlock = STARTBLOCK + 13*datatrack; // make it look like it came from a WOZ2 image tracks[datatrack].blockCount = 13; uint32_t sizeInBits = nibblizeTrack(tracks[datatrack].trackData, sectorData, subtype, phystrack); @@ -803,9 +776,6 @@ bool Woz::readDskFile(const char *filename, bool preloadTracks, uint8_t subtype) bool Woz::readNibFile(const char *filename, bool preloadTracks) { -#ifdef STATICALLOC - preloadTracks = false; -#endif autoFlushTrackData = !preloadTracks; imageType = T_NIB; @@ -828,16 +798,12 @@ bool Woz::readNibFile(const char *filename, bool preloadTracks) return false; } uint8_t datatrack = quarterTrackMap[phystrack * 4]; -#ifdef STATICALLOC - tracks[datatrack].trackData = singleCachedTrack; - memset(singleCachedTrack, 0, sizeof(singleCachedTrack)); -#else tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); if (!tracks[datatrack].trackData) { fprintf(stderr, "Failed to malloc track data\n"); return false; } -#endif + memcpy(tracks[datatrack].trackData, nibData, NIBTRACKSIZE); tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image tracks[datatrack].blockCount = 13; @@ -854,9 +820,6 @@ bool Woz::readNibFile(const char *filename, bool preloadTracks) bool Woz::readWozFile(const char *filename, bool preloadTracks) { -#ifdef STATICALLOC - preloadTracks = false; -#endif imageType = T_WOZ; autoFlushTrackData = !preloadTracks; @@ -1009,9 +972,6 @@ bool Woz::readWozFile(const char *filename, bool preloadTracks) bool Woz::readFile(const char *filename, bool preloadTracks, uint8_t forceType) { -#ifdef STATICALLOC - preloadTracks = false; -#endif if (forceType == T_AUTO) { // Try to determine type from the file extension const char *p = strrchr(filename, '.'); @@ -1214,20 +1174,13 @@ bool Woz::readWozDataTrack(uint8_t datatrack) if (tracks[datatrack].trackData) { return true; // We've already read this track's data; don't re-read it } -#ifdef STATICALLOC - tracks[datatrack].trackData = singleCachedTrack; - memset(singleCachedTrack, 0, sizeof(singleCachedTrack)); - if (count > sizeof(singleCachedTrack)) { - fprintf(stderr, "Want to alloc buffer than size of singleCachedTrack! About to overrun memory"); - } -#else tracks[datatrack].trackData = (uint8_t *)calloc(count, 1); if (!tracks[datatrack].trackData) { perror("Failed to alloc buf to read track magnetic data"); return false; } -#endif + if (di.version == 1) { if (verbose) { printf("Reading datatrack[1] %d starting at byte 0x%X\n", diff --git a/apple/woz.h b/apple/woz.h index 0a7608c..01e291d 100644 --- a/apple/woz.h +++ b/apple/woz.h @@ -123,7 +123,6 @@ class Woz { uint8_t quarterTrackMap[40*4]; diskInfo di; trackInfo tracks[160]; - uint8_t singleCachedTrack[0x1A00]; // cursor for track enumeration protected: