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);
|
int u = (uptr - cdp_unit);
|
||||||
UNIT *iuptr = &cdp_input_unit[u];
|
UNIT *iuptr = &cdp_input_unit[u];
|
||||||
int i;
|
|
||||||
|
|
||||||
if (uptr == NULL)
|
if (uptr == NULL)
|
||||||
return SCPE_IERR;
|
return SCPE_IERR;
|
||||||
|
|
||||||
i = (iuptr->flags & INPUT_MASK) >> INPUT_V;
|
|
||||||
switch((iuptr->flags & INPUT_MASK) >> INPUT_V) {
|
switch((iuptr->flags & INPUT_MASK) >> INPUT_V) {
|
||||||
case INPUT_BLANK >> INPUT_V:
|
case INPUT_BLANK >> INPUT_V:
|
||||||
fprintf(st, "%d blanks", iuptr->u3);
|
fprintf(st, "%d blanks", iuptr->u3);
|
||||||
|
|
|
@ -122,8 +122,13 @@ uint32 cdr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
|
||||||
uptr->u5 &= ~0xF0000;
|
uptr->u5 &= ~0xF0000;
|
||||||
uptr->u5 |= stk << 16;
|
uptr->u5 |= stk << 16;
|
||||||
#endif
|
#endif
|
||||||
if (uptr->u5 & (URCSTA_EOF|URCSTA_ERR)) {
|
if (uptr->u5 & (URCSTA_EOF)) {
|
||||||
uptr->u5 &= ~(URCSTA_EOF|URCSTA_ERR);
|
uptr->u5 &= ~(URCSTA_EOF);
|
||||||
|
return SCPE_EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uptr->u5 & (URCSTA_ERR)) {
|
||||||
|
uptr->u5 &= ~(URCSTA_ERR);
|
||||||
return SCPE_IOERR;
|
return SCPE_IOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,11 +156,12 @@ uint32 cdr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
|
||||||
/* If at eof, just return EOF */
|
/* If at eof, just return EOF */
|
||||||
if (sim_card_eof(uptr)) {
|
if (sim_card_eof(uptr)) {
|
||||||
uint16 *image = (uint16 *)(uptr->up7);
|
uint16 *image = (uint16 *)(uptr->up7);
|
||||||
|
sim_debug(DEBUG_DETAIL, &cdr_dev, "%d: EOF\n", u);
|
||||||
chan_set_eof(chan);
|
chan_set_eof(chan);
|
||||||
chan_set_attn(chan);
|
chan_set_attn(chan);
|
||||||
uptr->u5 &= ~(URCSTA_EOF|URCSTA_ERR);
|
uptr->u5 &= ~(URCSTA_EOF|URCSTA_ERR);
|
||||||
(void)sim_read_card(uptr, image);
|
(void)sim_read_card(uptr, image);
|
||||||
return SCPE_IOERR;
|
return SCPE_EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
uptr->u5 |= URCSTA_READ;
|
uptr->u5 |= URCSTA_READ;
|
||||||
|
|
|
@ -135,7 +135,7 @@ lpr_setlpp(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
|
||||||
if (i < 20 || i > 100)
|
if (i < 20 || i > 100)
|
||||||
return SCPE_ARG;
|
return SCPE_ARG;
|
||||||
uptr->u6 = i;
|
uptr->u6 = i;
|
||||||
uptr->u4 = 0;
|
uptr->u4 = 1;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +231,9 @@ print_line(UNIT * uptr, int chan, int unit)
|
||||||
sim_putchar(out[j++]);
|
sim_putchar(out[j++]);
|
||||||
}
|
}
|
||||||
uptr->u4++;
|
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;
|
uptr->u4 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +243,7 @@ print_line(UNIT * uptr, int chan, int unit)
|
||||||
if (uptr->flags & UNIT_ATT) {
|
if (uptr->flags & UNIT_ATT) {
|
||||||
sim_fwrite("\r\n", 1, 2, uptr->fileref);
|
sim_fwrite("\r\n", 1, 2, uptr->fileref);
|
||||||
uptr->pos += 2;
|
uptr->pos += 2;
|
||||||
|
uptr->u4++;
|
||||||
}
|
}
|
||||||
if (uptr->flags & ECHO)
|
if (uptr->flags & ECHO)
|
||||||
sim_putchar('\r');
|
sim_putchar('\r');
|
||||||
|
@ -255,18 +258,22 @@ print_line(UNIT * uptr, int chan, int unit)
|
||||||
sim_putchar('\n');
|
sim_putchar('\n');
|
||||||
}
|
}
|
||||||
uptr->u4++;
|
uptr->u4++;
|
||||||
if (uptr->u4 > (int32)uptr->u6) {
|
if (uptr->u4 >= (int32)uptr->u6) {
|
||||||
uptr->u4 = 1;
|
i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (uptr->u4 >= (int32)uptr->u6) {
|
||||||
|
sim_fwrite("\f", 1, 1, uptr->fileref);
|
||||||
|
uptr->u4 = 1;
|
||||||
|
}
|
||||||
uptr->u5 &= ~(URCSTA_SKIPAFT|(0x7f << 12));
|
uptr->u5 &= ~(URCSTA_SKIPAFT|(0x7f << 12));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uptr->u4 == 1)
|
if (uptr->u4 == 1)
|
||||||
lpr_chan9[chan] = 1;
|
lpr_chan9[chan] = 1;
|
||||||
#ifdef I7010
|
#ifdef I7010
|
||||||
if (uptr->u4 == uptr->u6)
|
if (uptr->u4 >= uptr->u6)
|
||||||
lpr_chan12[chan] = 1;
|
lpr_chan12[chan] = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -356,7 +363,10 @@ uint32 lpr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
|
||||||
case 1:
|
case 1:
|
||||||
case 9: if (uptr->u4 == 1)
|
case 9: if (uptr->u4 == 1)
|
||||||
break;
|
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;
|
case 12: i = (uptr->u6/2) - uptr->u4; break;
|
||||||
}
|
}
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
|
@ -369,12 +379,20 @@ uint32 lpr_cmd(UNIT * uptr, uint16 cmd, uint16 dev)
|
||||||
if (uptr->flags & UNIT_ATT) {
|
if (uptr->flags & UNIT_ATT) {
|
||||||
sim_fwrite("\r\n", 1, 2, uptr->fileref);
|
sim_fwrite("\r\n", 1, 2, uptr->fileref);
|
||||||
uptr->pos += 2;
|
uptr->pos += 2;
|
||||||
|
uptr->u4++;
|
||||||
|
if (uptr->u4 >= (int32)uptr->u6) {
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (uptr->flags & ECHO) {
|
if (uptr->flags & ECHO) {
|
||||||
sim_putchar('\r');
|
sim_putchar('\r');
|
||||||
sim_putchar('\n');
|
sim_putchar('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (uptr->u4 >= (int32)uptr->u6) {
|
||||||
|
sim_fwrite("\f", 1, 1, uptr->fileref);
|
||||||
|
uptr->u4 = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (uptr->u4 == uptr->u6)
|
if (uptr->u4 == uptr->u6)
|
||||||
|
@ -468,6 +486,10 @@ lpr_srv(UNIT *uptr) {
|
||||||
|
|
||||||
void
|
void
|
||||||
lpr_ini(UNIT *uptr, t_bool f) {
|
lpr_ini(UNIT *uptr, t_bool f) {
|
||||||
|
if (uptr->u6 == 0) {
|
||||||
|
uptr->u6 = 55;
|
||||||
|
}
|
||||||
|
uptr->u4 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
t_stat
|
t_stat
|
||||||
|
@ -479,7 +501,7 @@ lpr_attach(UNIT * uptr, CONST char *file)
|
||||||
if ((r = attach_unit(uptr, file)) != SCPE_OK)
|
if ((r = attach_unit(uptr, file)) != SCPE_OK)
|
||||||
return r;
|
return r;
|
||||||
uptr->u5 = 0;
|
uptr->u5 = 0;
|
||||||
uptr->u4 = 0;
|
uptr->u4 = 1;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -905,7 +905,7 @@ t_stat mt_srv(UNIT * uptr)
|
||||||
/* Do BCD translation */
|
/* Do BCD translation */
|
||||||
if ((parity_table[ch & 077] ^ (ch & 0100) ^ mode) == 0) {
|
if ((parity_table[ch & 077] ^ (ch & 0100) ^ mode) == 0) {
|
||||||
sim_debug(DEBUG_DETAIL, dptr, "%s parity error %d %03o\n",
|
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
|
#ifdef I7010
|
||||||
if (astmode)
|
if (astmode)
|
||||||
ch = 054;
|
ch = 054;
|
||||||
|
|
|
@ -409,10 +409,6 @@ void WriteP(uint32 MA, uint8 v) {
|
||||||
if (fault)
|
if (fault)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
if (MA == 275) {
|
|
||||||
int x = v+1;
|
|
||||||
}
|
|
||||||
if (reloc && (MA & BBIT) == 0 && MAR > 100) {
|
if (reloc && (MA & BBIT) == 0 && MAR > 100) {
|
||||||
if (low_addr > 0) {
|
if (low_addr > 0) {
|
||||||
MAR += low_addr;
|
MAR += low_addr;
|
||||||
|
@ -2226,14 +2222,14 @@ sim_instr(void)
|
||||||
t &= ~0100; /* Can't be overlaped */
|
t &= ~0100; /* Can't be overlaped */
|
||||||
|
|
||||||
/* Try to start command */
|
/* Try to start command */
|
||||||
|
chan_io_status[ch & 07] = 0;
|
||||||
switch (chan_cmd(temp, t, BAR & AMASK)) {
|
switch (chan_cmd(temp, t, BAR & AMASK)) {
|
||||||
case SCPE_OK:
|
case SCPE_OK:
|
||||||
if (ch & 010) {
|
if (ch & 010) {
|
||||||
chan_io_status[ch & 07] = 0;
|
|
||||||
chwait = ch & 07;
|
chwait = ch & 07;
|
||||||
chan_irq_enb[ch & 7] = 0;
|
chan_irq_enb[ch & 7] = 0;
|
||||||
} else {
|
} else {
|
||||||
chan_io_status[ch & 07] = IO_CHS_OVER;
|
chan_io_status[ch & 07] |= IO_CHS_OVER;
|
||||||
chan_irq_enb[ch & 7] = 1;
|
chan_irq_enb[ch & 7] = 1;
|
||||||
}
|
}
|
||||||
sim_debug(DEBUG_CMD, &cpu_dev,
|
sim_debug(DEBUG_CMD, &cpu_dev,
|
||||||
|
@ -2250,6 +2246,9 @@ sim_instr(void)
|
||||||
sim_six_to_ascii[op_mod], chan_io_status[ch & 07]);
|
sim_six_to_ascii[op_mod], chan_io_status[ch & 07]);
|
||||||
chan_io_status[ch & 07] |= IO_CHS_BUSY;
|
chan_io_status[ch & 07] |= IO_CHS_BUSY;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
|
chan_io_status[ch & 07] |= IO_CHS_COND;
|
||||||
|
break;
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
|
@ -2268,9 +2267,9 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
temp = 010200 | op_mod;
|
temp = 010200 | op_mod;
|
||||||
ch = 1;
|
ch = 1;
|
||||||
chan_io:
|
chan_io:
|
||||||
|
chan_io_status[ch & 07] = 0000;
|
||||||
switch (chan_cmd(temp, t, 0)) {
|
switch (chan_cmd(temp, t, 0)) {
|
||||||
case SCPE_OK:
|
case SCPE_OK:
|
||||||
chan_io_status[ch & 07] = 0000;
|
|
||||||
if (ch & 010)
|
if (ch & 010)
|
||||||
chwait = (ch & 07) | 040;
|
chwait = (ch & 07) | 040;
|
||||||
chan_irq_enb[ch & 7] = 0;
|
chan_irq_enb[ch & 7] = 0;
|
||||||
|
@ -2278,6 +2277,9 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
chan_io_status[ch & 07] |= IO_CHS_BUSY;
|
chan_io_status[ch & 07] |= IO_CHS_BUSY;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
|
chan_io_status[ch & 07] |= IO_CHS_COND;
|
||||||
|
break;
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
chan_io_status[ch & 07] |= IO_CHS_NORDY;
|
chan_io_status[ch & 07] |= IO_CHS_NORDY;
|
||||||
|
@ -2353,14 +2355,14 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Issue command */
|
/* Issue command */
|
||||||
|
chan_io_status[ch & 07] = 0000;
|
||||||
switch (chan_cmd(temp, t, 0)) {
|
switch (chan_cmd(temp, t, 0)) {
|
||||||
case SCPE_OK:
|
case SCPE_OK:
|
||||||
chan_io_status[ch & 07] = 0000;
|
|
||||||
chan_irq_enb[ch & 7] = 0;
|
chan_irq_enb[ch & 7] = 0;
|
||||||
if (ch & 010) {
|
if (ch & 010) {
|
||||||
chwait = (ch & 07) | 040;
|
chwait = (ch & 07) | 040;
|
||||||
} else if (op_mod == CHR_M) {
|
} 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;
|
chan_irq_enb[ch & 7] = 1;
|
||||||
}
|
}
|
||||||
sim_debug(DEBUG_CMD, &cpu_dev,
|
sim_debug(DEBUG_CMD, &cpu_dev,
|
||||||
|
@ -2370,11 +2372,14 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SCPE_BUSY:
|
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;
|
break;
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
chan_io_status[ch & 07] = IO_CHS_NORDY;
|
chan_io_status[ch & 07] |= IO_CHS_NORDY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (CPU_MODEL == 1) {
|
if (CPU_MODEL == 1) {
|
||||||
|
@ -2395,6 +2400,7 @@ fprintf(stderr, "No device %d %d\n\r", ch, temp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sim_debug(DEBUG_DETAIL, &mta_dev, "IO Status %d %02o\n", ch, chan_io_status[ch]);
|
||||||
if (chan_io_status[ch] & op_mod) {
|
if (chan_io_status[ch] & op_mod) {
|
||||||
jump = 1;
|
jump = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,7 +258,6 @@ chan_write(int chan, t_uint64 * data, int flags)
|
||||||
int
|
int
|
||||||
chan_read(int chan, t_uint64 * data, int flags)
|
chan_read(int chan, t_uint64 * data, int flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Return END_RECORD if requested */
|
/* Return END_RECORD if requested */
|
||||||
if (flags & DEV_WEOR) {
|
if (flags & DEV_WEOR) {
|
||||||
chan_flags[chan] &= ~(DEV_WEOR);
|
chan_flags[chan] &= ~(DEV_WEOR);
|
||||||
|
|
|
@ -2105,6 +2105,7 @@ sim_instr(void)
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
iowait = 1;
|
iowait = 1;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
@ -2151,6 +2152,7 @@ sim_instr(void)
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
iowait = 1;
|
iowait = 1;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
@ -2281,6 +2283,7 @@ sim_instr(void)
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
iowait = 1;
|
iowait = 1;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
@ -2329,6 +2332,7 @@ sim_instr(void)
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
iowait = 1;
|
iowait = 1;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
@ -2376,6 +2380,7 @@ sim_instr(void)
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
iowait = 1;
|
iowait = 1;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -711,6 +711,7 @@ stop_cpu:
|
||||||
case SCPE_BUSY:
|
case SCPE_BUSY:
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
|
case SCPE_EOF:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1525,6 +1526,7 @@ stop_cpu:
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
flags |= ANYFLAG|INSTFLAG;
|
flags |= ANYFLAG|INSTFLAG;
|
||||||
break;
|
break;
|
||||||
|
@ -1549,6 +1551,7 @@ stop_cpu:
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
flags |= ANYFLAG|INSTFLAG;
|
flags |= ANYFLAG|INSTFLAG;
|
||||||
break;
|
break;
|
||||||
|
@ -1572,6 +1575,7 @@ stop_cpu:
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
flags |= ANYFLAG|INSTFLAG;
|
flags |= ANYFLAG|INSTFLAG;
|
||||||
break;
|
break;
|
||||||
|
@ -1595,6 +1599,7 @@ stop_cpu:
|
||||||
case SCPE_NODEV:
|
case SCPE_NODEV:
|
||||||
reason = STOP_IOCHECK;
|
reason = STOP_IOCHECK;
|
||||||
break;
|
break;
|
||||||
|
case SCPE_EOF:
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
flags |= ANYFLAG|INSTFLAG;
|
flags |= ANYFLAG|INSTFLAG;
|
||||||
break;
|
break;
|
||||||
|
@ -1609,12 +1614,12 @@ stop_cpu:
|
||||||
|
|
||||||
case OP_RWW: /* RWW 705 only */
|
case OP_RWW: /* RWW 705 only */
|
||||||
MAC2 = MAC;
|
MAC2 = MAC;
|
||||||
if (CPU_MODEL == CPU_7080 &&
|
if (iowait == 0 && CPU_MODEL == CPU_7080 &&
|
||||||
(cpu_unit.flags & IOIRQ) != 0 &&
|
(cpu_unit.flags & IOIRQ) != 0 &&
|
||||||
(flags & EIGHTMODE) == 0 &&
|
(flags & EIGHTMODE) == 0 &&
|
||||||
((selreg >> 8) & 0xff) != 5) {
|
((selreg >> 8) & 0xff) != 5) {
|
||||||
flags |= ANYFLAG|INSTFLAG;
|
flags |= ANYFLAG|INSTFLAG;
|
||||||
selreg2 = selreg;
|
selreg2 = 0;
|
||||||
} else {
|
} else {
|
||||||
selreg2 = selreg | 0x8000;
|
selreg2 = selreg | 0x8000;
|
||||||
}
|
}
|
||||||
|
@ -3375,6 +3380,18 @@ cpu_reset(DEVICE * dptr)
|
||||||
selreg2 = 0;
|
selreg2 = 0;
|
||||||
IC = 4;
|
IC = 4;
|
||||||
sim_brk_types = sim_brk_dflt = SWMASK('E');
|
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;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -598,29 +598,30 @@ chan_proc()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for device to recognize EOR */
|
/* Wait for device to recognize EOR */
|
||||||
if (chan_flags[chan] & DEV_WEOR)
|
if (chan_flags[chan] & DEV_WEOR) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if got EOR */
|
/* Check if got EOR */
|
||||||
if (chan_flags[chan] & DEV_REOR) {
|
if (chan_flags[chan] & DEV_REOR) {
|
||||||
switch (cmd[chan] & 070) {
|
switch (cmd[chan] & 070) {
|
||||||
case IORP:
|
case IORP:
|
||||||
chan_flags[chan] &= ~(DEV_REOR);
|
chan_flags[chan] &= ~(DEV_REOR);
|
||||||
if (chan_dev.dctrl & cmask)
|
if (chan_dev.dctrl & cmask)
|
||||||
sim_debug(DEBUG_DETAIL, &chan_dev,
|
sim_debug(DEBUG_DETAIL, &chan_dev,
|
||||||
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
|
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
|
||||||
chan_fetch(chan);
|
chan_fetch(chan);
|
||||||
chan_flags[chan] |= STA_ACTIVE;
|
chan_flags[chan] |= STA_ACTIVE;
|
||||||
break;
|
break;
|
||||||
case IORT:
|
case IORT:
|
||||||
chan_flags[chan] &= ~(DEV_REOR|STA_ACTIVE);
|
chan_flags[chan] &= ~(DEV_REOR|STA_ACTIVE);
|
||||||
chan_flags[chan] |= STA_TWAIT;
|
chan_flags[chan] |= STA_TWAIT;
|
||||||
if (chan_dev.dctrl & cmask)
|
if (chan_dev.dctrl & cmask)
|
||||||
sim_debug(DEBUG_DETAIL, &chan_dev,
|
sim_debug(DEBUG_DETAIL, &chan_dev,
|
||||||
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
|
"chan %d EOR> %o\n", chan, cmd[chan] & 070);
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Give device new word if we have one */
|
/* Give device new word if we have one */
|
||||||
if (wcount[chan] != 0) {
|
if (wcount[chan] != 0) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue