From c496d538444f2bda1d95490e61317000d07f2139 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 5 Mar 2021 08:11:07 -0800 Subject: [PATCH] PDP8: Extend LOAD logic to advise about additional loadable binary content - As discussed in #1017 - Additionally, fix binary read of rubout characters to ignore diagnostic messages --- PDP8/pdp8_sys.c | 84 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/PDP8/pdp8_sys.c b/PDP8/pdp8_sys.c index ae2eae20..24a2275f 100644 --- a/PDP8/pdp8_sys.c +++ b/PDP8/pdp8_sys.c @@ -177,50 +177,86 @@ int32 c, rubout; rubout = 0; /* clear toggle */ while ((c = getc (fi)) != EOF) { /* read char */ - if (rubout) /* toggle set? */ - rubout = 0; /* clr, skip */ - else if (c == 0377) /* rubout? */ + if (rubout) /* skipping chars */ + if (c == 0377) /* ending rubout? */ + rubout = 0; /* clr, skip */ + else + continue; /* skip charactder */ + if (c == 0377) /* rubout? */ rubout = 1; /* set, skip */ - else if (c > 0200) /* channel 8 set? */ - *newf = (c & 070) << 9; /* change field */ - else return c; /* otherwise ok */ + else + if (c > 0200) /* channel 8 set? */ + *newf = (c & 070) << 9; /* change field */ + else + return c; /* otherwise ok */ } return EOF; } -t_stat sim_load_bin (FILE *fi) +t_stat sim_load_bin (FILE *fi, t_bool do_load) { int32 hi, lo, wd, csum, t; -uint32 field, newf, origin; +uint32 field, newf, origin, words; int32 sections_read = 0; for (;;) { - csum = origin = field = newf = 0; /* init */ + csum = origin = field = newf = words = 0; /* init */ do { /* skip leader */ if ((hi = sim_bin_getc (fi, &newf)) == EOF) { - if (sections_read != 0) { - sim_printf ("%d sections sucessfully read\n\r", sections_read); - return SCPE_OK; - } + if (sections_read != 0) + return sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", + sections_read, (sections_read != 1) ? "s" : ""); else - return SCPE_FMT; + return (!do_load) ? SCPE_ARG : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); } } while ((hi == 0) || (hi >= 0200)); for (;;) { /* data blocks */ - if ((lo = sim_bin_getc (fi, &newf)) == EOF) /* low char */ - return SCPE_FMT; + if ((lo = sim_bin_getc (fi, &newf)) == EOF) { /* low char */ + if (sections_read != 0) + sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", + sections_read, (sections_read != 1) ? "s" : ""); + if (words != 0) + sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); + return (!do_load) ? SCPE_FMT : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); + } wd = (hi << 6) | lo; /* form word */ t = hi; /* save for csum */ - if ((hi = sim_bin_getc (fi, &newf)) == EOF) /* next char */ - return SCPE_FMT; + if ((hi = sim_bin_getc (fi, &newf)) == EOF) { /* next char */ + if (sections_read != 0) + sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", + sections_read, (sections_read != 1) ? "s" : ""); + if (words != 0) + sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); + return (!do_load) ? SCPE_FMT : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); + } if (hi == 0200) { /* end of tape? */ if ((csum - wd) & 07777) { /* valid csum? */ if (sections_read != 0) - sim_printf ("%d sections sucessfully read\n\r", sections_read); - return SCPE_CSUM; + sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", + sections_read, (sections_read != 1) ? "s" : ""); + if (words != 0) + sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); + return (!do_load) ? SCPE_CSUM : sim_messagef (SCPE_CSUM, "unexpected binary loader checksum\n"); } - if (!(sim_switches & SWMASK ('A'))) /* Load all sections? */ + if (!(sim_switches & SWMASK ('A'))) { /* Don't Load all sections? */ + if (do_load) { /* Loaded initial section? */ + int32 saved_switches = sim_switches; + t_stat extra; + + sim_switches |= SWMASK ('Q'); + extra = sim_load_bin (fi, FALSE); /* Check for more sections */ + sim_switches = saved_switches; + + if (extra == SCPE_OK) { + sim_messagef (SCPE_OK, "initial section loaded - more sections are available\n"); + sim_messagef (SCPE_OK, "use LOAD -A to load all sections\n");; + } + else + if (extra != SCPE_ARG) + sim_messagef (SCPE_OK, "initial section loaded - badly formatted additional binary data exists\n"); + } return SCPE_OK; + } sections_read++; break; } @@ -230,9 +266,11 @@ for (;;) { else { /* no, data */ if ((field | origin) >= MEMSIZE) return SCPE_NXM; - M[field | origin] = wd; + if (do_load) + M[field | origin] = wd; origin = (origin + 1) & 07777; } + ++words; field = newf; /* update field */ } } @@ -253,7 +291,7 @@ if (flag != 0) if ((sim_switches & SWMASK ('R')) || /* RIM format? */ (match_ext (fnam, "RIM") && !(sim_switches & SWMASK ('B')))) return sim_load_rim (fileref); -else return sim_load_bin (fileref); /* no, BIN */ +else return sim_load_bin (fileref, TRUE); /* no, BIN */ } /* Symbol tables */