From: Alan Cox Date: Thu, 19 Feb 2015 11:51:17 +0000 (+0000) Subject: blankmdv: make a blank 'disk' microdrive X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=9018134c3a8445dfc369791d91d274ab93179695;p=FUZIX.git blankmdv: make a blank 'disk' microdrive --- diff --git a/Kernel/tools/blankmdv.c b/Kernel/tools/blankmdv.c new file mode 100644 index 00000000..4911f71a --- /dev/null +++ b/Kernel/tools/blankmdv.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +static int mdv_sec = 1; + +static uint8_t mdv_csum(uint8_t *data, int len) +{ + uint32_t sum = 0; + while(len--) { + sum += *data++; + } + return sum % 0xFF; +} + + +static void mdv_write(FILE *fp, uint8_t *data, int len) +{ + if (fwrite(data, len, 1, fp) != 1) { + perror("mdv_write"); + exit(1); + } +} + +static void mdv_make_hdr(uint8_t *buf) +{ + memset(buf, 0, 14); + buf[0] = 1; + buf[1] = mdv_sec++; + memcpy(buf + 4, "FUZIX ", 10); + buf[14] = mdv_csum(buf, 14); +} + +static void mdv_make_bufhdr(uint8_t *buf, uint8_t rec, uint8_t *bits) +{ + memset(buf, 0, 14); + buf[0] = 0; + buf[1] = rec; /* Actually load page */ + buf[2] = 0; + buf[3] = 2; /* Always 512 bytes */ + strncpy(buf+4, "FUZIX ", 10); + buf[14] = mdv_csum(buf, 14); + memcpy(buf + 15, bits, 512); + buf[527] = mdv_csum(buf + 15, 512); +} + +static uint8_t blank[512]; +static uint8_t sectormap[512]; + + +static void mdv_write_tape(FILE *fp) +{ + uint8_t buf[528]; + uint8_t *bits; + int block = 1; + + + while (block < 254) { + mdv_make_hdr(buf); + mdv_write(fp, buf, 15); + if (block == 1 || block == 128) + bits = sectormap; + else + bits = blank; + mdv_make_bufhdr(buf, block, bits); + mdv_write(fp, buf, 528); + block++; + } +} + +static void mdv_make_map(void) { + int n = 2; + int i; + + memset(sectormap, 0xFF, 512); + sectormap[256] = 0xA5; + sectormap[257] = 0x5A; + + /* Logical to physical map, so start at 2 and go up missing 128 as its + a copy of this map (as is 1) */ + + for (i = 0 ; i < 252; i++) { + sectormap[i] = n++; + if (n == 128) + n++; + } +} + +void main(int argc, char *argv[]) +{ + FILE *fp; + uint8_t zero = 0; + + if (argc != 2) { + fprintf(stderr, "%s: microdrive.mdr\n", argv[0]); + exit(1); + } + + mdv_make_map(); + fp = fopen(argv[1], "w"); + if (fp == NULL) { + perror(argv[1]); + exit(1); + } + mdv_write_tape(fp); + fwrite(&zero, 1, 1, fp); + fclose(fp); + exit(0); +}