From 6595ae52dfe050c0bc86ad7cd8b99a0c392f0e91 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 15 Mar 2016 09:52:20 -0700 Subject: [PATCH] PDP18B: Latest updates from Bob Supnik - Added unix v0 terminal support - Added 3-cycle databreak set/show entries - Revised for dynamically allocated memory - Added support for -u modifier (UC15 and Unix v0) These changes are to support the Unix v0 bringup and to implement a "Unix input" mode on the console terminal. In Unix mode, CR and LF are swapped (so that a modern terminal can use 'enter' instead of CTRK-J to create the newline Unix expects), escape is mapped to altmode (175), upper and lower case are enabled and the parity bit is forced to 1. This most closely matches the characteristics of the KSR-37, but there is no definitive evidence of the terminal that was actually used. --- PDP18B/pdp18b_cpu.c | 44 +++++++++++++++++++++++++++++++++------ PDP18B/pdp18b_defs.h | 5 ++++- PDP18B/pdp18b_drm.c | 3 ++- PDP18B/pdp18b_dt.c | 14 +++++++------ PDP18B/pdp18b_fpp.c | 5 +++-- PDP18B/pdp18b_lp.c | 9 ++++---- PDP18B/pdp18b_mt.c | 12 ++++++----- PDP18B/pdp18b_rb.c | 5 +++-- PDP18B/pdp18b_rf.c | 14 +++++++------ PDP18B/pdp18b_rp.c | 5 +++-- PDP18B/pdp18b_stddev.c | 42 ++++++++++++++++++++++++++----------- PDP18B/pdp18b_sys.c | 46 ++++++++++++++++------------------------- doc/pdp18b_doc.doc | Bin 100352 -> 111104 bytes 13 files changed, 129 insertions(+), 75 deletions(-) diff --git a/PDP18B/pdp18b_cpu.c b/PDP18B/pdp18b_cpu.c index b2a7562f..98962378 100644 --- a/PDP18B/pdp18b_cpu.c +++ b/PDP18B/pdp18b_cpu.c @@ -1,6 +1,6 @@ /* pdp18b_cpu.c: 18b PDP CPU simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,9 @@ cpu PDP-4/7/9/15 central processor + 10-Mar-16 RMS Added 3-cycle databreak set/show routines + 07-Mar-16 RMS Revised to allocate memory dynamically + 28-Mar-15 RMS Revised to use sim_printf 28-Apr-07 RMS Removed clock initialization 26-Dec-06 RMS Fixed boundary test in KT15/XVM (Andrew Warkentin) 30-Oct-06 RMS Added idle and infinite loop detection @@ -330,7 +333,7 @@ typedef struct { #define ASW_DFLT 017720 #endif -int32 M[MAXMEMSIZE] = { 0 }; /* memory */ +int32 *M = NULL; /* memory */ int32 LAC = 0; /* link'AC */ int32 MQ = 0; /* MQ */ int32 PC = 0; /* PC */ @@ -1550,7 +1553,7 @@ while (reason == 0) { /* loop until halted */ } else if (pulse == 004) { /* ISA */ api_enb = (iot_data & SIGN)? 1: 0; - api_req = api_req | ((LAC >> 8) & 017); + api_req = api_req | ((LAC >> 8) & 017); /* swre levels only */ api_act = api_act | (LAC & 0377); } break; @@ -1643,7 +1646,7 @@ while (reason == 0) { /* loop until halted */ } else if (pulse == 004) { /* ISA */ api_enb = (iot_data & SIGN)? 1: 0; - api_req = api_req | ((LAC >> 8) & 017); + api_req = api_req | ((LAC >> 8) & 017); /* swre levels only */ api_act = api_act | (LAC & 0377); } else if (pulse == 021) /* ENB */ @@ -2096,6 +2099,10 @@ usmd = usmd_buf = usmd_defer = 0; memm = memm_init; nexm = prvn = trap_pending = 0; emir_pending = rest_pending = 0; +if (M == NULL) + M = (int32 *) calloc (MEMSIZE, sizeof (int32)); +if (M == NULL) + return SCPE_MEM; pcq_r = find_reg ("PCQ", NULL, dptr); if (pcq_r) pcq_r->qptr = 0; @@ -2251,7 +2258,7 @@ for (i = 0; i < DEV_MAX; i++) { /* clr tables */ } for (i = 0; i < ((uint32) sizeof (std_dev)); i++) /* std entries */ dev_tab[std_dev[i]] = &bad_dev; -for (i = p = 0; (dptr = sim_devices[i]) != NULL; i++) { /* add devices */ +for (i = p = 0; (dptr = sim_devices[i]) != NULL; i++) { /* add devices */ dibp = (DIB *) dptr->ctxt; /* get DIB */ if (dibp && !(dptr->flags & DEV_DIS)) { /* enabled? */ if (dibp->iors) /* if IORS, add */ @@ -2260,7 +2267,7 @@ for (i = p = 0; (dptr = sim_devices[i]) != NULL; i++) { /* add devices * if (dibp->dsp[j]) { /* any dispatch? */ if (dev_tab[dibp->dev + j]) { /* already filled? */ sim_printf ("%s device number conflict at %02o\n", - sim_dname (dptr), dibp->dev + j); + sim_dname (dptr), dibp->dev + j); return TRUE; } dev_tab[dibp->dev + j] = dibp->dsp[j]; /* fill */ @@ -2271,6 +2278,31 @@ for (i = p = 0; (dptr = sim_devices[i]) != NULL; i++) { /* add devices * return FALSE; } +/* Set in memory 3-cycle databreak register */ + +t_stat set_3cyc_reg (UNIT *uptr, int32 val, char *cptr, void *desc) +{ +t_stat r; +int32 newv; + +if (cptr == NULL) + return SCPE_ARG; +newv = (int32) get_uint (cptr, 8, 0777777, &r); +if (r != SCPE_OK) + return SCPE_ARG; +M[val] = newv; +return SCPE_OK; +} + +/* Show in-memory 3-cycle databreak register */ + +t_stat show_3cyc_reg (FILE *st, UNIT *uptr, int32 val, void *desc) +{ +fprintf (st, "%s=", (char *) desc); +fprint_val (st, (t_value) M[val], 8, 18, PV_RZRO); +return SCPE_OK; +} + /* Set history */ t_stat cpu_set_hist (UNIT *uptr, int32 val, char *cptr, void *desc) diff --git a/PDP18B/pdp18b_defs.h b/PDP18B/pdp18b_defs.h index 411cb9b5..5c316521 100644 --- a/PDP18B/pdp18b_defs.h +++ b/PDP18B/pdp18b_defs.h @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 10-Mar-16 RMS Added 3-cycle databreak set/show routines 26-Feb-16 RMS Added RB09 to PDP-7 for Unix "v0" and RM09 to PDP-9 13-Sep-15 RMS Added DR15C 18-Apr-12 RMS Added clk_cosched prototype @@ -108,6 +109,7 @@ TC59D magnetic tape TC15/TU56 DECtape LT15/LT19 additional Teletypes + DR15C parallel interface to UC15 ??Indicates not implemented. The PDP-4 manual refers to a memory ??extension control; there is no documentation on it. @@ -164,7 +166,6 @@ #define MTA 0 /* magtape */ #define TC02 0 /* DECtape */ #define TTY1 16 /* second Teletype(s) */ -#define DR 0 /* DR15C */ #define BRMASK 0377400 /* bounds mask */ #define BRMASK_XVM 0777400 /* bounds mask, XVM */ #endif @@ -520,5 +521,7 @@ typedef struct { t_stat set_devno (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat show_devno (FILE *st, UNIT *uptr, int32 val, void *desc); +t_stat set_3cyc_reg (UNIT *uptr, int32 val, char *cptr, void *desc); +t_stat show_3cyc_reg (FILE *st, UNIT *uptr, int32 val, void *desc); #endif diff --git a/PDP18B/pdp18b_drm.c b/PDP18B/pdp18b_drm.c index f65a053a..3778e1e5 100644 --- a/PDP18B/pdp18b_drm.c +++ b/PDP18B/pdp18b_drm.c @@ -25,6 +25,7 @@ drm (PDP-4,PDP-7) Type 24 serial drum; (PDP-9) RM09 drum + 07-Mar-16 RMS Revised for dynamically allocated memory 26-Feb-16 RMS Added PDP-9 support; set default state to disabled 03-Sep-13 RMS Added explicit void * cast 14-Jan-04 RMS Revised IO device call interface @@ -64,7 +65,7 @@ #define GET_POS(x) ((int) fmod (sim_gtime() / ((double) (x)), \ ((double) DRM_NUMWDT))) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1]; extern UNIT cpu_unit; diff --git a/PDP18B/pdp18b_dt.c b/PDP18B/pdp18b_dt.c index e3a9e948..8d07f56b 100644 --- a/PDP18B/pdp18b_dt.c +++ b/PDP18B/pdp18b_dt.c @@ -1,6 +1,6 @@ /* pdp18b_dt.c: 18b DECtape simulator - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -27,6 +27,8 @@ (PDP-9) TC02/TU55 DECtape (PDP-15) TC15/TU56 DECtape + 10-Mar-16 RMS Added 3-cycle databreak set/show entries + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Mar-15 RMS Added APIVEC register 28-Mar-15 RMS Revised to use sim_printf 23-Jun-06 RMS Fixed switch conflict in ATTACH @@ -327,7 +329,7 @@ #define ABS(x) (((x) < 0)? (-(x)): (x)) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1]; extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; @@ -406,10 +408,6 @@ REG dt_reg[] = { { FLDATA (BEF, dtsb, DTB_V_BEF) }, #endif { FLDATA (ERF, dtsb, DTB_V_ERF) }, -#if defined (TC02) /* TC02/TC15 */ - { ORDATA (WC, M[DT_WC], 18) }, - { ORDATA (CA, M[DT_CA], 18) }, -#endif { DRDATA (LTIME, dt_ltime, 31), REG_NZ }, { DRDATA (DCTIME, dt_dctime, 31), REG_NZ }, { ORDATA (SUBSTATE, dt_substate, 2) }, @@ -434,6 +432,10 @@ MTAB dt_mod[] = { { UNIT_8FMT + UNIT_11FMT, 0, "18b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_8FMT, "12b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_11FMT, "16b", NULL, NULL }, +#if defined (TC02) + { MTAB_XTD|MTAB_VDV|MTAB_NMO, DT_WC, "WC", "WC", &set_3cyc_reg, &show_3cyc_reg, "WC" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, DT_CA, "CA", "CA", &set_3cyc_reg, &show_3cyc_reg, "CA" }, +#endif { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_devno, &show_devno }, { 0 } }; diff --git a/PDP18B/pdp18b_fpp.c b/PDP18B/pdp18b_fpp.c index b7b5109c..a8b11826 100644 --- a/PDP18B/pdp18b_fpp.c +++ b/PDP18B/pdp18b_fpp.c @@ -1,6 +1,6 @@ /* pdp18b_fpp.c: FP15 floating point processor simulator - Copyright (c) 2003-2012, Robert M Supnik + Copyright (c) 2003-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ fpp PDP-15 floating point processor + 07-Mar-16 RMS Revised for dynamically allocated memory 19-Mar-12 RMS Fixed declaration of pc queue (Mark Pizzolato) 06-Jul-06 RMS Fixed bugs in left shift, multiply 31-Oct-04 RMS Fixed URFST to mask low 9b of fraction @@ -144,7 +145,7 @@ static UFP fma; /* FMA */ static UFP fmb; /* FMB */ static UFP fmq; /* FMQ - hi,lo only */ -extern int32 M[MAXMEMSIZE]; +extern int32 *M; #if defined (PDP15) extern int32 pcq[PCQ_SIZE]; /* PC queue */ #else diff --git a/PDP18B/pdp18b_lp.c b/PDP18B/pdp18b_lp.c index 03d66bbf..dfcfabe5 100644 --- a/PDP18B/pdp18b_lp.c +++ b/PDP18B/pdp18b_lp.c @@ -1,6 +1,6 @@ /* pdp18b_lp.c: 18b PDP's line printer simulator - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -28,6 +28,8 @@ lp09 (PDP-9,15) LP09 line printer lp15 (PDP-15) LP15 line printer + 10-Mar-16 RMS Added 3-cycle databreak set/show entry + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Sep-15 RMS Added APIVEC register 19-Jan-07 RMS Added UNIT_TEXT flag 11-Jun-06 RMS Made character translation table global scope @@ -666,7 +668,6 @@ return detach_unit (uptr); /* LP15 line printer */ #define LP15_BSIZE 132 /* line size */ -#define LPT_WC 034 /* word count */ #define LPT_CA 035 /* current addr */ /* Status register */ @@ -681,7 +682,7 @@ return detach_unit (uptr); #define STA_EFLGS (STA_ALM | STA_OVF | STA_IHT | STA_ILK) #define STA_CLR 0003777 /* always clear */ -extern int32 M[]; +extern int32 *M; int32 lp15_sta = 0; int32 lp15_ie = 1; int32 lp15_stopioe = 0; @@ -714,7 +715,6 @@ UNIT lp15_unit = { REG lp15_reg[] = { { ORDATA (STA, lp15_sta, 18) }, - { ORDATA (CA, M[LPT_CA], 18) }, { FLDATA (INT, int_hwre[API_LPT], INT_V_LPT) }, { FLDATA (ENABLE, lp15_ie, 0) }, { DRDATA (LCNT, lp15_lc, 9) }, @@ -730,6 +730,7 @@ REG lp15_reg[] = { }; MTAB lp15_mod[] = { + { MTAB_XTD|MTAB_VDV|MTAB_NMO, LPT_CA, "CA", "CA", &set_3cyc_reg, &show_3cyc_reg, "CA" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_devno, &show_devno }, { 0 } }; diff --git a/PDP18B/pdp18b_mt.c b/PDP18B/pdp18b_mt.c index ed7eb53f..847a73d1 100644 --- a/PDP18B/pdp18b_mt.c +++ b/PDP18B/pdp18b_mt.c @@ -1,6 +1,6 @@ /* pdp18b_mt.c: 18b PDP magnetic tape simulator - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,8 @@ mt (PDP-9) TC59 magtape (PDP-15) TC59D magtape + 10-Mar-16 RMS Added 3-cycle databreak set/show entries + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Sep-15 RMS Added APIVEC register 14-Nov-08 RMS Replaced mt_log with standard debug facility 16-Feb-06 RMS Added tape capacity checking @@ -125,7 +127,7 @@ #define STA_DYN (STA_REW | STA_BOT | STA_EOF | STA_EOT) /* kept in USTAT */ -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1]; extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; @@ -171,8 +173,6 @@ UNIT mt_unit[] = { REG mt_reg[] = { { ORDATA (STA, mt_sta, 18) }, { ORDATA (CMD, mt_cu, 18) }, - { ORDATA (WC, M[MT_WC], 18) }, - { ORDATA (CA, M[MT_CA], 18) }, { FLDATA (INT, int_hwre[API_MTA], INT_V_MTA) }, { FLDATA (STOP_IOE, mt_stopioe, 0) }, { DRDATA (TIME, mt_time, 24), PV_LEFT }, @@ -189,8 +189,10 @@ MTAB mt_mod[] = { { MTUF_WLK, MTUF_WLK, "write locked", "LOCKED", NULL }, { MTAB_XTD|MTAB_VUN, 0, "FORMAT", "FORMAT", &sim_tape_set_fmt, &sim_tape_show_fmt, NULL }, - { MTAB_XTD|MTAB_VUN, 0, "CAPACITY", "CAPACITY", + { MTAB_XTD|MTAB_VUN, 0, "TCAPACITY", "TCAPACITY", &sim_tape_set_capac, &sim_tape_show_capac, NULL }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, MT_WC, "WC", "WC", &set_3cyc_reg, &show_3cyc_reg, "WC" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, MT_CA, "CA", "CA", &set_3cyc_reg, &show_3cyc_reg, "CA" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_devno, &show_devno, NULL }, { 0 } diff --git a/PDP18B/pdp18b_rb.c b/PDP18B/pdp18b_rb.c index b9db8ec2..56bd08b3 100644 --- a/PDP18B/pdp18b_rb.c +++ b/PDP18B/pdp18b_rb.c @@ -1,6 +1,6 @@ /* pdp18b_rb.c: RB09 fixed head disk simulator - Copyright (c) 2003-2013, Robert M Supnik + Copyright (c) 2003-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ rb RB09 fixed head disk + 07-Mar-16 RMS Revised for dynamically allocated memory 03-Sep-13 RMS Added explicit void * cast 14-Jan-04 RMS Revised IO device call interface 26-Oct-03 RMS Cleaned up buffer copy code @@ -77,7 +78,7 @@ #define GET_POS(x) ((int) fmod (sim_gtime () / ((double) (x)), \ ((double) (RB_NUMSC * RB_NUMWD)))) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1]; extern UNIT cpu_unit; diff --git a/PDP18B/pdp18b_rf.c b/PDP18B/pdp18b_rf.c index 583942e0..8e0ed65a 100644 --- a/PDP18B/pdp18b_rf.c +++ b/PDP18B/pdp18b_rf.c @@ -1,6 +1,6 @@ /* pdp18b_rf.c: fixed head disk simulator - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,8 @@ rf (PDP-9) RF09/RF09 (PDP-15) RF15/RS09 + 10-Mar-16 RMS Added 3-cycle databreak set/show entries + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Sep-15 RMS Added APIVEC register 03-Sep-13 RMS Added explicit void * cast 04-Oct-06 RMS Fixed bug, DSCD does not clear function register @@ -109,7 +111,7 @@ ((double) RF_NUMWD))) #define RF_BUSY (sim_is_active (&rf_unit)) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1]; extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; @@ -149,8 +151,6 @@ UNIT rf_unit = { REG rf_reg[] = { { ORDATA (STA, rf_sta, 18) }, { ORDATA (DA, rf_da, 22) }, - { ORDATA (WC, M[RF_WC], 18) }, - { ORDATA (CA, M[RF_CA], 18) }, { ORDATA (BUF, rf_dbuf, 18) }, { FLDATA (INT, int_hwre[API_RF], INT_V_RF) }, { BRDATA (WLK, rf_wlk, 8, 16, RF_NUMDK) }, @@ -173,6 +173,8 @@ MTAB rf_mod[] = { { UNIT_PLAT, (6 << UNIT_V_PLAT), NULL, "7P", &rf_set_size }, { UNIT_PLAT, (7 << UNIT_V_PLAT), NULL, "8P", &rf_set_size }, { UNIT_AUTO, UNIT_AUTO, "autosize", "AUTOSIZE", NULL }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, RF_WC, "WC", "WC", &set_3cyc_reg, &show_3cyc_reg, "WC" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, RF_CA, "CA", "CA", &set_3cyc_reg, &show_3cyc_reg, "CA" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_devno, &show_devno }, { 0 } }; @@ -314,9 +316,9 @@ return SCPE_OK; /* Update status */ -int32 rf_updsta (int32 new) +int32 rf_updsta (int32 news) { -rf_sta = (rf_sta | new) & ~(RFS_ERR | RFS_CLR); +rf_sta = (rf_sta | news) & ~(RFS_ERR | RFS_CLR); if (rf_sta & RFS_EFLGS) rf_sta = rf_sta | RFS_ERR; if ((rf_sta & (RFS_ERR | RFS_DON)) && (rf_sta & RFS_IE)) diff --git a/PDP18B/pdp18b_rp.c b/PDP18B/pdp18b_rp.c index 8cfad45d..18c3c676 100644 --- a/PDP18B/pdp18b_rp.c +++ b/PDP18B/pdp18b_rp.c @@ -1,6 +1,6 @@ /* pdp18b_rp.c: RP15/RP02 disk pack simulator - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ rp RP15/RP02 disk pack + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Sep-15 RMS Added APIVEC register 14-Jan-04 RMS Revised IO device call interface 06-Feb-03 RMS Revised IOT decoding, fixed bug in initiation @@ -132,7 +133,7 @@ #define RP_MIN 2 #define MAX(x,y) (((x) > (y))? (x): (y)) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1], nexm; extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index 1437c927..49e7b741 100644 --- a/PDP18B/pdp18b_stddev.c +++ b/PDP18B/pdp18b_stddev.c @@ -1,6 +1,6 @@ /* pdp18b_stddev.c: 18b PDP's standard devices - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -29,6 +29,8 @@ tto teleprinter clk clock + 15-Mar-16 RMS Added unix v0 terminal support + 07-Mar-16 RMS Revised for dynamically allocated memory 13-Sep-15 RMS Added APIVEC register to PTR, CLK only 28-Mar-15 RMS Revised to use sim_printf 18-Apr-12 RMS Added clk_cosched routine @@ -86,7 +88,7 @@ #define UNIT_V_PASCII (UNIT_V_UF + 0) /* punch ASCII */ #define UNIT_PASCII (1 << UNIT_V_PASCII) -extern int32 M[]; +extern int32 *M; extern int32 int_hwre[API_HLVL+1], PC, ASW; extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; @@ -312,7 +314,9 @@ DEVICE ptp_dev = { #define TTI_MASK ((1 << TTI_WIDTH) - 1) #define TTUF_V_HDX (TTUF_V_UF + 0) /* half duplex */ +#define TTUF_V_UNIX (TTUF_V_UF + 1) #define TTUF_HDX (1 << TTUF_V_HDX) +#define TTUF_UNIX (1 << TTUF_V_UNIX) DIB tti_dib = { DEV_TTI, 1, &tti_iors, { &tti } }; @@ -335,10 +339,13 @@ REG tti_reg[] = { MTAB tti_mod[] = { #if !defined (KSR28) - { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, +#if !defined (PDP15) + { TTUF_UNIX|TT_PAR|TT_MODE, TTUF_UNIX|TT_PAR_MARK|TT_MODE_7B, "Unix v0", "UNIX", &tty_set_mode }, +#endif #endif { TTUF_HDX, 0 , "full duplex", "FDX", NULL }, { TTUF_HDX, TTUF_HDX, "half duplex", "HDX", NULL }, @@ -390,10 +397,13 @@ REG tto_reg[] = { MTAB tto_mod[] = { #if !defined (KSR28) - { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, + { TTUF_UNIX|TT_PAR|TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, +#if !defined (PDP15) + { TTUF_UNIX|TT_PAR|TT_MODE, TTUF_UNIX|TT_PAR_MARK|TT_MODE_7B, "Unix v0", "UNIX", &tty_set_mode }, +#endif #endif { MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_devno }, { 0 } @@ -1050,6 +1060,14 @@ out = c & 0177; /* mask echo to 7b */ if (c & SCPE_BREAK) /* break? */ c = 0; else c = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags) | TTUF_KSR); +if (uptr->flags & TTUF_UNIX) { /* unix v0? */ + if (c == 0215) /* cr -> lf */ + c = 0212; + else if (c == 0212) /* lf -> cr */ + c = 0215; + else if (c == 0233) /* esc -> altmode */ + c = 0375; + } if ((uptr->flags & TTUF_HDX) && !tti_fdpx && out && /* half duplex and */ ((out = sim_tt_outcvt (out, TT_GET_MODE (uptr->flags) | TTUF_KSR)) >= 0)) { sim_putchar (out); /* echo */ @@ -1156,7 +1174,7 @@ return SCPE_OK; t_stat tty_set_mode (UNIT *uptr, int32 val, char *cptr, void *desc) { -tti_unit.flags = (tti_unit.flags & ~TT_MODE) | val; -tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val; +tti_unit.flags = (tti_unit.flags & ~(TTUF_UNIX|TT_PAR|TT_MODE)) | val; +tto_unit.flags = (tto_unit.flags & ~(TTUF_UNIX|TT_PAR|TT_MODE)) | val; return SCPE_OK; } diff --git a/PDP18B/pdp18b_sys.c b/PDP18B/pdp18b_sys.c index fe619e1f..c4167e66 100644 --- a/PDP18B/pdp18b_sys.c +++ b/PDP18B/pdp18b_sys.c @@ -23,7 +23,9 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. - 26-Feb-15 RMS Added support for -u modifier (UC15 and Unix v0) + 07-Mar-16 RMS Revised for dynamically allocated memory + 03-Mar-16 RMS Added DR15C support + 26-Feb-16 RMS Added support for -u modifier (UC15 and Unix v0) 13-Sep-15 RMS Added DR15C instructions 30-Oct-06 RMS Added infinite loop stop 18-Oct-06 RMS Re-ordered device list @@ -97,16 +99,17 @@ extern DEVICE mt_dev; extern DEVICE tti1_dev, tto1_dev; extern UNIT tti1_unit, tto1_unit; #endif +#if defined (UC15) +extern DEVICE dr15_dev; +#endif extern UNIT cpu_unit; extern REG cpu_reg[]; -extern int32 M[]; +extern int32 *M; extern int32 memm; extern int32 PC; extern const char asc_to_baud[128]; extern const char baud_to_asc[64]; extern const char fio_to_asc[64]; -extern t_stat fprint_sym_cm_w (FILE *of, t_addr addr, t_value *val, int32 sw); -extern t_stat parse_sym_cm_w (char *cptr, t_addr addr, t_value *val, int32 sw); /* SCP data structures and interface routines @@ -172,6 +175,9 @@ DEVICE *sim_devices[] = { #endif #if defined (TTY1) &tti1_dev, &tto1_dev, +#endif +#if defined (UC15) + &dr15_dev, #endif NULL }; @@ -505,16 +511,16 @@ static const char *opcode[] = { "DTCA", "DTRA", "DTXA", "DTLA", "DTEF", "DTRB", "DTDF", #endif -#if defined (DR) /* DR15C */ +#if defined (TTY1) + "KSF1", "KRB1", + "TSF1", "TCF1", "TLS1", "TCF1!TLS1", +#endif +#if defined (UC15) /* DR15C */ "SIOA", "CIOD", "LIOR", "RDRS", "LDRS", "SAPI0", "SAPI1", "SAPI2", "SAPI3", "CAPI0", "CAPI1", "CAPI2", "CAPI3", #endif -#if defined (TTY1) - "KSF1", "KRB1", - "TSF1", "TCF1", "TLS1", "TCF1!TLS1", -#endif #if defined (PDP7) "ITON", "TTS", "SKP7", "CAF", "SEM", "EEM", "EMIR", "LEM", @@ -748,9 +754,9 @@ static const int32 opc_val[] = { 0704101+I_NPI, 0704112+I_NPN, 0704001+I_NPI, 0704002+I_NPI, 0704004+I_NPI, 0704006+I_NPI, #endif -#if defined (DR) +#if defined (UC15) 0706001+I_NPI, 0706002+I_NPI, 0706006+I_NPI, - 0706112+I_NPI, 0706122+I_NPI, + 0706112+I_NPN, 0706122+I_NPI, 0706101+I_NPI, 0706121+I_NPI, 0706141+I_NPI, 0706161+I_NPI, 0706104+I_NPI, 0706124+I_NPI, 0706144+I_NPI, 0706164+I_NPI, #endif @@ -957,12 +963,8 @@ if ((sw & SWMASK ('A')) != 0) { /* ASCII? */ fprintf (of, FMTASC (inst & 0177)); return SCPE_OK; } -#if defined (UC15) -if (dptr->dwidth == 16) /* 16b device? */ - return fprint_sym_cm_w (of, addr, val, sw); -#endif -if (dptr->dwidth < 18) /* 18b device? */ +if (dptr->dwidth < 18) /* 18b device? */ return SCPE_ARG; if ((sw & SWMASK ('C')) != 0) { /* character? */ @@ -1169,18 +1171,6 @@ if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */ val[0] = (t_value) cptr[0] | 0200; return SCPE_OK; } -#if defined (UC15) -if (dptr->dwidth == 16) { /* 16b decode? */ - if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* char string? */ - if (cptr[0] == 0) /* must have 1 char */ - return SCPE_ARG; - val[0] = (((t_value) cptr[1] & 0377) << 8) | - ((t_value) cptr[0] & 0377); - return SCPE_OK; - } - return fparse_sym_cm_w (of, addr, val, uptr, sw); - } -#endif if (dptr->dwidth < 18) /* 18b decode? */ return SCPE_ARG; /* no, fail */ diff --git a/doc/pdp18b_doc.doc b/doc/pdp18b_doc.doc index beacda79c02ee7fefdf82b46a04ef4a348fafd7e..4c6a3850a95eaf85c5c45084faba040216ba0b7e 100644 GIT binary patch literal 111104 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%0AFT%mG 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 B0GR*) delta 23500 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