From d5ecb005e4b71786e63f03cb819a358b6bf0219c Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 20 Mar 2022 17:25:39 -0700 Subject: Support loading RIMs and multi-word lines via the UART loader. --- tool/p8bin2uart.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'tool') diff --git a/tool/p8bin2uart.c b/tool/p8bin2uart.c index 0eec14e..14cb207 100644 --- a/tool/p8bin2uart.c +++ b/tool/p8bin2uart.c @@ -47,6 +47,8 @@ uint16_t mem[32768]; int load(FILE *fp) { + bool binfile = false; + bool sawdata = false; enum { Addr, Data, Leader, Fetch, Skip , Start } s = Start; int c = 0, n, v = 0; uint16_t a = 0, d = 0, t = 0, u = 0; @@ -66,7 +68,7 @@ load(FILE *fp) fetch: if (c == 0200) { if ((d & 0x8000) != 0) { - if ((d & 07777) != (t & 07777)) + if (binfile && (d & 07777) != (t & 07777)) fprintf(stderr, "\nbad checksum %05o\n", t & 07777); else v = 1; @@ -77,6 +79,8 @@ load(FILE *fp) u = 0; if (d & 0x8000) { mem[a] = d & 07777; + binfile |= sawdata; + sawdata = true; a = (a & ~07777) | ((a + 1) & 07777); d = 0; } @@ -89,6 +93,7 @@ load(FILE *fp) if ((c & 0300) == 0100) { u = c; a = (a & ~07777) | (c & 077) << 6; + sawdata = false; s = Addr; break; } @@ -197,8 +202,8 @@ dump(unsigned int wordsperline) int main(int argc, char *argv[]) { - if (argc != 3) { - fprintf(stderr, "usage: p8 wordsperline filename.bin\n"); + if (argc < 3) { + fprintf(stderr, "usage: p8 wordsperline filename.bin|rim [... filename.bin|rim]\n"); exit(EXIT_FAILURE); } char *end; @@ -207,14 +212,17 @@ main(int argc, char *argv[]) perror(argv[1]); exit(EXIT_FAILURE); } - FILE *fp = fopen(argv[2], "rb"); - if (!fp) { - perror(argv[2]); - exit(EXIT_FAILURE); + for (int i = 2; i < argc; ++i) { + fprintf(stderr, "Loading %s...\n", argv[i]); + FILE *fp = fopen(argv[i], "rb"); + if (!fp) { + perror(argv[i]); + exit(EXIT_FAILURE); + } + if (!load(fp)) + exit(EXIT_FAILURE); + fclose(fp); } - if (!load(fp)) - exit(EXIT_FAILURE); - fclose(fp); dump(wordsperline); exit(EXIT_SUCCESS); } -- cgit v1.2.3