diff --git a/PDP10/ka10_iii.c b/PDP10/ka10_iii.c index 55776842..b132e3ee 100644 --- a/PDP10/ka10_iii.c +++ b/PDP10/ka10_iii.c @@ -92,7 +92,7 @@ #define POS_Y 00000377700 #define CBRT 00000000070 /* Current brightness */ #define CSIZE 00000000007 /* Current char size */ -#define POS_X_V 16 +#define POS_X_V 17 #define POS_Y_V 6 #define CBRT_V 3 #define CSIZE_V 0 diff --git a/PDP10/ka10_pclk.c b/PDP10/ka10_pclk.c new file mode 100644 index 00000000..4a9b602d --- /dev/null +++ b/PDP10/ka10_pclk.c @@ -0,0 +1,138 @@ +/* ka10_pclk.c: Petit Calendar Clock. + + Copyright (c) 2018, Lars Brinkhoff + Copyright (c) 2020, Bruce Baumgart ( by editing Brinkhoff ka10_pd.c ) + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + RICHARD CORNWELL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include +#include "kx10_defs.h" + +#ifndef NUM_DEVS_PCLK +#define NUM_DEVS_PCLK 0 +#endif + +#if (NUM_DEVS_PCLK > 0) + +#define PCLK_DEVNUM 0730 +#define PCLK_OFF (1 << DEV_V_UF) +#define PIA_CH u3 +#define PIA_FLG 07 +#define CLK_IRQ 010 + +t_stat pclk_devio(uint32 dev, uint64 *data); +const char *pclk_description (DEVICE *dptr); +t_stat pclk_srv(UNIT *uptr); +t_stat pclk_set_on(UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat pclk_set_off(UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat pclk_show_on(FILE *st, UNIT *uptr, int32 val, CONST void *desc); + +UNIT pclk_unit[] = { + {UDATA(pclk_srv, UNIT_IDLE|UNIT_DISABLE, 0)}, /* 0 */ +}; +DIB pclk_dib = {PCLK_DEVNUM, 1, &pclk_devio, NULL}; +MTAB pclk_mod[] = { + { MTAB_VDV, 0, "ON", "ON", pclk_set_on, pclk_show_on }, + { MTAB_VDV, PCLK_OFF, NULL, "OFF", pclk_set_off }, + { 0 } + }; +DEVICE pclk_dev = { + "PCLK", pclk_unit, NULL, pclk_mod, 1, 8, 0, 1, 8, 36, NULL, NULL, NULL, NULL, NULL, NULL, + &pclk_dib, DEV_DISABLE | DEV_DIS | DEV_DEBUG, 0, NULL, NULL, NULL, NULL, NULL, NULL, &pclk_description +}; +/* + This is the Petit real-time calendar-clock re-enactment, where + the DATE is always Friday 1974-07-26, and + the TIME is the local wall clock time. + + Months are encoded 4,5,6, 7,8,9, A,B,C, D,E,F for January to December. + Day-of-month runs from 0 to 30, for the 1st to 31st. + July 1974 is hex '74A' and the 26th day is coded '25' decimal. + + The original PCLK was installed on the PDP-6 I/O bus at the SAIL D.C.Power Lab in 1967. +*/ +t_stat pclk_devio(uint32 dev, uint64 *data) +{ + DEVICE *dptr = &pclk_dev; + time_t t=time(NULL); + struct tm *dt; + uint64 hour=12, minute=1, seconds=2, milliseconds=3; + uint64 coni_word = ((minute&0xF)<<26) | (seconds<<20) | milliseconds; + uint64 datai_word; + dt = localtime( &t ); + hour = dt->tm_hour; + minute = dt->tm_min; + coni_word = (dt->tm_min << 26) | (dt->tm_sec << 20); + coni_word += 02020136700; // plus the Petit/Panofsky offset. + datai_word = ( 0x74A<<16 | 25<<11 | hour<<6 | minute ) + 05004; + switch(dev & 3) { + case DATAI: + *data = datai_word; + break; + case CONI: + *data = coni_word; + break; + case CONO: + pclk_unit[0].PIA_CH &= ~(PIA_FLG); + pclk_unit[0].PIA_CH |= (int32)(*data & PIA_FLG); + break; + default: + break; + } + return SCPE_OK; +} + +t_stat +pclk_srv(UNIT * uptr) +{ + if (uptr->PIA_CH & PIA_FLG) { + uptr->PIA_CH |= CLK_IRQ; + // set_interrupt(PCLK_DEVNUM, uptr->PIA_CH); + } else + sim_cancel(uptr); + return SCPE_OK; +} + +const char *pclk_description (DEVICE *dptr) +{ + return "Stanford A.I.Lab Phil Petit calendar clock crock"; +} + +t_stat pclk_set_on(UNIT *uptr, int32 val, CONST char *cptr, void *desc) +{ + DEVICE *dptr = &pclk_dev; + dptr->flags &= ~PCLK_OFF; + return SCPE_OK; +} + +t_stat pclk_set_off(UNIT *uptr, int32 val, CONST char *cptr, void *desc) +{ + DEVICE *dptr = &pclk_dev; + dptr->flags |= PCLK_OFF; + return SCPE_OK; +} + +t_stat pclk_show_on(FILE *st, UNIT *uptr, int32 val, CONST void *desc) +{ + DEVICE *dptr = &pclk_dev; + fprintf (st, "%s", (dptr->flags & PCLK_OFF) ? "off" : "on"); + return SCPE_OK; +} +#endif diff --git a/PDP10/kl10_fe.c b/PDP10/kl10_fe.c index 39e0eba1..ad97ccbb 100644 --- a/PDP10/kl10_fe.c +++ b/PDP10/kl10_fe.c @@ -2163,6 +2163,7 @@ t_stat lp20_reset (DEVICE *dptr) t_stat lp20_attach (UNIT *uptr, CONST char *cptr) { + sim_switches |= SWMASK ('A'); /* Position to EOF */ return attach_unit (uptr, cptr); } diff --git a/PDP10/kx10_cp.c b/PDP10/kx10_cp.c index b379c60b..488847a9 100644 --- a/PDP10/kx10_cp.c +++ b/PDP10/kx10_cp.c @@ -246,6 +246,7 @@ cp_srv(UNIT *uptr) { t_stat cp_attach(UNIT * uptr, CONST char *file) { + sim_switches |= SWMASK ('A'); /* Position to EOF */ return sim_card_attach(uptr, file); } diff --git a/PDP10/kx10_cpu.c b/PDP10/kx10_cpu.c index a9f3ec1d..daa477e2 100644 --- a/PDP10/kx10_cpu.c +++ b/PDP10/kx10_cpu.c @@ -412,8 +412,8 @@ REG cpu_reg[] = { #endif { FLDATA (PIPEND, pi_pending, 0), REG_HRO}, { FLDATA (PARITY, parity_irq, 0) }, - { ORDATAD (APRIRQ, apr_irq, 0, "APR Interrupt number") }, - { ORDATAD (CLKIRQ, clk_irq, 0, "CLK Interrupt number") }, + { ORDATAD (APRIRQ, apr_irq, 3, "APR Interrupt number") }, + { ORDATAD (CLKIRQ, clk_irq, 3, "CLK Interrupt number") }, { FLDATA (CLKEN, clk_en, 0), REG_HRO}, { FLDATA (XCT, xct_flag, 0), REG_HRO}, { BRDATA (IRQV, dev_irq, 8, 16, 128 ), REG_HRO}, @@ -4273,6 +4273,8 @@ in_loop: } } } while (ind & !pi_rq); + + /* If not a JRST clear the upper half of AR. */ if (IR != 0254) { AR &= RMASK; } @@ -5776,7 +5778,7 @@ dpnorm: hst[hst_p].mb = AR; } MQ = 0; - AR = SWAP_AR; + AR = AR << 18; /* Move to upper half */ goto ufa; } #endif @@ -6223,7 +6225,7 @@ fnorm: if (((SC & 0400) != 0) ^ ((SC & 0200) != 0)) fxu_hold_set = 1; #endif - if (IR != 0130) { /* !UFA */ + if (IR != 0130 && IR != 0247) { /* !UFA and WAITS FIX */ fnormx: while (AR != 0 && ((AR & FPSBIT) != 0) == ((AR & FPNBIT) != 0) && ((AR & FPNBIT) != 0) == ((AR & FP1BIT) != 0)) { @@ -6293,6 +6295,18 @@ fnormx: check_apr_irq(); } #endif +#if WAITS + /* WAITS FIX Instruction. This can't occur if WAITS not set */ + if (IR == 0247) { + /* Extend sign if negative */ + if (flag1) + AR |= EMASK; + set_reg(AC, AR); + break; + } +#endif + + /* Set exponent */ SCAD = SC ^ ((AR & SMASK) ? 0377 : 0); AR &= SMASK|MMASK; AR |= ((uint64)(SCAD & 0377)) << 27; @@ -6304,6 +6318,7 @@ fnormx: MQ |= SMASK; } #else + /* FADL FSBL FMPL */ if ((IR & 07) == 1) { SC = (SC + (0777 ^ 26)) & 0777; @@ -6316,14 +6331,13 @@ fnormx: } } #endif + /* Kill exponent if 0 */ if ((AR & MMASK) == 0) AR = 0; - /* Handle UFA */ if (IR == 0130) { set_reg(AC + 1, AR); - break; } break; diff --git a/PDP10/kx10_defs.h b/PDP10/kx10_defs.h index 5dbd7f07..7e90cc60 100644 --- a/PDP10/kx10_defs.h +++ b/PDP10/kx10_defs.h @@ -448,6 +448,7 @@ extern DEVICE dt_dev; extern DEVICE pmp_dev; extern DEVICE dk_dev; extern DEVICE pd_dev; +extern DEVICE pclk_dev; extern DEVICE dpy_dev; extern DEVICE iii_dev; extern DEVICE imx_dev; @@ -624,6 +625,7 @@ extern void ka10_lights_clear_aux (int); #define NUM_DEVS_DKB (WAITS * USE_DISPLAY) #define NUM_DEVS_III (WAITS * USE_DISPLAY) #define NUM_DEVS_PD ITS | KL_ITS +#define NUM_DEVS_PCLK WAITS #define NUM_DEVS_IMX ITS #define NUM_DEVS_STK ITS #define NUM_DEVS_TK10 ITS diff --git a/PDP10/kx10_lp.c b/PDP10/kx10_lp.c index 25e2d7cb..377b1f14 100644 --- a/PDP10/kx10_lp.c +++ b/PDP10/kx10_lp.c @@ -43,9 +43,10 @@ #define MARGIN 6 #define UNIT_V_CT (UNIT_V_UF + 0) +#define UNIT_CT (3 << UNIT_V_CT) #define UNIT_UC (1 << UNIT_V_CT) #define UNIT_UTF8 (2 << UNIT_V_CT) -#define UNIT_CT (3 << UNIT_V_CT) +#define UNIT_WA (3 << UNIT_V_CT) #define PI_DONE 000007 #define PI_ERROR 000070 @@ -98,8 +99,9 @@ REG lpt_reg[] = { MTAB lpt_mod[] = { {UNIT_CT, 0, "Lower case", "LC", NULL}, - {UNIT_CT, UNIT_UC, "Upper case", "UC", NULL}, - {UNIT_CT, UNIT_UTF8, "UTF8 ouput", "UTF8", NULL}, + {UNIT_CT, UNIT_UC, "Upper case", "UC", NULL, NULL, NULL, "Fold lower to upper case"}, + {UNIT_CT, UNIT_UTF8, "UTF8 ouput", "UTF8", NULL, NULL, NULL, "Extended character set"}, + {UNIT_CT, UNIT_WA, "WAITS ouput", "WAITS", NULL, NULL, NULL, "Waits character set"}, {MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "LINESPERPAGE", "LINESPERPAGE", &lpt_setlpp, &lpt_getlpp, NULL, "Number of lines per page"}, {MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "DEV", "DEV", @@ -210,37 +212,73 @@ lpt_printline(UNIT *uptr, int nl) { } uint16 utf_code[32] = { - 0x0000, /* Dot */ - 0x2193, /* Down arrow */ - 0x237a, /* APL Alpha */ - 0x03b2, /* Beta */ - 0x039b, /* Lambda */ - 0x2510, /* Box light down and left */ - 0x03b5, /* Epsilon */ - 0x03d6, /* Pi */ - 0x03bb, /* Lambda */ - 0x221d, /* proportional */ - 0x222b, /* Integral */ - 0x00b1, /* Plus minus */ - 0x2295, /* Circle plus */ - 0x221e, /* Infinity */ - 0x2202, /* Partial derivitive */ - 0x2282, /* Subset of */ - 0x2283, /* Superset of */ - 0x2229, /* Intersection */ - 0x222a, /* union */ - 0x2200, /* For all */ - 0x2203, /* Exists */ - 0x2295, /* Circle plus */ - 0x2194, /* Left right arrow */ - 0x2227, /* Logical and */ - 0x2192, /* Rightwards arror */ - 0x2014, /* Em dash */ - 0x2260, /* Not equal */ - 0x2264, /* Less than or equal */ - 0x2265, /* Greater than or equal */ - 0x2261, /* Identical too */ - 0x2228 /* Logical or */ + 0x00b7, /* 000 - Dot */ + 0x2193, /* 001 - Down arrow */ + 0x03b1, /* 002 - Alpha */ + 0x03b2, /* 003 - Beta */ + 0x039b, /* 004 - Lambda */ + 0x2510, /* 005 - Box light down and left */ + 0x03b5, /* 006 - Epsilon */ + 0x03d6, /* 007 - Pi */ + 0x03bb, /* 010 - Lambda */ + 0x03b3, /* 011 - small gamma */ + 0x221d, /* 012 - proportional */ + 0x222b, /* 013 - Integral */ + 0x00b1, /* 014 - Plus minus */ + 0x2295, /* 015 - Circle plus */ + 0x221e, /* 016 - Infinity */ + 0x2202, /* 017 - Partial derivitive */ + 0x2282, /* 020 - Subset of */ + 0x2283, /* 021 - Superset of */ + 0x2229, /* 022 - Intersection */ + 0x222a, /* 023 - union */ + 0x2200, /* 024 - For all */ + 0x2203, /* 025 - Exists */ + 0x2295, /* 026 - Circle plus */ + 0x2194, /* 027 - Left right arrow */ + 0x2227, /* 030 - Logical and */ + 0x2192, /* 031 - Rightwards arror */ + 0x2014, /* 032 - Em dash */ + 0x2260, /* 033 - Not equal */ + 0x2264, /* 034 - Less than or equal */ + 0x2265, /* 035 - Greater than or equal */ + 0x2261, /* 036 - Identical too */ + 0x2228 /* 037 - Logical or */ + }; + +uint16 waits_code[32] = { + 0x00b7, /* 000 - Dot */ + 0x2193, /* 001 - Down arrow */ + 0x03b1, /* 002 - Alpha */ + 0x03b2, /* 003 - Beta */ + 0x2227, /* 004 - Boolean AND */ + 0x00ac, /* 005 - Boolean NOT */ + 0x03b5, /* 006 - Epsilon */ + 0x03d6, /* 007 - Pi */ + 0x03bb, /* 010 - Lambda */ + 0x03b3, /* 011 - small gamma */ + 0x03b4, /* 012 - small delta */ + 0x222b, /* 013 - Integral */ + 0x00b1, /* 014 - Plus minus */ + 0x2295, /* 015 - Circle plus */ + 0x221e, /* 016 - Infinity */ + 0x2202, /* 017 - Partial derivitive */ + 0x2282, /* 020 - Subset of */ + 0x2283, /* 021 - Superset of */ + 0x2229, /* 022 - Intersection */ + 0x222a, /* 023 - union */ + 0x2200, /* 024 - For all */ + 0x2203, /* 025 - Exists */ + 0x2295, /* 026 - Circle plus */ + 0x2194, /* 027 - Left right arrow */ + 0x2190, /* 030 - underscore */ + 0x2192, /* 031 - Rightwards arror */ + 0x2191, /* 032 - Tilde */ + 0x2260, /* 033 - Not equal */ + 0x2264, /* 034 - Less than or equal */ + 0x2265, /* 035 - Greater than or equal */ + 0x2261, /* 036 - Identical too */ + 0x2228 /* 037 - Logical or */ }; /* Unit service */ @@ -251,9 +289,9 @@ lpt_output(UNIT *uptr, char c) { return; if (uptr->COL == 132) lpt_printline(uptr, 1); - if ((uptr->flags & UNIT_UC) && (c & 0140) == 0140) + if (((uptr->flags & UNIT_CT) == UNIT_UC) && (c & 0140) == 0140) c &= 0137; - if ((uptr->flags & UNIT_UTF8) && c < 040) { + if (((uptr->flags & UNIT_CT) == UNIT_UTF8) && c < 040) { uint16 u = utf_code[c & 0x1f]; if (u > 0x7ff) { lpt_buffer[uptr->POS++] = 0xe0 + ((u >> 12) & 0xf); @@ -266,6 +304,23 @@ lpt_output(UNIT *uptr, char c) { lpt_buffer[uptr->POS++] = u & 0x7f; } uptr->COL++; + } else if ((uptr->flags & UNIT_CT) == UNIT_WA) { + uint16 u = c & 0x7f; + if (c < 040) + u = waits_code[c & 0x1f]; + else if (c == 0136) /* up arrow */ + u = 0x2191; + if (u > 0x7ff) { + lpt_buffer[uptr->POS++] = 0xe0 + ((u >> 12) & 0xf); + lpt_buffer[uptr->POS++] = 0x80 + ((u >> 6) & 0x3f); + lpt_buffer[uptr->POS++] = 0x80 + (u & 0x3f); + } else if (u > 0x7f) { + lpt_buffer[uptr->POS++] = 0xc0 + ((u >> 6) & 0x3f); + lpt_buffer[uptr->POS++] = 0x80 + (u & 0x3f); + } else { + lpt_buffer[uptr->POS++] = u & 0x7f; + } + uptr->COL++; } else if (c >= 040 && c < 0177) { lpt_buffer[uptr->POS++] = c; uptr->COL++; diff --git a/PDP10/kx10_pt.c b/PDP10/kx10_pt.c index d5a40089..b62abe23 100644 --- a/PDP10/kx10_pt.c +++ b/PDP10/kx10_pt.c @@ -209,7 +209,7 @@ t_stat ptp_attach (UNIT *uptr, CONST char *cptr) { t_stat reason; - sim_switches |= SWMASK ('A'); /* Default to Append to existing file */ + sim_switches |= SWMASK ('A'); /* Position to EOF */ reason = attach_unit (uptr, cptr); uptr->STATUS &= ~NO_TAPE_PP; return reason; diff --git a/PDP10/kx10_sys.c b/PDP10/kx10_sys.c index 8b9e94af..7e11df05 100644 --- a/PDP10/kx10_sys.c +++ b/PDP10/kx10_sys.c @@ -156,6 +156,9 @@ DEVICE *sim_devices[] = { #if (NUM_DEVS_PD > 0) &pd_dev, #endif +#if (NUM_DEVS_PCLK > 0) + &pclk_dev, +#endif #if (NUM_DEVS_DPY > 0) &dpy_dev, #if (NUM_DEVS_WCNSLS > 0)