mirror of
https://github.com/JorjBauer/aiie.git
synced 2025-02-10 21:30:49 +00:00
remove single cached track hack; convert to EXTMEM on the Teensy 4
This commit is contained in:
parent
03da365e61
commit
4bbb8052aa
@ -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",
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user