1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-02-10 02:00:41 +00:00

KA10: Fixed file overwrite error in LP, added page length support.

This commit is contained in:
Richard Cornwell
2019-08-06 21:22:15 -04:00
parent 3fd217eecc
commit 19ef021f24

View File

@@ -62,6 +62,8 @@ t_stat lpt_svc (UNIT *uptr);
t_stat lpt_reset (DEVICE *dptr);
t_stat lpt_attach (UNIT *uptr, CONST char *cptr);
t_stat lpt_detach (UNIT *uptr);
t_stat lpt_setlpp(UNIT *, int32, CONST char *, void *);
t_stat lpt_getlpp(FILE *, UNIT *, int32, CONST void *);
t_stat lpt_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag,
const char *cptr);
const char *lpt_description (DEVICE *dptr);
@@ -79,7 +81,7 @@ uint8 lpt_chbuf[5]; /* Read in Character buffers */
DIB lpt_dib = { LP_DEVNUM, 1, &lpt_devio, NULL };
UNIT lpt_unit = {
UDATA (&lpt_svc, UNIT_SEQ+UNIT_ATTABLE+UNIT_TEXT, 0), 100
UDATA (&lpt_svc, UNIT_SEQ+UNIT_ATTABLE+UNIT_TEXT, 66), 100
};
REG lpt_reg[] = {
@@ -94,6 +96,8 @@ MTAB lpt_mod[] = {
{UNIT_CT, 0, "Lower case", "LC", NULL},
{UNIT_CT, UNIT_UC, "Upper case", "UC", NULL},
{UNIT_CT, UNIT_UTF8, "UTF8 ouput", "UTF8", NULL},
{MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "LINESPERPAGE", "LINESPERPAGE",
&lpt_setlpp, &lpt_getlpp, NULL, "Number of lines per page"},
{ 0 }
};
@@ -178,7 +182,13 @@ lpt_printline(UNIT *uptr, int nl) {
lpt_buffer[uptr->POS++] = '\n';
uptr->LINE++;
}
if (uptr->LINE > (int32)uptr->capac) {
lpt_buffer[uptr->POS++] = '\f';
uptr->LINE = 0;
}
sim_fwrite(&lpt_buffer, 1, uptr->POS, uptr->fileref);
uptr->pos += uptr->POS;
uptr->COL = 0;
uptr->POS = 0;
if (ferror (uptr->fileref)) { /* error? */
@@ -305,40 +315,47 @@ t_stat lpt_svc (UNIT *uptr)
case 014: /* Form feed, skip to top of page */
lpt_printline(uptr, 0);
sim_fwrite("\014", 1, 1, uptr->fileref);
uptr->pos++;
uptr->LINE = 0;
break;
case 013: /* Vertical tab, Skip mod 20 */
lpt_printline(uptr, 1);
while((uptr->LINE % 20) != 0) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos+=2;
uptr->LINE++;
}
break;
case 020: /* Skip even lines */
case 020: /* Skip half page */
lpt_printline(uptr, 1);
while((uptr->LINE % 30) != 0) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos+=2;
uptr->LINE++;
}
break;
case 021: /* Skip even lines */
lpt_printline(uptr, 1);
while((uptr->LINE % 2) != 0) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos+=2;
uptr->LINE++;
}
break;
case 021: /* Skip third lines */
case 022: /* Skip triple lines */
lpt_printline(uptr, 1);
while((uptr->LINE % 3) != 0) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos+=2;
uptr->LINE++;
}
break;
case 022: /* Skip one line */
lpt_printline(uptr, 1);
case 023: /* Skip one line */
if (uptr->COL != 0)
lpt_printline(uptr, 1);
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->LINE+=2;
break;
case 023: /* Skip every 10 lines */
lpt_printline(uptr, 1);
while((uptr->LINE % 10) != 0) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->LINE++;
}
uptr->pos+=2;
uptr->LINE++;
break;
default: /* Ignore */
break;
@@ -388,12 +405,46 @@ t_stat lpt_detach (UNIT *uptr)
return detach_unit (uptr);
}
/*
* Line printer routines
*/
t_stat
lpt_setlpp(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
t_value i;
t_stat r;
if (cptr == NULL)
return SCPE_ARG;
if (uptr == NULL)
return SCPE_IERR;
i = get_uint (cptr, 10, 100, &r);
if (r != SCPE_OK)
return SCPE_ARG;
uptr->capac = (t_addr)i;
uptr->LINE = 0;
return SCPE_OK;
}
t_stat
lpt_getlpp(FILE *st, UNIT *uptr, int32 v, CONST void *desc)
{
if (uptr == NULL)
return SCPE_IERR;
fprintf(st, "linesperpage=%d", uptr->capac);
return SCPE_OK;
}
t_stat lpt_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
{
fprintf (st, "Line Printer (LPT)\n\n");
fprintf (st, "The line printer (LPT) writes data to a disk file. The POS register specifies\n");
fprintf (st, "the number of the next data item to be written. Thus, by changing POS, the\n");
fprintf (st, "user can backspace or advance the printer.\n");
fprintf (st, "The Line printer can be configured to any number of lines per page with the:\n");
fprintf (st, " sim> SET %s LINESPERPAGE=n\n\n", dptr->name);
fprintf (st, "The default is 66 lines per page.\n\n");
fprint_set_help (st, dptr);
fprint_show_help (st, dptr);
fprint_reg_help (st, dptr);