From 95152012382928c0d765b298fca6c04edd871a60 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Sun, 19 May 2024 14:15:48 -0400 Subject: [PATCH] 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. --- I7000/i7000_cdp.c | 2 -- I7000/i7000_cdr.c | 12 +++++++++--- I7000/i7000_lpr.c | 36 +++++++++++++++++++++++++++++------- I7000/i7000_mt.c | 2 +- I7000/i7010_cpu.c | 28 +++++++++++++++++----------- I7000/i701_chan.c | 1 - I7000/i7070_cpu.c | 5 +++++ I7000/i7080_cpu.c | 21 +++++++++++++++++++-- I7000/i7090_chan.c | 41 +++++++++++++++++++++-------------------- 9 files changed, 101 insertions(+), 47 deletions(-) diff --git a/I7000/i7000_cdp.c b/I7000/i7000_cdp.c index f4c63a75..873a89fa 100644 --- a/I7000/i7000_cdp.c +++ b/I7000/i7000_cdp.c @@ -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); diff --git a/I7000/i7000_cdr.c b/I7000/i7000_cdr.c index 2c4923df..093b864e 100644 --- a/I7000/i7000_cdr.c +++ b/I7000/i7000_cdr.c @@ -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; diff --git a/I7000/i7000_lpr.c b/I7000/i7000_lpr.c index 01d281c3..08b807c4 100644 --- a/I7000/i7000_lpr.c +++ b/I7000/i7000_lpr.c @@ -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; } diff --git a/I7000/i7000_mt.c b/I7000/i7000_mt.c index ab62bf94..0fc7f29b 100644 --- a/I7000/i7000_mt.c +++ b/I7000/i7000_mt.c @@ -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; diff --git a/I7000/i7010_cpu.c b/I7000/i7010_cpu.c index 8f0c2f8b..03b42741 100644 --- a/I7000/i7010_cpu.c +++ b/I7000/i7010_cpu.c @@ -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; } diff --git a/I7000/i701_chan.c b/I7000/i701_chan.c index 9e4f4a59..9f9aa2bb 100644 --- a/I7000/i701_chan.c +++ b/I7000/i701_chan.c @@ -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); diff --git a/I7000/i7070_cpu.c b/I7000/i7070_cpu.c index da09ef8b..a54ae2ab 100644 --- a/I7000/i7070_cpu.c +++ b/I7000/i7070_cpu.c @@ -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; diff --git a/I7000/i7080_cpu.c b/I7000/i7080_cpu.c index fe7fe23e..d62b5df2 100644 --- a/I7000/i7080_cpu.c +++ b/I7000/i7080_cpu.c @@ -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; } diff --git a/I7000/i7090_chan.c b/I7000/i7090_chan.c index 8d9639f0..71ea9065 100644 --- a/I7000/i7090_chan.c +++ b/I7000/i7090_chan.c @@ -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) {