I7000: Updated general card reader, printer and magtape

Card reader handle EOF correctly.
         Line printer proper handling of paging.
         Magtape clean up debug message.
         Update 7010, 7070, 7080 for EOF handling.
This commit is contained in:
Richard Cornwell 2024-05-19 14:15:48 -04:00 committed by Paul Koning
parent fdbf79145a
commit 9515201238
9 changed files with 101 additions and 47 deletions

View file

@ -461,12 +461,10 @@ cdp_get_input(FILE *st, UNIT *uptr, int32 v, CONST void *desc)
{
int u = (uptr - cdp_unit);
UNIT *iuptr = &cdp_input_unit[u];
int i;
if (uptr == NULL)
return SCPE_IERR;
i = (iuptr->flags & INPUT_MASK) >> INPUT_V;
switch((iuptr->flags & INPUT_MASK) >> INPUT_V) {
case INPUT_BLANK >> INPUT_V:
fprintf(st, "%d blanks", iuptr->u3);

View file

@ -122,8 +122,13 @@ uint32 cdr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
uptr->u5 &= ~0xF0000;
uptr->u5 |= stk << 16;
#endif
if (uptr->u5 & (URCSTA_EOF|URCSTA_ERR)) {
uptr->u5 &= ~(URCSTA_EOF|URCSTA_ERR);
if (uptr->u5 & (URCSTA_EOF)) {
uptr->u5 &= ~(URCSTA_EOF);
return SCPE_EOF;
}
if (uptr->u5 & (URCSTA_ERR)) {
uptr->u5 &= ~(URCSTA_ERR);
return SCPE_IOERR;
}
@ -151,11 +156,12 @@ uint32 cdr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
/* If at eof, just return EOF */
if (sim_card_eof(uptr)) {
uint16 *image = (uint16 *)(uptr->up7);
sim_debug(DEBUG_DETAIL, &cdr_dev, "%d: EOF\n", u);
chan_set_eof(chan);
chan_set_attn(chan);
uptr->u5 &= ~(URCSTA_EOF|URCSTA_ERR);
(void)sim_read_card(uptr, image);
return SCPE_IOERR;
return SCPE_EOF;
}
uptr->u5 |= URCSTA_READ;

View file

@ -135,7 +135,7 @@ lpr_setlpp(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
if (i < 20 || i > 100)
return SCPE_ARG;
uptr->u6 = i;
uptr->u4 = 0;
uptr->u4 = 1;
return SCPE_OK;
}
@ -231,7 +231,9 @@ print_line(UNIT * uptr, int chan, int unit)
sim_putchar(out[j++]);
}
uptr->u4++;
if (uptr->u4 > (int32)uptr->u6) {
if (uptr->u4 >= (int32)uptr->u6) {
sim_fwrite("\f", 1, 1, uptr->fileref);
uptr->pos += 1;
uptr->u4 = 1;
}
@ -241,6 +243,7 @@ print_line(UNIT * uptr, int chan, int unit)
if (uptr->flags & UNIT_ATT) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos += 2;
uptr->u4++;
}
if (uptr->flags & ECHO)
sim_putchar('\r');
@ -255,18 +258,22 @@ print_line(UNIT * uptr, int chan, int unit)
sim_putchar('\n');
}
uptr->u4++;
if (uptr->u4 > (int32)uptr->u6) {
uptr->u4 = 1;
if (uptr->u4 >= (int32)uptr->u6) {
i = 0;
}
}
}
if (uptr->u4 >= (int32)uptr->u6) {
sim_fwrite("\f", 1, 1, uptr->fileref);
uptr->u4 = 1;
}
uptr->u5 &= ~(URCSTA_SKIPAFT|(0x7f << 12));
}
if (uptr->u4 == 1)
lpr_chan9[chan] = 1;
#ifdef I7010
if (uptr->u4 == uptr->u6)
if (uptr->u4 >= uptr->u6)
lpr_chan12[chan] = 1;
#endif
@ -356,7 +363,10 @@ uint32 lpr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
case 1:
case 9: if (uptr->u4 == 1)
break;
i = uptr->u6 - uptr->u4 + 1; break;
i = uptr->u6 - uptr->u4 + 1;
sim_debug(DEBUG_DATA, &lpr_dev, "%d: Feed %d %d %d\n", u,
uptr->u6, uptr->u4, i);
break;
case 12: i = (uptr->u6/2) - uptr->u4; break;
}
if (i == 0)
@ -369,12 +379,20 @@ uint32 lpr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
if (uptr->flags & UNIT_ATT) {
sim_fwrite("\r\n", 1, 2, uptr->fileref);
uptr->pos += 2;
uptr->u4++;
if (uptr->u4 >= (int32)uptr->u6) {
i = 0;
}
}
if (uptr->flags & ECHO) {
sim_putchar('\r');
sim_putchar('\n');
}
}
if (uptr->u4 >= (int32)uptr->u6) {
sim_fwrite("\f", 1, 1, uptr->fileref);
uptr->u4 = 1;
}
break;
}
if (uptr->u4 == uptr->u6)
@ -468,6 +486,10 @@ lpr_srv(UNIT *uptr) {
void
lpr_ini(UNIT *uptr, t_bool f) {
if (uptr->u6 == 0) {
uptr->u6 = 55;
}
uptr->u4 = 1;
}
t_stat
@ -479,7 +501,7 @@ lpr_attach(UNIT * uptr, CONST char *file)
if ((r = attach_unit(uptr, file)) != SCPE_OK)
return r;
uptr->u5 = 0;
uptr->u4 = 0;
uptr->u4 = 1;
return SCPE_OK;
}

View file

@ -905,7 +905,7 @@ t_stat mt_srv(UNIT * uptr)
/* Do BCD translation */
if ((parity_table[ch & 077] ^ (ch & 0100) ^ mode) == 0) {
sim_debug(DEBUG_DETAIL, dptr, "%s parity error %d %03o\n",
(cmd == MT_RDS) ? "BCD" : "Binary", uptr->u3-1, ch);
(cmd == MT_RDS) ? "BCD" : "Binary", uptr->u6-1, ch);
#ifdef I7010
if (astmode)
ch = 054;

View file

@ -409,10 +409,6 @@ void WriteP(uint32 MA, uint8 v) {
if (fault)
return;
if (MA == 275) {
int x = v+1;
}
if (reloc && (MA & BBIT) == 0 && MAR > 100) {
if (low_addr > 0) {
MAR += low_addr;
@ -2226,14 +2222,14 @@ sim_instr(void)
t &= ~0100; /* Can't be overlaped */
/* Try to start command */
chan_io_status[ch & 07] = 0;
switch (chan_cmd(temp, t, BAR & AMASK)) {
case SCPE_OK:
if (ch & 010) {
chan_io_status[ch & 07] = 0;
chwait = ch & 07;
chan_irq_enb[ch & 7] = 0;
} else {
chan_io_status[ch & 07] = IO_CHS_OVER;
chan_io_status[ch & 07] |= IO_CHS_OVER;
chan_irq_enb[ch & 7] = 1;
}
sim_debug(DEBUG_CMD, &cpu_dev,
@ -2250,6 +2246,9 @@ sim_instr(void)
sim_six_to_ascii[op_mod], chan_io_status[ch & 07]);
chan_io_status[ch & 07] |= IO_CHS_BUSY;
break;
case SCPE_EOF:
chan_io_status[ch & 07] |= IO_CHS_COND;
break;
case SCPE_NODEV:
fprintf(stderr, "No device %d %d\n\r", ch, temp);
/* Fall through */
@ -2268,9 +2267,9 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
temp = 010200 | op_mod;
ch = 1;
chan_io:
chan_io_status[ch & 07] = 0000;
switch (chan_cmd(temp, t, 0)) {
case SCPE_OK:
chan_io_status[ch & 07] = 0000;
if (ch & 010)
chwait = (ch & 07) | 040;
chan_irq_enb[ch & 7] = 0;
@ -2278,6 +2277,9 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
case SCPE_BUSY:
chan_io_status[ch & 07] |= IO_CHS_BUSY;
break;
case SCPE_EOF:
chan_io_status[ch & 07] |= IO_CHS_COND;
break;
case SCPE_NODEV:
case SCPE_IOERR:
chan_io_status[ch & 07] |= IO_CHS_NORDY;
@ -2353,14 +2355,14 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
break;
}
/* Issue command */
chan_io_status[ch & 07] = 0000;
switch (chan_cmd(temp, t, 0)) {
case SCPE_OK:
chan_io_status[ch & 07] = 0000;
chan_irq_enb[ch & 7] = 0;
if (ch & 010) {
chwait = (ch & 07) | 040;
} else if (op_mod == CHR_M) {
chan_io_status[ch & 07] = IO_CHS_OVER;
chan_io_status[ch & 07] |= IO_CHS_OVER;
chan_irq_enb[ch & 7] = 1;
}
sim_debug(DEBUG_CMD, &cpu_dev,
@ -2370,11 +2372,14 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
break;
case SCPE_BUSY:
chan_io_status[ch & 07] = IO_CHS_BUSY;
chan_io_status[ch & 07] |= IO_CHS_BUSY;
break;
case SCPE_EOF:
chan_io_status[ch & 07] |= IO_CHS_COND;
break;
case SCPE_NODEV:
case SCPE_IOERR:
chan_io_status[ch & 07] = IO_CHS_NORDY;
chan_io_status[ch & 07] |= IO_CHS_NORDY;
break;
}
if (CPU_MODEL == 1) {
@ -2395,6 +2400,7 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
break;
}
sim_debug(DEBUG_DETAIL, &mta_dev, "IO Status %d %02o\n", ch, chan_io_status[ch]);
if (chan_io_status[ch] & op_mod) {
jump = 1;
}

View file

@ -258,7 +258,6 @@ chan_write(int chan, t_uint64 * data, int flags)
int
chan_read(int chan, t_uint64 * data, int flags)
{
/* Return END_RECORD if requested */
if (flags & DEV_WEOR) {
chan_flags[chan] &= ~(DEV_WEOR);

View file

@ -2105,6 +2105,7 @@ sim_instr(void)
case SCPE_BUSY:
iowait = 1;
break;
case SCPE_EOF:
case SCPE_IOERR:
reason = STOP_IOCHECK;
break;
@ -2151,6 +2152,7 @@ sim_instr(void)
case SCPE_BUSY:
iowait = 1;
break;
case SCPE_EOF:
case SCPE_IOERR:
reason = STOP_IOCHECK;
break;
@ -2281,6 +2283,7 @@ sim_instr(void)
case SCPE_BUSY:
iowait = 1;
break;
case SCPE_EOF:
case SCPE_IOERR:
reason = STOP_IOCHECK;
break;
@ -2329,6 +2332,7 @@ sim_instr(void)
case SCPE_BUSY:
iowait = 1;
break;
case SCPE_EOF:
case SCPE_IOERR:
reason = STOP_IOCHECK;
break;
@ -2376,6 +2380,7 @@ sim_instr(void)
case SCPE_BUSY:
iowait = 1;
break;
case SCPE_EOF:
case SCPE_IOERR:
reason = STOP_IOCHECK;
break;

View file

@ -711,6 +711,7 @@ stop_cpu:
case SCPE_BUSY:
case SCPE_NODEV:
case SCPE_IOERR:
case SCPE_EOF:
break;
}
break;
@ -1525,6 +1526,7 @@ stop_cpu:
case SCPE_NODEV:
reason = STOP_IOCHECK;
break;
case SCPE_EOF:
case SCPE_IOERR:
flags |= ANYFLAG|INSTFLAG;
break;
@ -1549,6 +1551,7 @@ stop_cpu:
case SCPE_NODEV:
reason = STOP_IOCHECK;
break;
case SCPE_EOF:
case SCPE_IOERR:
flags |= ANYFLAG|INSTFLAG;
break;
@ -1572,6 +1575,7 @@ stop_cpu:
case SCPE_NODEV:
reason = STOP_IOCHECK;
break;
case SCPE_EOF:
case SCPE_IOERR:
flags |= ANYFLAG|INSTFLAG;
break;
@ -1595,6 +1599,7 @@ stop_cpu:
case SCPE_NODEV:
reason = STOP_IOCHECK;
break;
case SCPE_EOF:
case SCPE_IOERR:
flags |= ANYFLAG|INSTFLAG;
break;
@ -1609,12 +1614,12 @@ stop_cpu:
case OP_RWW: /* RWW 705 only */
MAC2 = MAC;
if (CPU_MODEL == CPU_7080 &&
if (iowait == 0 && CPU_MODEL == CPU_7080 &&
(cpu_unit.flags & IOIRQ) != 0 &&
(flags & EIGHTMODE) == 0 &&
((selreg >> 8) & 0xff) != 5) {
flags |= ANYFLAG|INSTFLAG;
selreg2 = selreg;
selreg2 = 0;
} else {
selreg2 = selreg | 0x8000;
}
@ -3375,6 +3380,18 @@ cpu_reset(DEVICE * dptr)
selreg2 = 0;
IC = 4;
sim_brk_types = sim_brk_dflt = SWMASK('E');
/* Leave 80 mode */
if (CPU_MODEL == CPU_7080) {
cpu_type = (cpu_unit.flags & EMULATE3)? CPU_7053:CPU_705;
EMEMSIZE = MEMSIZE;
if (cpu_unit.flags & EMULATE2 && EMEMSIZE > 40000)
EMEMSIZE = 40000;
if (cpu_type == CPU_705 && (cpu_unit.flags & EMULATE2) == 0 &&
EMEMSIZE > 20000)
EMEMSIZE = 20000;
if (EMEMSIZE > 80000)
EMEMSIZE = 80000;
}
return SCPE_OK;
}

View file

@ -598,29 +598,30 @@ chan_proc()
}
/* Wait for device to recognize EOR */
if (chan_flags[chan] & DEV_WEOR)
if (chan_flags[chan] & DEV_WEOR) {
continue;
}
/* Check if got EOR */
if (chan_flags[chan] & DEV_REOR) {
switch (cmd[chan] & 070) {
case IORP:
chan_flags[chan] &= ~(DEV_REOR);
if (chan_dev.dctrl & cmask)
sim_debug(DEBUG_DETAIL, &chan_dev,
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
chan_fetch(chan);
chan_flags[chan] |= STA_ACTIVE;
break;
case IORT:
chan_flags[chan] &= ~(DEV_REOR|STA_ACTIVE);
chan_flags[chan] |= STA_TWAIT;
if (chan_dev.dctrl & cmask)
sim_debug(DEBUG_DETAIL, &chan_dev,
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
continue;
}
/* Check if got EOR */
if (chan_flags[chan] & DEV_REOR) {
switch (cmd[chan] & 070) {
case IORP:
chan_flags[chan] &= ~(DEV_REOR);
if (chan_dev.dctrl & cmask)
sim_debug(DEBUG_DETAIL, &chan_dev,
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
chan_fetch(chan);
chan_flags[chan] |= STA_ACTIVE;
break;
case IORT:
chan_flags[chan] &= ~(DEV_REOR|STA_ACTIVE);
chan_flags[chan] |= STA_TWAIT;
if (chan_dev.dctrl & cmask)
sim_debug(DEBUG_DETAIL, &chan_dev,
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
continue;
}
}
/* Give device new word if we have one */
if (wcount[chan] != 0) {