From d2780b441e39392896b995349ce89761d4f03bfc Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Sat, 10 Aug 2019 16:53:04 -0400 Subject: [PATCH] KA10: Updated card handling and printer. --- PDP10/kx10_cp.c | 22 ++++++++++++++++++++-- PDP10/kx10_cr.c | 37 +++++++++++++++++++++++++++++++++---- PDP10/kx10_dc.c | 2 +- PDP10/kx10_lp.c | 6 +++++- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/PDP10/kx10_cp.c b/PDP10/kx10_cp.c index 8a8e1c6..a0e910a 100644 --- a/PDP10/kx10_cp.c +++ b/PDP10/kx10_cp.c @@ -34,7 +34,7 @@ #include "sim_defs.h" #if (NUM_DEVS_CP > 0) -#define UNIT_CDP UNIT_ATTABLE | UNIT_DISABLE | MODE_029 +#define UNIT_CDP UNIT_ATTABLE | UNIT_DISABLE | MODE_026 #define CP_DEVNUM 0110 @@ -121,6 +121,7 @@ DEVICE cp_dev = { t_stat cp_devio(uint32 dev, uint64 *data) { UNIT *uptr = &cp_unit; + uint16 col; switch(dev & 3) { case CONI: @@ -170,7 +171,24 @@ t_stat cp_devio(uint32 dev, uint64 *data) { *data = 0; break; case DATAO: - cp_buffer[uptr->COL++] = *data & 0xfff; + col = *data & 0xfff; + switch(col) { + case 04006: col = 03000; break; /* ! - */ + case 01022: col = 00006; break; /* " - */ + case 01012: col = 01202; break; /* # - */ + case 01006: col = 01042; break; /* % - */ + case 02006: col = 05000; break; /* & - */ + case 00012: col = 00042; break; /* ' - */ + case 03000: col = 00022; break; /* : - */ + case 01202: col = 02012; break; /* ; - */ + case 02012: col = 00012; break; /* > - */ + case 05000: col = 04202; break; /* ? - */ + case 02022: col = 04022; break; /* [ - */ + case 00006: col = 01012; break; /* \ - */ + case 04022: col = 02022; break; /* ] - */ + case 00022: col = 00202; break; /* ^ - */ + } + cp_buffer[uptr->COL++] = col; uptr->STATUS &= ~DATA_REQ; clr_interrupt(dev); sim_debug(DEBUG_DATAIO, &cp_dev, "CP: DATAO %012llo %d\n", *data, diff --git a/PDP10/kx10_cr.c b/PDP10/kx10_cr.c index 8f66021..414e3bd 100644 --- a/PDP10/kx10_cr.c +++ b/PDP10/kx10_cr.c @@ -34,7 +34,7 @@ #include "sim_defs.h" #if (NUM_DEVS_CR > 0) -#define UNIT_CDR UNIT_ATTABLE | UNIT_RO | UNIT_DISABLE | MODE_029 +#define UNIT_CDR UNIT_ATTABLE | UNIT_RO | UNIT_DISABLE | MODE_029 | MODE_LOWER #define CR_DEVNUM 0150 @@ -94,7 +94,7 @@ uint16 cr_buffer[80]; DIB cr_dib = { CR_DEVNUM, 1, cr_devio, NULL}; UNIT cr_unit = { - UDATA(cr_srv, UNIT_CDR, 0), 1000, + UDATA(cr_srv, UNIT_CDR, 0), 2000, }; MTAB cr_mod[] = { @@ -170,7 +170,9 @@ t_stat cr_devio(uint32 dev, uint64 *data) { case DATAI: clr_interrupt(dev); if (uptr->STATUS & DATA_RDY) { - *data = uptr->DATA; + *data = uptr->DATA & ~RSIGN; + if (uptr->DATA & RSIGN) + *data |= SMASK; sim_debug(DEBUG_DATAIO, &cr_dev, "CR: DATAI %012llo\n", *data); uptr->STATUS &= ~DATA_RDY; } else @@ -237,6 +239,8 @@ cr_srv(UNIT *uptr) { /* Copy next column over */ if (uptr->STATUS & CARD_IN_READ) { + uint32 data; + int i; if (uptr->COL >= 80) { uptr->STATUS &= ~(CARD_IN_READ|READING); if (sim_card_input_hopper_count(uptr) == 0) @@ -246,7 +250,32 @@ cr_srv(UNIT *uptr) { sim_activate(uptr, uptr->wait); return SCPE_OK; } - uptr->DATA = cr_buffer[uptr->COL++]; + data = cr_buffer[uptr->COL++]; + switch(data) { + case 0x482: data = 0x806; break; /* ! - 12 8 7 */ + case 0xA00: data = 0x882; break; /* [ - 12 8 2 */ + case 0x882: data = 0x482; break; /* ] - 11 8 2 */ + case 0x405: data = 0xa00; break; /* { - 12 0 */ + case 0x600: data = 0xc00; break; /* | - 12 11 */ + case 0x805: data = 0x600; break; /* } - 11 0 */ + case 0x806: data = 0x700; break; /* ~ - 11 0 1 */ + } + uptr->DATA = data; + /* Generate upper 18 bits of data */ + uptr->DATA |= ((data & 0x001) << 25) | + ((data & 0xe00) << 13) | + ((data & 0x002) << 20); + for (i = 1; i <= 7; i++) { + if (data & 0x100) { + /* Set flag it more then one punch */ + if ((uptr->DATA & 07000000) != 0){ + uptr->DATA |= (int32)RSIGN; + break; + } + uptr->DATA |= i << 18; + } + data <<= 1; + } if (uptr->STATUS & DATA_RDY) { uptr->STATUS |= DATA_MISS; } diff --git a/PDP10/kx10_dc.c b/PDP10/kx10_dc.c index 54001e4..f54ce79 100644 --- a/PDP10/kx10_dc.c +++ b/PDP10/kx10_dc.c @@ -107,7 +107,7 @@ const char *dc_description (DEVICE *dptr); DIB dc_dib = { DC_DEVNUM, 1, &dc_devio, NULL }; UNIT dc_unit = { - UDATA (&dc_svc, TT_MODE_7B+UNIT_IDLE+UNIT_ATTABLE, 0), KBD_POLL_WAIT + UDATA (&dc_svc, TT_MODE_7B+UNIT_IDLE+UNIT_DISABLE+UNIT_ATTABLE, 0), KBD_POLL_WAIT }; REG dc_reg[] = { diff --git a/PDP10/kx10_lp.c b/PDP10/kx10_lp.c index 6a3be56..ad32699 100644 --- a/PDP10/kx10_lp.c +++ b/PDP10/kx10_lp.c @@ -40,6 +40,8 @@ #define POS u5 #define LINE u6 +#define MARGIN 6 + #define UNIT_V_CT (UNIT_V_UF + 0) #define UNIT_UC (1 << UNIT_V_CT) #define UNIT_UTF8 (2 << UNIT_V_CT) @@ -182,9 +184,11 @@ lpt_printline(UNIT *uptr, int nl) { lpt_buffer[uptr->POS++] = '\n'; uptr->LINE++; } - if (nl > 0 && uptr->LINE > (int32)uptr->capac) { + if (nl > 0 && uptr->LINE >= ((int32)uptr->capac - MARGIN)) { lpt_buffer[uptr->POS++] = '\f'; uptr->LINE = 0; + } else if (nl < 0 && uptr->LINE >= (int32)uptr->capac) { + uptr->LINE = 0; } sim_fwrite(&lpt_buffer, 1, uptr->POS, uptr->fileref);