From 7251196f31b9190ab4b8287646bd2eabecb6b8e2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 15 Mar 2016 09:53:19 -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 | 39 ++++++++++++++++++++++++++++++---- 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 104448 -> 111104 bytes 13 files changed, 126 insertions(+), 73 deletions(-) diff --git a/PDP18B/pdp18b_cpu.c b/PDP18B/pdp18b_cpu.c index a4507974..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-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,8 @@ 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) @@ -331,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 */ @@ -1551,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; @@ -1644,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 */ @@ -2097,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; @@ -2272,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 5fc878ae..06398606 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 @@ -104,6 +105,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. @@ -160,7 +162,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 @@ -516,6 +517,8 @@ 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); int32 clk_cosched (int32 wait); 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 54c23a0a..0666e3f6 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 @@ -326,7 +328,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; @@ -404,10 +406,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) }, @@ -432,6 +430,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 0f2f8a04..ffbf70d4 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 @@ -143,7 +144,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 dae5ee1a..0a68097a 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 ebf889cc..6aadc1a4 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 a983f713..6ef05169 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 @@ -85,7 +87,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; @@ -311,7 +313,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 } }; @@ -334,10 +338,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 }, @@ -389,10 +396,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 } @@ -1061,6 +1071,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 */ @@ -1166,7 +1184,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 50ac3afa..676eb55a 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 @@ -952,12 +958,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? */ @@ -1164,18 +1166,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 b3fd495641d5e84be69ba5ade9e70fc6d9b6e68e..4c6a3850a95eaf85c5c45084faba040216ba0b7e 100644 GIT binary patch delta 24235 zcmd7a2|yHO|G@DXPy`hPR5V3h?;AM<%v1z5Z&W;bJrPzwx#CjLTFVYkJVsbG%k;HU zyG&9v^DH$}OEb;;O5c3n(z4eMP4fT!?J$V2RQC3-);_zlGtbUE=kJ-B-I%t{Y1$>H z`96(4Rf-;NigJua6+hp(b4S*Gf+KGY+^_oeT%st|lyMWrP4MXK(OI_L`*5k?sd$@I zB_&d^>A66=UZH`O;IPngo0JX@C`wcI>{Lhpn0pUJd6)Oi>nciRM@8|eudgrfwMqj; z8RVcSqfCnO8cAImDavqO=XYn{ye{Nb9(G<^m)X#iH3xet%6dL&>8&V_^L`^csHF{b zs8RXb+O`iUQH^-(*+`Bo592k8Bg?~h-KhQK*wA9+Ti>Ra=M-=Dvs+JI-Tm|}rC(() z*C@YnP-8!(-%B}5K8*botw5~iNNcR=5g;cUUcKa$y zUtZ;XOGR;1I&~)>{ks|4ZHag?N-z2A%6p?^#;Z|!<2_Avy+ZTGci-weGTuwu%41`9 zN#@}0Codt!*3z#==1Z?Hey`Q5wA|0ga`DqaQY;Bpa?8Q${;_GwI zZv3^5HGGTH_}fhrpe?K6ZR9jKKsh?d5MM3H)8DAVkfJK|)k59t{G%wFA$~=j!p9|ikZ)j^DIzL0 zDj~s~VCt2WZcZH^6>T=Pj0lft=j+=(sDmjvDIu$s{k{`oRKNCud!6dW?)_!={w~_p z$LlsM=W|Ar$mfd75uo|iZep}rNPymIem?o*YiBw(c5z9GN%0LHHzp?4H_$uUMIMt) zEqw!vvzULX?$4E4xlkrH=>68atJA@kypcb7FF8mba-_x+yv;$u!PvGEa_5j8EbSQZfn>KR%u}lj76kOoO{e z+SU$!c)&1IbaG-MNzyvHy1Lj_^o@u#g@sBj$Hb?lBt&I}7zZZ-pVYTMlo^$fVI~np zHntaMjzZZs=UGXg)aFqX;xbexVlQ?4eH?&(tc16ZB0^q{_x~8l`N5A zK7O|1M~2bVQd0kR(OJ<6W>ZX5depd7bJRprj5#wt+MMQXl0Dqb(jQT4miz1y;nE}S zyVi<7Ri@TVB|5U*YRhjwslS?ke)12FRU*RzLrM>ZKejgRt1{?A{eD+%6o0BrZTwng z=zS5ErFj?+?n2{P~3!r*jPRk-VCEDT&?_}Gk8 z0+7rprb%&TJ@yvuEiomYuAiKe9-o|~2ejyfj2Ke0*K`SfMW2tdB^Xa)J<`?HLmhES z;&P04iBf8h4hiZK8P+X=f$kgZ;v$Qtlw@0mUFBV9SRb|&ZJ3lApKdlqMNdphp2Ut~ z&8{xJy1QtHBWqg*bsxws0$f}|BYF{aAI&hQrKeF0Q-V3uoRDVn_xAR2m5n~$-u|{d z+K!Q$k&)()XQdj!sWbO)HhyBB>(=^zBO~C`L+hLPC5} ztUjR-VNBzbQ%z}cM35L$T6z?PFyU6S?Y=&H@a(&PNn;@^+h1>>et(AEWZdYBoV#3#`QjIIV#civ7ab)L_m%f;nHP777?AMRW zwz~BK9h{$VobVX?cXC$UouAN;>nTUqt}U)ttG#~kvRkS*FSTykqB^chn-ZV5E@+|F zs-5_-QXvT$&T7exTJ{o?R|ng{rEna)#3vP>-Vbneuc}Q-tkgI_)fOdJys*g2)2Bq` zD7I`DeYl=lO>4Qhsa9dB$?faUwyoZ_=*dOnw?(Xu==519E-{+^dj3mf@z(#4#i}KX zZL5<;CF-Qy{CkyO^)4o=-ZO6bgcedKs+(q7+E%NutY-B~2euqoIcMeM@soS6444x@ z13z%j(My!*1{bZrx6<#~=Y5pu-h6v1<@T+jUO7q6W2t^dzfh}dHJ1g~R;qIs248*p z)#guEe=7ZYusLWRt=q7uYhB~c#a~-WFGU|=kLo!oQbijANlw8SGLc2 zWy&k#j*RQyslRmS|7Eav-P<%qrYAc76=A_aaa;Iexc8;~8XldYYAq4UjF{!(wu=6|0}EHSt$Ovu)>S!^ zb7K0&`1YlR8y5|WF%|!w#k#0hciCcjl?mHr`l^FcRcpDDX#MgZ5Uo$^6=W|XzdE7( z-q`lrqxHg7O?y46lD(1<05>yAL@s02tzKmVjDihF;7iBI7<6z zRbB1csurlL)p}`}w(X^k&g&{nZl+XL>T0H!nHW~z*Titl>8}o%zdkWMqUW(pFttq# ztAlHwXs`OWv(g;$6^_-L`%kP*N*8XV|LqASu|NQesnHXOCBPNEPE`LS# ze|=*3P_NdqfvcX2+Y|1J@;ny4QSQVLTKVr;toQZmE?cbMIx)P##IWuUm>9O{6=W|X ze}joZGp!?9ufMNoy{XDy9mjq>T0f}gu}p-sMeFs!wfA{2p`rX}y`JyV{vN0CfqG8L zl;u97^^odP;Dh)`3XZF|24~I)Tu>QR;fiXIGX^)fqaD2QCtU@!=MKW3AM7oPo0PFV zeBh4&^h19PKs+X3A`+2=WXPG-qe#X5T}8-wxH6!(gEFwUwq|kd(iar1xR3JZ*Tk>S z8?WgtR5q^F3w4u9$iY0!#{w)uE;eB^-od9hieo6}!lMb-C4a}_zpOV)+2a3(`DLh5 zRZ4suCvXySQhpj|a1*!i6K>-U%48xI*3}j*wvM~i#+{cZnrJT3_wXy!!XSDiy9?Q%EUJ=!$w2QF>`FI-}P=HO? z47u9df_HHoCvXy{Q2r#ih?Bp+wqlG+mfCtw$`t>;CqXIjIh=fDZ?43A8gKvZA%hj5@a^bojILn=IgTm?>l;y#>c3ai$(Qwo!934GO`6CFaZ|i zVhy(AF#d(xaHB4pqXl|n95OK%E3p|L;Ua!O73#Se9zvnif|7q?R~=P5ziWhc{@;}? z@_k5s*;u-PX0q--kcO(luSu(-1I9zcd$Kj42N!AsGvi z2P;OlqRL0{lz~ERMV>#o3e{F0aMiBvTElH+S8eNiLE6>ts#q!&XOjD_(w<&2NR6Gz zK0a^D`Ja!XEbYKqP7vQeZ5?<%C>>Lj)sIrei%@khVR8}SG6V5Xm8wXX6Y+!pNU0y8%J;h zjaqZUfegHfPw^9)wqZRou^b=ZIv$|?LlKV!cn8uaF5ww(PEPQ1d)gCeKE{x+6S-ug zbfg7Xi1j#tGq{7gzKmCl#$3FOBlrRp{m3BtBL#Dik7M{5b^VEW7>yZNhYxWT61jF2 zN3Nn^AscE25Rot*PhdUv;}$#uXQ`8Sf_{C!n$nlf}xP1n~WfaZ7^094dLy) z?!fnG&v5RFY&?%+kRh%xxniDD{Wb}j?5<2E!F5bpoe1NavKuB>!Ye;zMhRTGODyT?^aY7Iz z+zdbj(%`g+r*%EF!@E8ys--x+mK=*}X&u{7LM1-=Lt<4VQXw&G36^3fKE+YohQu-t z>@JFB-|%`J-n|s%5iG#_xCT>iJ=TroH4{0#$7(Lm~6XOzgxioPf+LPT%q5F*LvI>5Ioux)34|hZ%Si7oZN) zXQYO_4uH%|nV5tZ@D8@%B4oz8i4bNhnYqS7X0K@*=NMvsc;m_?_)P&N9t2!F0XmmhV5`2#cgi{BLtaPffJ}Y znuZ&7Z$vWkBh#$xOFsM5XnGIMz+nvI0}mkr+E}6@Hex3(V@4EBg_+}c#o=h0J%$q( zEW{E#kC*TfZkst18qfa6Tc}kQzC){6`biw8Vc3J_@pNM(BMVp1Y9d_`y%Xq`_z3BV zWG0C-CS)gbS&z4{1=mqOg{br>Cq1bI4ID?+G$y)qPC6|-eSq8OpTWq+cI?52_yip@ z$p~&;`-Oj3jBTfjQ`t^Vir#Iww!v7h(Ct0rwsdPNCl=b;%hj6xmNOOY<;xwkvAK1$ zbvLV6dRC=jIv@_xSWiQxaY{DUeBLj>ej4ZiEAsNaKBmoh|Tj6mh7JT1XCGktqPQQsyYm7Hz2vHdip-xZ=B z-A(#mH-upVrr`;^fj4ms(k;J7OS-0X&#nkXEM{O0cH<;&qA}f8x^Nhx;>b^_dBi~v zi}j<}F5P?vW?~(r%kPEJ?L+DAJFyF2K)U}OD8yC|_@W2KU>e@SetZiThKLN6*4Tr+ zxID4!*f;WXne8&Hsxq8h5daxteP9f;k6BJ*sL624MFCFX4w^9ZdSD{vLxy7k4&gAe z7=|)5Wmw9P{1#p*<>$wXAuGey9|7nAGji}IK1XGSbR)>n?uM`N4XQD`WvBibdFK`8& zCo=`(Kll=jvuJEYBM(-*jSct=H&H8_FoQA3MlNipk4v@J^IC9uDYNX8<;}7ZoFpfb z139`J_4}eDw`K2gbUEtwDOAB!x-|wqM$YjXTps6o1(}!w4OT42O7tK~55!}57M86% zZNrcFd>SWzPY`Ob5P7iTU2Me%PtrEiIb(i`K7~FQk7Ic2X)X(J1*T^>@w|59;^`x& zj}%?c?cTcEwq#q!RUiLO7o5KMs(Zn!%QSiSEc>@Tv{^Ts4Jf!yYnk<20v7E-`{ZW3X20n|QhVWMpv703?G1c_id42gVv!4}{2drU<&Q)L zR$wKJM){uQ2pU8hX9|o4a;6caksgN8P%BuL#wjeS0-Ej2uE}(ly0&{HIX_94;r#VG zlSPtsr>UeJr45bd`+;R?!s^qwT1FFe#0X5mB5Z{;@g+D=-O|(#pe}l&55^%HMi-E# zzoisEv`Kl@wX8hXA|o`ngK;);$K?EeCyP?Sq2yWP-E&AUqZ7SICt88MkPdYY=W!EW zbgm8QtYP^mq)bvCDTk5wlKGZAuYzSwQRYAA^$H5ns;D4gv$#4&wK<$*BNoXB zpG!x>bZE%Rq51FwD$Qd~#CCL_PbQ%*U_H7c5>qrTPM1(oH@@^ccSQc(xOL;)!6OHc zoV&sD-h(&x@{hN6|M5SCKT(;1{&Dwg2^HMaX|8R$T*pETk^1tqJ=GHM5yR;Yyi}I%vr9co=n&!g3?(ps_rK!Kj>(EI$dO zk`~R?C#iexSuY|%4{EI^Cc~)7xhx;TVSEpxW}T_k*_eYjVbt^vmcPMugj3^2%@1dJ zJ@TPY^F~Y9z1bp7}E zi=i+mR5U{mlxn6bw);=Aq306q@ONGX-%M9esE({H_}N9B=ukaC2~Yx+4vHVoK}wMI zu!ovtccpu&luDrWx~rP-TUU3mpSqmYLH1LZvpU#*YJGK?!hG#&r-XJ^23vjVlu4R zwcSPvrfb=)BD-xDtk`Y4V5{9`va>S8Ufby_OVve){kAh!m#X6sdu^w$EVEy`Z5N{0 zZMzVA%@m>pkltE-($&(FFkOQgUu8G8zsKUt9e!6%7pf7qu?-SDVz3H7V}u*G zy&(V3Kqq&upm74-Jh&|e`LU)qJC)zk$*;xa=TP!PANl=CpIThe;S~5<%)|Cgk6g>h zxr$8f{j7m=)h5=J!K%qRb*|ddl1$DxMOHX_Q)WUThbzg2e2pyM+{%}wYfYRAHsw6I z71w<}`gaua4S?KnmmA!2Pg(Bc%3V{rJt;Q^VtANabRZd=0a%n5)*dzB^a-v3@gG^>XDi3Z+swlTv0_ z8|A3A)p-SZ{6ftzFDRDssx5@GsPea!Uo!-H#gA}1iBP)G#L)BOo>CxV z8m&8Vg4%`98qT!>!R+DyrH!(GAcK1Zk&r0XJc=k7Lx7lobas$MtR-xACusFrV7)b4 z9cl?>=g+e9Ty}n%oeyEhiRjAC-MSLb+4%@|{=)#i`()pT*!KB?iOge>fDAl=*|1h8=&WGjRcydc?7a zBj#h7HyaR5Ngu_h%n2t@X&7M{-O(FX<_Y=T4)6ybjjdi29}{bJ%VYNj%t~FgZ(oJ=Iwmq~lCc=eu$AGn2M20U{zEJ%HQ6y**J6jr z!&1m^JKw|SxPtiFoXo+$4&Uix1jfLEr%<19)(oQ?QA$igHgd5T8?hNjAwL!S-on#O z1T^O6BgVjtNyx@g9LH_kL9-@&AA|lFh)KxCi})w@;Q%ri=u@CUez}#8jW~!yIExG5 z{D+=}dT4-7=z=jAha4=x6?_S&)|{`Q8CoJ0@@t;A4D^ zZ`*Ku&$jx{fWmq0i8xHabUY3Jc6^(Gkr;zHn1|Q!CceZC)bM7^AsjuCg{d&2+n4R> z3#j44n8bX4PGbFO|MM(dfEvhcYqUf=yxf6DxUkGO^4AZiHH@idlWCC=dz(t_#P zXxEWmk4KS>m#`WE53&!$BEiCw{NiQ-_Td1YdWZ;vkj|Xf<1svgx9~PXyAVl`jx0Qf z7qGW0H;CXHO08i8%=i$;ur!Qxs1(jDhv#8g&Qtg9L~wnV5s7eW^VJp%Zej5c0#1BdFJpK8E+O7he5o|7QK^4EQe`29P@p#86De z6zq~qU*ooaZ@ed0dScn+G zgn&3CVl`gJ$4qNSU>-&A$A54Q^+$6_g>dvlGBWTahREuFILkPNHdMtehoAE9h z#F23<#tK;E%h$JY6?f1+p3Vce2~2+oLPv~49B!m=ii6gV(!;SBFJL1!<2X*?77F2+ z%J4=fbir6eBM(bbY5zA_SdSw(2B$Ov3<3~@I7~zymSDgn=3_jK8Mui;giq#@8SzL& zE|y>$cA-KR`$au8Kwk{Vvd|vcghdRW!jM4}qA>%ru?TtCfK9mh7zaet$2l{>YOF;y z_T`4Dn1(zo#dhq&1zbV!G-?BKGLd27NzNt~K)&L68OB*esk4USlZ9+f2rMv85_UXG zZ-$&4^u=(Dg2PPxBw^od3W)FVBaD-ThvzU+_2bELF2fErP#b|cbRZ1DBgjNHJm(WS z(E@ES81m&r5>g?z#+}d%t>Kg*@aEUCw&sq2f+gZXPKam8pBkL*<{bY`i+S>Dz1{Urf6yUHRx8RVg@URy`d8 zUds;aDJkkJj49jy5we7y;i>fIT?NI_trCZl|4-!Z+Dd9ct2lME>QqQY70&0+vUD!k zAFl>FEUf6ZF+m-usv*`viE4}B)(fJmv6rq;Qm^=rxUpNcEl(cfC4Vy5k=34%S2=>b z%26B(E=*S&I?MfRAE&&j>H!bQgKU*N$!p)EMls(RWw@G&*4)*>hU4>QZA0ObK& zl5Fdm$JF-q?!AJSt1*2KB(whWF*UGJ=>*cYCHIqL+fSKfex;Jd*-z$MD%m*u$$W~F z)v+CXq`hQvU2Eh`Pd3zkvfxt5BJ3v%DwV9a{bU_VB@4HoEU;9v&i0ett$)1;!S<8g zZ3R7cY36K%=S*4A0R5ynTPxBdT z%^bC9)p;y2WNm-4-5Q>wwyYq3yxp3TqmH#~VEslEU=udu9c;n7*otk~jvd$u`Sg3d zzK`A5gT43w`yku*^LhXW@ew}8AsmKmFVs2QIclvxPkl3QzM9~&BVw@aZ;F3r&6uxR tBn&H0*0kQ5uVzW2m2EmW&i{6C3?BGUi> delta 19304 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