|
|
@@ -41,7 +41,6 @@ |
|
|
|
#define FS_ADDR_PORT 0x02 |
|
|
|
|
|
|
|
static uint8_t fsdev[MAX_FSDEV_SIZE] = {0}; |
|
|
|
static uint32_t fsdev_size = 0; |
|
|
|
static uint32_t fsdev_ptr = 0; |
|
|
|
// 0 = idle, 1 = received MSB (of 24bit addr), 2 = received middle addr |
|
|
|
static int fsdev_addr_lvl = 0; |
|
|
@@ -62,16 +61,13 @@ static uint8_t iord_fsdata() |
|
|
|
fprintf(stderr, "Reading FSDEV in the middle of an addr op (%d)\n", fsdev_ptr); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
if (fsdev_ptr < fsdev_size) { |
|
|
|
if (fsdev_ptr < MAX_FSDEV_SIZE) { |
|
|
|
#ifdef DEBUG |
|
|
|
fprintf(stderr, "Reading FSDEV at offset %d\n", fsdev_ptr); |
|
|
|
#endif |
|
|
|
return fsdev[fsdev_ptr]; |
|
|
|
} else { |
|
|
|
// don't warn when ==, we're not out of bounds, just at the edge. |
|
|
|
if (fsdev_ptr > fsdev_size) { |
|
|
|
fprintf(stderr, "Out of bounds FSDEV read at %d\n", fsdev_ptr); |
|
|
|
} |
|
|
|
fprintf(stderr, "Out of bounds FSDEV read at %d\n", fsdev_ptr); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
@@ -80,11 +76,9 @@ static uint8_t iord_fsaddr() |
|
|
|
{ |
|
|
|
if (fsdev_addr_lvl != 0) { |
|
|
|
return 3; |
|
|
|
} else if (fsdev_ptr > fsdev_size) { |
|
|
|
fprintf(stderr, "Out of bounds FSDEV addr request at %d / %d\n", fsdev_ptr, fsdev_size); |
|
|
|
} else if (fsdev_ptr >= MAX_FSDEV_SIZE) { |
|
|
|
fprintf(stderr, "Out of bounds FSDEV addr request at %d / %d\n", fsdev_ptr, MAX_FSDEV_SIZE); |
|
|
|
return 2; |
|
|
|
} else if (fsdev_ptr == fsdev_size) { |
|
|
|
return 1; |
|
|
|
} else { |
|
|
|
return 0; |
|
|
|
} |
|
|
@@ -105,18 +99,11 @@ static void iowr_fsdata(uint8_t val) |
|
|
|
fprintf(stderr, "Writing to FSDEV in the middle of an addr op (%d)\n", fsdev_ptr); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (fsdev_ptr < fsdev_size) { |
|
|
|
if (fsdev_ptr < MAX_FSDEV_SIZE) { |
|
|
|
#ifdef DEBUG |
|
|
|
fprintf(stderr, "Writing to FSDEV (%d)\n", fsdev_ptr); |
|
|
|
#endif |
|
|
|
fsdev[fsdev_ptr] = val; |
|
|
|
} else if ((fsdev_ptr == fsdev_size) && (fsdev_ptr < MAX_FSDEV_SIZE)) { |
|
|
|
// We're at the end of fsdev, grow it |
|
|
|
fsdev[fsdev_ptr] = val; |
|
|
|
fsdev_size++; |
|
|
|
#ifdef DEBUG |
|
|
|
fprintf(stderr, "Growing FSDEV (%d)\n", fsdev_ptr); |
|
|
|
#endif |
|
|
|
} else { |
|
|
|
fprintf(stderr, "Out of bounds FSDEV write at %d\n", fsdev_ptr); |
|
|
|
} |
|
|
@@ -167,13 +154,14 @@ int main(int argc, char *argv[]) |
|
|
|
if (fp != NULL) { |
|
|
|
fprintf(stderr, "Initializing filesystem\n"); |
|
|
|
int i = 0; |
|
|
|
int c = fgetc(fp); |
|
|
|
while (c != EOF) { |
|
|
|
fsdev[i] = c & 0xff; |
|
|
|
i++; |
|
|
|
c = fgetc(fp); |
|
|
|
int c; |
|
|
|
while ((c = fgetc(fp)) != EOF && i < MAX_FSDEV_SIZE) { |
|
|
|
fsdev[i++] = c & 0xff; |
|
|
|
} |
|
|
|
if (i == MAX_FSDEV_SIZE) { |
|
|
|
fprintf(stderr, "Filesytem image too large.\n"); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
fsdev_size = i; |
|
|
|
pclose(fp); |
|
|
|
} |
|
|
|
|
|
|
|