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:
parent
fdbf79145a
commit
9515201238
9 changed files with 101 additions and 47 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -598,8 +598,9 @@ 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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue