H316, NOVA, PDP11, PDP8, PDP18B, KX10: Record Sequential updates consistently

Devices that do single character I/O could be attached to non seekable
host OS devices (tty, pipes, etc.) and thus shouldn't count on fseek()
and ftell().  These DEVICEs on these simulators do single character I/O
and easily can update their POS REGisters to reflect how much data has
been emitted.  Changing such a REGister will have no  useful effect
when attached to a non seekable file.
This commit is contained in:
Mark Pizzolato 2021-06-08 14:25:23 -07:00
parent 3597772a08
commit e519c93ebf
6 changed files with 9 additions and 9 deletions

View file

@ -408,7 +408,7 @@ else {
} }
else if ((uptr->flags & UNIT_ASC) && (c != 0)) /* ASCII? */ else if ((uptr->flags & UNIT_ASC) && (c != 0)) /* ASCII? */
c = c | 0200; c = c | 0200;
uptr->pos = ftell (uptr->fileref); /* update pos */ uptr->pos = uptr->pos + 1; /* update pos */
} }
SET_INT (INT_PTR); /* set ready flag */ SET_INT (INT_PTR); /* set ready flag */
uptr->buf = c & 0377; /* get byte */ uptr->buf = c & 0377; /* get byte */
@ -568,7 +568,7 @@ if (putc (c, uptr->fileref) == EOF) { /* output byte */
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = ftell (uptr->fileref); /* update pos */ uptr->pos = uptr->pos + 1; /* update pos */
return SCPE_OK; return SCPE_OK;
} }
@ -704,7 +704,7 @@ else if ((ruptr->flags & UNIT_ATT) && /* TTR attached */
} }
else if ((ruptr->flags & UNIT_ASC) && (c != 0)) else if ((ruptr->flags & UNIT_ASC) && (c != 0))
c = c | 0200; /* ASCII nz? cvt */ c = c | 0200; /* ASCII nz? cvt */
ruptr->pos = ftell (ruptr->fileref); ruptr->pos = ruptr->pos + 1;
} }
if (ttr_xoff_read != 0) { /* reader stopping? */ if (ttr_xoff_read != 0) { /* reader stopping? */
if (c == RUBOUT) /* rubout? stop */ if (c == RUBOUT) /* rubout? stop */
@ -808,7 +808,7 @@ if ((puptr->flags & UNIT_ATT) && /* TTP attached */
clearerr (puptr->fileref); clearerr (puptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
puptr->pos = ftell (puptr->fileref); /* update pos */ puptr->pos = puptr->pos + 1; /* update pos */
} }
} }
return SCPE_OK; return SCPE_OK;

View file

@ -133,12 +133,12 @@ DEV_UPDATE_INTR ;
if ((lpt_unit.flags & UNIT_ATT) == 0) /* attached? */ if ((lpt_unit.flags & UNIT_ATT) == 0) /* attached? */
return IORETURN (lpt_stopioe, SCPE_UNATT); return IORETURN (lpt_stopioe, SCPE_UNATT);
fputc (uptr->buf, uptr->fileref); fputc (uptr->buf, uptr->fileref);
uptr->pos = ftell (uptr->fileref);
if (ferror (uptr->fileref)) { if (ferror (uptr->fileref)) {
sim_perror ("LPT I/O error"); sim_perror ("LPT I/O error");
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = uptr->pos + 1;
return SCPE_OK; return SCPE_OK;
} }

View file

@ -181,12 +181,12 @@ t_stat ptp_svc (UNIT *uptr)
return SCPE_OK; return SCPE_OK;
} }
fputc (uptr->CHR, uptr->fileref); /* print char */ fputc (uptr->CHR, uptr->fileref); /* print char */
uptr->pos = ftell (uptr->fileref);
if (ferror (uptr->fileref)) { /* error? */ if (ferror (uptr->fileref)) { /* error? */
perror ("PTP I/O error"); perror ("PTP I/O error");
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = uptr->pos + 1;
return SCPE_OK; return SCPE_OK;
} }

View file

@ -163,12 +163,12 @@ if (lpt_csr & CSR_IE)
if ((uptr->flags & UNIT_ATT) == 0) if ((uptr->flags & UNIT_ATT) == 0)
return IORETURN (lpt_stopioe, SCPE_UNATT); return IORETURN (lpt_stopioe, SCPE_UNATT);
fputc (uptr->buf & 0177, uptr->fileref); fputc (uptr->buf & 0177, uptr->fileref);
uptr->pos = ftell (uptr->fileref);
if (ferror (uptr->fileref)) { if (ferror (uptr->fileref)) {
sim_perror ("LPT I/O error"); sim_perror ("LPT I/O error");
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = uptr->pos + 1;
lpt_csr = lpt_csr & ~CSR_ERR; lpt_csr = lpt_csr & ~CSR_ERR;
return SCPE_OK; return SCPE_OK;
} }

View file

@ -623,12 +623,12 @@ c = uptr->buf & 0177; /* get char */
if ((c == 0) || (c == 0177)) /* skip NULL, DEL */ if ((c == 0) || (c == 0177)) /* skip NULL, DEL */
return SCPE_OK; return SCPE_OK;
fputc (c, uptr->fileref); /* print char */ fputc (c, uptr->fileref); /* print char */
uptr->pos = ftell (uptr->fileref); /* update position */
if (ferror (uptr->fileref)) { /* error? */ if (ferror (uptr->fileref)) { /* error? */
sim_perror ("LPT I/O error"); sim_perror ("LPT I/O error");
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = uptr->pos + 1; /* update position */
return SCPE_OK; return SCPE_OK;
} }

View file

@ -149,12 +149,12 @@ if ((uptr->flags & UNIT_ATT) == 0) {
return IORETURN (lpt_stopioe, SCPE_UNATT); return IORETURN (lpt_stopioe, SCPE_UNATT);
} }
fputc (uptr->buf, uptr->fileref); /* print char */ fputc (uptr->buf, uptr->fileref); /* print char */
uptr->pos = ftell (uptr->fileref);
if (ferror (uptr->fileref)) { /* error? */ if (ferror (uptr->fileref)) { /* error? */
sim_perror ("LPT I/O error"); sim_perror ("LPT I/O error");
clearerr (uptr->fileref); clearerr (uptr->fileref);
return SCPE_IOERR; return SCPE_IOERR;
} }
uptr->pos = uptr->pos + 1;
return SCPE_OK; return SCPE_OK;
} }