remove single cached track hack; convert to EXTMEM on the Teensy 4

This commit is contained in:
Jorj Bauer 2021-01-10 07:34:57 -05:00
parent f5985c2ca6
commit 3a254f83f1
2 changed files with 9 additions and 57 deletions

View File

@ -5,14 +5,15 @@
#include "version.h" #include "version.h"
#include "fscompat.h" #include "fscompat.h"
extern uint32_t FreeRamEstimate();
// Block number we start packing data bits after (Woz 2.0 images) // Block number we start packing data bits after (Woz 2.0 images)
#define STARTBLOCK 3 #define STARTBLOCK 3
#ifdef TEENSYDUINO #ifdef TEENSYDUINO
#define SKIPCHECKSUM #define SKIPCHECKSUM
#define STATICALLOC #define malloc extmem_malloc
#define free extmem_free
#define calloc extmem_calloc
#define realloc extmem_realloc
#endif #endif
#define PREP_SECTION(fd, t) { \ #define PREP_SECTION(fd, t) { \
@ -59,18 +60,12 @@ Woz::~Woz()
fd = -1; fd = -1;
} }
#ifdef STATICALLOC
for (int i=0; i<160; i++) {
tracks[i].trackData = NULL;
}
#else
for (int i=0; i<160; i++) { for (int i=0; i<160; i++) {
if (tracks[i].trackData) { if (tracks[i].trackData) {
free(tracks[i].trackData); free(tracks[i].trackData);
tracks[i].trackData = NULL; tracks[i].trackData = NULL;
} }
} }
#endif
if (metaData) { if (metaData) {
free(metaData); free(metaData);
metaData = NULL; metaData = NULL;
@ -661,18 +656,12 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack)
// autoFlushTrackData==true (trying to limit memory use) // autoFlushTrackData==true (trying to limit memory use)
if (autoFlushTrackData == true) { if (autoFlushTrackData == true) {
flush(); flush();
#ifdef STATICALLOC
for (int i=0; i<160; i++) {
tracks[i].trackData = NULL;
}
#else
for (int i=0; i<160; i++) { for (int i=0; i<160; i++) {
if (tracks[i].trackData) { if (tracks[i].trackData) {
free(tracks[i].trackData); free(tracks[i].trackData);
tracks[i].trackData = NULL; tracks[i].trackData = NULL;
} }
} }
#endif
} }
// Based on the source image type, load the data track we're looking for // Based on the source image type, load the data track we're looking for
if (imageType == T_WOZ) { if (imageType == T_WOZ) {
@ -699,16 +688,12 @@ bool Woz::loadMissingTrackFromImage(uint8_t datatrack)
return false; return false;
} }
#ifdef STATICALLOC
tracks[datatrack].trackData = singleCachedTrack;
memset(singleCachedTrack, 0, sizeof(singleCachedTrack));
#else
tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1); tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1);
if (!tracks[datatrack].trackData) { if (!tracks[datatrack].trackData) {
fprintf(stderr, "Failed to malloc track data\n"); fprintf(stderr, "Failed to malloc track data\n");
return false; return false;
} }
#endif
tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image
tracks[datatrack].blockCount = 13; tracks[datatrack].blockCount = 13;
uint32_t sizeInBits = nibblizeTrack(tracks[datatrack].trackData, sectorData, imageType, phystrack); 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 // If the source was a NIB file, then the datatrack is directly
// mapped 1:1 to the physical track // mapped 1:1 to the physical track
uint8_t phystrack = datatrack; // used for clarity of which kind of track we mean, below 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); tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1);
if (!tracks[datatrack].trackData) { if (!tracks[datatrack].trackData) {
return false; return false;
} }
#endif
lseek(fd, NIBTRACKSIZE * phystrack, SEEK_SET); lseek(fd, NIBTRACKSIZE * phystrack, SEEK_SET);
read(fd, tracks[datatrack].trackData, NIBTRACKSIZE); read(fd, tracks[datatrack].trackData, NIBTRACKSIZE);
// FIXME: no error checking // 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) bool Woz::readDskFile(const char *filename, bool preloadTracks, uint8_t subtype)
{ {
#ifdef STATICALLOC
preloadTracks = false;
#endif
bool retval = false; bool retval = false;
autoFlushTrackData = !preloadTracks; autoFlushTrackData = !preloadTracks;
imageType = subtype; imageType = subtype;
@ -778,16 +755,12 @@ bool Woz::readDskFile(const char *filename, bool preloadTracks, uint8_t subtype)
goto done; goto done;
} }
uint8_t datatrack = quarterTrackMap[phystrack*4]; 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); tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1);
if (!tracks[datatrack].trackData) { if (!tracks[datatrack].trackData) {
fprintf(stderr, "Failed to malloc track data\n"); fprintf(stderr, "Failed to malloc track data\n");
goto done; goto done;
} }
#endif
tracks[datatrack].startingBlock = STARTBLOCK + 13*datatrack; // make it look like it came from a WOZ2 image tracks[datatrack].startingBlock = STARTBLOCK + 13*datatrack; // make it look like it came from a WOZ2 image
tracks[datatrack].blockCount = 13; tracks[datatrack].blockCount = 13;
uint32_t sizeInBits = nibblizeTrack(tracks[datatrack].trackData, sectorData, subtype, phystrack); 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) bool Woz::readNibFile(const char *filename, bool preloadTracks)
{ {
#ifdef STATICALLOC
preloadTracks = false;
#endif
autoFlushTrackData = !preloadTracks; autoFlushTrackData = !preloadTracks;
imageType = T_NIB; imageType = T_NIB;
@ -828,16 +798,12 @@ bool Woz::readNibFile(const char *filename, bool preloadTracks)
return false; return false;
} }
uint8_t datatrack = quarterTrackMap[phystrack * 4]; 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); tracks[datatrack].trackData = (uint8_t *)calloc(NIBTRACKSIZE, 1);
if (!tracks[datatrack].trackData) { if (!tracks[datatrack].trackData) {
fprintf(stderr, "Failed to malloc track data\n"); fprintf(stderr, "Failed to malloc track data\n");
return false; return false;
} }
#endif
memcpy(tracks[datatrack].trackData, nibData, NIBTRACKSIZE); memcpy(tracks[datatrack].trackData, nibData, NIBTRACKSIZE);
tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image tracks[datatrack].startingBlock = STARTBLOCK + 13*phystrack; // make it look like it came from a WOZ2 image
tracks[datatrack].blockCount = 13; tracks[datatrack].blockCount = 13;
@ -854,9 +820,6 @@ bool Woz::readNibFile(const char *filename, bool preloadTracks)
bool Woz::readWozFile(const char *filename, bool preloadTracks) bool Woz::readWozFile(const char *filename, bool preloadTracks)
{ {
#ifdef STATICALLOC
preloadTracks = false;
#endif
imageType = T_WOZ; imageType = T_WOZ;
autoFlushTrackData = !preloadTracks; 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) bool Woz::readFile(const char *filename, bool preloadTracks, uint8_t forceType)
{ {
#ifdef STATICALLOC
preloadTracks = false;
#endif
if (forceType == T_AUTO) { if (forceType == T_AUTO) {
// Try to determine type from the file extension // Try to determine type from the file extension
const char *p = strrchr(filename, '.'); const char *p = strrchr(filename, '.');
@ -1214,20 +1174,13 @@ bool Woz::readWozDataTrack(uint8_t datatrack)
if (tracks[datatrack].trackData) { if (tracks[datatrack].trackData) {
return true; // We've already read this track's data; don't re-read it 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); tracks[datatrack].trackData = (uint8_t *)calloc(count, 1);
if (!tracks[datatrack].trackData) { if (!tracks[datatrack].trackData) {
perror("Failed to alloc buf to read track magnetic data"); perror("Failed to alloc buf to read track magnetic data");
return false; return false;
} }
#endif
if (di.version == 1) { if (di.version == 1) {
if (verbose) { if (verbose) {
printf("Reading datatrack[1] %d starting at byte 0x%X\n", printf("Reading datatrack[1] %d starting at byte 0x%X\n",

View File

@ -123,7 +123,6 @@ class Woz {
uint8_t quarterTrackMap[40*4]; uint8_t quarterTrackMap[40*4];
diskInfo di; diskInfo di;
trackInfo tracks[160]; trackInfo tracks[160];
uint8_t singleCachedTrack[0x1A00];
// cursor for track enumeration // cursor for track enumeration
protected: protected: