PDP8: Binary loader can now read multiple section tapes. Fix from Dave Gesswein to issue #74.

This commit is contained in:
Mark Pizzolato 2014-02-08 05:39:03 -08:00
parent 2934112a70
commit d7690ce060

View file

@ -191,34 +191,45 @@ t_stat sim_load_bin (FILE *fi)
{ {
int32 hi, lo, wd, csum, t; int32 hi, lo, wd, csum, t;
uint32 field, newf, origin; uint32 field, newf, origin;
int32 sections_read = 0;
csum = origin = field = newf = 0; /* init */ for (;;) {
do { /* skip leader */ csum = origin = field = newf = 0; /* init */
if ((hi = sim_bin_getc (fi, &newf)) == EOF) do { /* skip leader */
return SCPE_FMT; if ((hi = sim_bin_getc (fi, &newf)) == EOF)
} while ((hi == 0) || (hi >= 0200)); if (sections_read != 0) {
for (;;) { /* data blocks */ printf ("%d sections sucessfully read\n\r", sections_read);
if ((lo = sim_bin_getc (fi, &newf)) == EOF) /* low char */ return SCPE_OK;
return SCPE_FMT; } else
wd = (hi << 6) | lo; /* form word */ return SCPE_FMT;
t = hi; /* save for csum */ } while ((hi == 0) || (hi >= 0200));
if ((hi = sim_bin_getc (fi, &newf)) == EOF) /* next char */ for (;;) { /* data blocks */
return SCPE_FMT; if ((lo = sim_bin_getc (fi, &newf)) == EOF) /* low char */
if (hi == 0200) { /* end of tape? */ return SCPE_FMT;
if ((csum - wd) & 07777) /* valid csum? */ wd = (hi << 6) | lo; /* form word */
return SCPE_CSUM; t = hi; /* save for csum */
return SCPE_OK; if ((hi = sim_bin_getc (fi, &newf)) == EOF) /* next char */
return SCPE_FMT;
if (hi == 0200) { /* end of tape? */
if ((csum - wd) & 07777) { /* valid csum? */
if (sections_read != 0)
printf ("%d sections sucessfully read\n\r", sections_read);
return SCPE_CSUM;
}
sections_read++;
break;
}
csum = csum + t + lo; /* add to csum */
if (wd > 07777) /* chan 7 set? */
origin = wd & 07777; /* new origin */
else { /* no, data */
if ((field | origin) >= MEMSIZE)
return SCPE_NXM;
M[field | origin] = wd;
origin = (origin + 1) & 07777;
}
field = newf; /* update field */
} }
csum = csum + t + lo; /* add to csum */
if (wd > 07777) /* chan 7 set? */
origin = wd & 07777; /* new origin */
else { /* no, data */
if ((field | origin) >= MEMSIZE)
return SCPE_NXM;
M[field | origin] = wd;
origin = (origin + 1) & 07777;
}
field = newf; /* update field */
} }
return SCPE_IERR; return SCPE_IERR;
} }