diff --git a/PDP18B/pdp18b_cpu.c b/PDP18B/pdp18b_cpu.c index fe799ae3..b2a7562f 100644 --- a/PDP18B/pdp18b_cpu.c +++ b/PDP18B/pdp18b_cpu.c @@ -433,7 +433,7 @@ static const int32 api_ffo[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const int32 api_vec[API_HLVL][32] = { +int32 api_vec[API_HLVL][32] = { { ACH_PWRFL }, /* API 0 */ { ACH_DTA, ACH_MTA, ACH_DRM, ACH_RF, ACH_RP, ACH_RB }, /* API 1 */ { ACH_PTR, ACH_LPT, ACH_LPT }, /* API 2 */ diff --git a/PDP18B/pdp18b_defs.h b/PDP18B/pdp18b_defs.h index 0bdce5f9..411cb9b5 100644 --- a/PDP18B/pdp18b_defs.h +++ b/PDP18B/pdp18b_defs.h @@ -1,6 +1,6 @@ /* pdp18b_defs.h: 18b PDP simulator definitions - Copyright (c) 1993-2012, 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"), @@ -23,6 +23,8 @@ 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-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 22-May-10 RMS Added check for 64b definitions 30-Oct-06 RMS Added infinite loop stop @@ -82,6 +84,7 @@ Type 647B line printer (sixbit) Type 550/555 DECtape Type 24 serial drum + RB09 fixed head disk (Unix V0 only) PDP9 32K KE09A EAE KSR-33 Teletype KF09A auto pri intr PC09A paper tape reader and punch @@ -90,6 +93,7 @@ KX09A mem protection LP09 line printer (ASCII) RF09/RS09 fixed head disk RB09 fixed head disk + RM09 drum TC59 magnetic tape TC02/TU55 DECtape LT09A additional Teletypes @@ -139,12 +143,14 @@ #define TYPE647 0 /* sixbit printer */ #define TYPE550 0 /* DECtape */ #define DRM 0 /* drum */ +#define RB 0 /* fixed head disk */ #elif defined (PDP9) #define ADDRSIZE 15 #define TYPE647 0 /* sixbit printer */ #define LP09 0 /* ASCII printer */ #define RB 0 /* fixed head disk */ #define RF 0 /* fixed head disk */ +#define DRM 0 /* drum */ #define MTA 0 /* magtape */ #define TC02 0 /* DECtape */ #define TTY1 4 /* second Teletype(s) */ @@ -158,6 +164,7 @@ #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 @@ -275,6 +282,7 @@ typedef struct { #define DEV_TTI1 041 /* extra terminals */ #define DEV_TTO1 040 #define DEV_DRM 060 /* drum */ +#define DEV_DR 060 /* DR15 */ #define DEV_RP 063 /* RP15 */ #define DEV_LPT 065 /* line printer */ #define DEV_RF 070 /* RF09 */ @@ -324,6 +332,8 @@ typedef struct { 36 - 37 - + The DR15C uses four API channels that are assigned by software. + On the PDP-9, any API level active masks PI, and PI does not mask API. On the PDP-15, only the hardware API levels active mask PI, and PI masks the API software levels. */ @@ -441,6 +451,17 @@ typedef struct { #define CLR_INT(dv) int_hwre[API_##dv] = int_hwre[API_##dv] & ~INT_##dv #define TST_INT(dv) (int_hwre[API_##dv] & INT_##dv) +/* The DR15C uses the same relative bit position in all four interrupt levels. + This allows software to have a single definition for the interrupt bit position, + regardless of level. The standard macros cannot be used. */ + +#define INT_V_DR 7 /* to left of all */ +#define INT_DR (1 << INT_V_DR) +#define API_DR0 0 +#define API_DR1 1 +#define API_DR2 2 +#define API_DR3 3 + /* I/O status flags for the IORS instruction bit PDP-4 PDP-7 PDP-9 PDP-15 diff --git a/PDP18B/pdp18b_drm.c b/PDP18B/pdp18b_drm.c index d0448003..f65a053a 100644 --- a/PDP18B/pdp18b_drm.c +++ b/PDP18B/pdp18b_drm.c @@ -1,6 +1,6 @@ -/* pdp18b_drm.c: drum/fixed head disk simulator +/* pdp18b_drm.c: drum head disk simulator - Copyright (c) 1993-2013, 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"), @@ -23,8 +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. - drm (PDP-4,PDP-7) Type 24 serial drum + drm (PDP-4,PDP-7) Type 24 serial drum; (PDP-9) RM09 drum + 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 26-Oct-03 RMS Cleaned up buffer copy code @@ -37,6 +38,8 @@ 10-Jun-01 RMS Cleaned up IOT decoding to reflect hardware 26-Apr-01 RMS Added device enable/disable support 14-Apr-99 RMS Changed t_addr to unsigned + + Variable drum sizes are not supported. */ #include "pdp18b_defs.h" @@ -118,7 +121,7 @@ DEVICE drm_dev = { 1, 8, 20, 1, 8, 18, NULL, NULL, &drm_reset, &drm_boot, NULL, NULL, - &drm_dib, DEV_DISABLE + &drm_dib, DEV_DISABLE + DEV_DIS }; /* IOT routines */ diff --git a/PDP18B/pdp18b_dt.c b/PDP18B/pdp18b_dt.c index 8cfcc276..e3a9e948 100644 --- a/PDP18B/pdp18b_dt.c +++ b/PDP18B/pdp18b_dt.c @@ -1,6 +1,6 @@ /* pdp18b_dt.c: 18b DECtape simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2015, 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 + 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 Revised Type 550 header based on DECTOG formatter 13-Jun-06 RMS Fixed checksum calculation bug in Type 550 @@ -327,6 +329,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 dtsa = 0; /* status A */ @@ -419,6 +422,9 @@ REG dt_reg[] = { DT_NUMDR, REG_HRO) }, { ORDATA (DEVNO, dt_dib.dev, 6), REG_HRO }, { FLDATA (STOP_OFFR, dt_stopoffr, 0) }, +#if defined (TC02) + { ORDATA (APIVEC, api_vec[API_DTA][INT_V_DTA], 6), REG_HRO }, +#endif { NULL } }; @@ -1508,7 +1514,7 @@ if (uptr->WRITTEN && uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) { /* any ((fbuf[ba + 1] >> 12) & 077); pdp8b[k + 2] = fbuf[ba + 1] & 07777; ba = ba + 2; - } /* end loop blk */ + } /* end loop blk */ fxwrite (pdp8b, sizeof (uint16), D8_NBSIZE, uptr->fileref); if (ferror (uptr->fileref)) break; diff --git a/PDP18B/pdp18b_lp.c b/PDP18B/pdp18b_lp.c index 7588ff09..03d66bbf 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-2008, Robert M Supnik + Copyright (c) 1993-2015, 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,7 @@ lp09 (PDP-9,15) LP09 line printer lp15 (PDP-15) LP15 line printer + 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 14-Jan-04 RMS Revised IO device call interface @@ -47,7 +48,10 @@ */ #include "pdp18b_defs.h" + extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; + const char fio_to_asc[64] = { ' ','1','2','3','4','5','6','7','8','9','\'','~','#','V','^','<', '0','/','S','T','U','V','W','X','Y','Z','"',',','>','^','-','?', @@ -534,6 +538,7 @@ REG lp09_reg[] = { { DRDATA (TIME, lp09_unit.wait, 24), PV_LEFT }, { FLDATA (STOP_IOE, lp09_stopioe, 0) }, { ORDATA (DEVNO, lp09_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_LPT][INT_V_LPT], 6), REG_HRO }, { NULL } }; @@ -720,6 +725,7 @@ REG lp15_reg[] = { { FLDATA (STOP_IOE, lp15_stopioe, 0) }, { BRDATA (LBUF, lp15_buf, 8, 8, LP15_BSIZE) }, { ORDATA (DEVNO, lp15_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_LPT][INT_V_LPT], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_mt.c b/PDP18B/pdp18b_mt.c index 7f552741..ed7eb53f 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-2008, Robert M Supnik + Copyright (c) 1993-2015, 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,7 @@ mt (PDP-9) TC59 magtape (PDP-15) TC59D magtape + 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 16-Aug-05 RMS Fixed C++ declaration and cast problems @@ -126,6 +127,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 mt_cu = 0; /* command/unit */ @@ -178,6 +180,7 @@ REG mt_reg[] = { { URDATA (POS, mt_unit[0].pos, 10, T_ADDR_W, 0, MT_NUMDR, PV_LEFT | REG_RO) }, { ORDATA (DEVNO, mt_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_MTA][INT_V_MTA], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_rf.c b/PDP18B/pdp18b_rf.c index 9f78c285..583942e0 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-2013, Robert M Supnik + Copyright (c) 1993-2015, 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,7 @@ rf (PDP-9) RF09/RF09 (PDP-15) RF15/RS09 + 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 15-May-06 RMS Fixed bug in autosize attach (David Gesswein) @@ -110,6 +111,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 rf_sta = 0; /* status register */ @@ -157,6 +159,7 @@ REG rf_reg[] = { { FLDATA (STOP_IOE, rf_stopioe, 0) }, { DRDATA (CAPAC, rf_unit.capac, 31), PV_LEFT + REG_HRO }, { ORDATA (DEVNO, rf_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_RF][INT_V_RF], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_rp.c b/PDP18B/pdp18b_rp.c index 398061da..8cfad45d 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-2008, Robert M Supnik + Copyright (c) 1993-2015, 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 + 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 05-Oct-02 RMS Added DIB, device number support @@ -133,6 +134,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1], nexm; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 rp_sta = 0; /* status A */ @@ -188,6 +190,7 @@ REG rp_reg[] = { { DRDATA (STIME, rp_swait, 24), PV_LEFT }, { DRDATA (RTIME, rp_rwait, 24), PV_LEFT }, { ORDATA (DEVNO, rp_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_RP][INT_V_RP], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index 5d217714..1437c927 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-2012, Robert M Supnik + Copyright (c) 1993-2015, 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 + 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 Revised clk and tti scheduling 18-Jun-07 RMS Added UNIT_IDLE to console input, clock @@ -86,6 +88,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1], PC, ASW; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 clk_state = 0; @@ -181,6 +184,7 @@ REG clk_reg[] = { #endif { DRDATA (TIME, clk_unit.wait, 24), REG_NZ + PV_LEFT }, { DRDATA (TPS, clk_tps, 8), PV_LEFT + REG_HRO }, + { ORDATA (APIVEC, api_vec[API_CLK][INT_V_CLK], 6), REG_HRO }, { NULL } }; @@ -228,6 +232,7 @@ REG ptr_reg[] = { { DRDATA (POS, ptr_unit.pos, T_ADDR_W), PV_LEFT }, { DRDATA (TIME, ptr_unit.wait, 24), PV_LEFT }, { FLDATA (STOP_IOE, ptr_stopioe, 0) }, + { ORDATA (APIVEC, api_vec[API_PTR][INT_V_PTR], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_sys.c b/PDP18B/pdp18b_sys.c index ecb10bb8..fe619e1f 100644 --- a/PDP18B/pdp18b_sys.c +++ b/PDP18B/pdp18b_sys.c @@ -1,6 +1,6 @@ /* pdp18b_sys.c: 18b PDP's simulator interface - 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"), @@ -23,6 +23,8 @@ 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) + 13-Sep-15 RMS Added DR15C instructions 30-Oct-06 RMS Added infinite loop stop 18-Oct-06 RMS Re-ordered device list 02-Oct-06 RMS Added RDCLK instruction @@ -103,6 +105,8 @@ 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 @@ -126,7 +130,7 @@ char sim_name[] = "PDP-15"; REG *sim_PC = &cpu_reg[0]; -int32 sim_emax = 2; +int32 sim_emax = 3; DEVICE *sim_devices[] = { &cpu_dev, @@ -501,6 +505,12 @@ static const char *opcode[] = { "DTCA", "DTRA", "DTXA", "DTLA", "DTEF", "DTRB", "DTDF", #endif +#if defined (DR) /* 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", @@ -738,6 +748,12 @@ 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) + 0706001+I_NPI, 0706002+I_NPI, 0706006+I_NPI, + 0706112+I_NPI, 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 #if defined (PDP7) 0703201+I_NPI, 0703301+I_NPI, 0703341+I_NPI, 0703302+I_NPI, 0707701+I_NPI, 0707702+I_NPI, 0707742+I_NPI, 0707704+I_NPI, @@ -885,13 +901,13 @@ static const int32 opc_val[] = { #define fputs(_s,f) Fprintf(f,"%s",_s) #define fputc(_c,f) Fprintf(f,"%c",_c) -int32 fprint_opr (FILE *of, int32 inst, int32 class, int32 sp) +int32 fprint_opr (FILE *of, int32 inst, int32 clss, int32 sp) { int32 i, j; for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ - if ((j == class) && (opc_val[i] & inst)) { /* same class? */ + if ((j == clss) && (opc_val[i] & inst)) { /* same class? */ inst = inst & ~opc_val[i]; /* mask bit set? */ fprintf (of, (sp? " %s": "%s"), opcode[i]); sp = 1; @@ -924,52 +940,78 @@ return (c >> 1) | (c << 5); t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, UNIT *uptr, int32 sw) { -int32 cflag, i, j, k, sp, inst, disp, ma; +int32 i, j, k, sp, inst, disp, ma; +t_bool cflag; +DEVICE *dptr; + +if (uptr == NULL) + uptr = &cpu_unit; +dptr = find_dev_from_unit (uptr); +if (dptr == NULL) + return SCPE_IERR; inst = val[0]; -cflag = (uptr == NULL) || (uptr == &cpu_unit); -if (sw & SWMASK ('A')) { /* ASCII? */ +if ((sw & SWMASK ('A')) != 0) { /* ASCII? */ if (inst > 0377) return SCPE_ARG; fprintf (of, FMTASC (inst & 0177)); return SCPE_OK; } -if (sw & SWMASK ('C')) { /* character? */ +#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? */ + return SCPE_ARG; + +if ((sw & SWMASK ('C')) != 0) { /* character? */ fprintf (of, "%c", SIXTOASC ((inst >> 12) & 077)); fprintf (of, "%c", SIXTOASC ((inst >> 6) & 077)); fprintf (of, "%c", SIXTOASC (inst & 077)); return SCPE_OK; } -#if defined (PDP4) || defined (PDP7) -if (sw & SWMASK ('F')) { /* FIODEC? */ +if ((sw & SWMASK ('F')) != 0) { /* FIODEC? */ fprintf (of, "%c", fio_to_asc[(inst >> 12) & 077]); fprintf (of, "%c", fio_to_asc[(inst >> 6) & 077]); fprintf (of, "%c", fio_to_asc[inst & 077]); return SCPE_OK; } -if (sw & SWMASK ('B')) { /* Baudot? */ +if ((sw & SWMASK ('B')) != 0) { /* Baudot? */ fprintf (of, "%c", baud_to_asc[rar (inst >> 12) & 077]); fprintf (of, "%c", baud_to_asc[rar (inst >> 6) & 077]); fprintf (of, "%c", baud_to_asc[rar (inst) & 077]); return SCPE_OK; } -#endif -#if defined (PDP15) -if (sw & SWMASK ('P')) { /* packed ASCII? */ - i = val[1]; +#if defined (PDP7) || defined (PDP9) +if ((sw & SWMASK ('U')) != 0) { /* Unix v0 ASCII? */ + fprintf (of, FMTASC ((inst >> 9) & 0177)); + fprintf (of, FMTASC (inst & 0177)); + return SCPE_OK; + } +#elif defined (PDP15) +if ((sw & SWMASK ('P')) != 0) { /* packed ASCII? */ + int32 t = val[1]; fprintf (of, FMTASC ((inst >> 11) & 0177)); fprintf (of, FMTASC ((inst >> 4) & 0177)); - fprintf (of, FMTASC (((inst << 3) | (i >> 15)) & 0177)); - fprintf (of, FMTASC ((i >> 8) & 0177)); - fprintf (of, FMTASC ((i >> 1) & 0177)); + fprintf (of, FMTASC (((inst << 3) | (t >> 15)) & 0177)); + fprintf (of, FMTASC ((t >> 8) & 0177)); + fprintf (of, FMTASC ((t >> 1) & 0177)); return -1; } +if ((sw & SWMASK ('U')) != 0) { /* Unibus ASCII? */ + fprintf (of, FMTASC (inst & 0177)); + fprintf (of, FMTASC ((inst >> 8) & 0177)); + return SCPE_OK; + } #endif -if (!(sw & SWMASK ('M'))) +if ((sw & SWMASK ('M')) == 0) /* symbolic? */ return SCPE_ARG; /* Instruction decode */ +cflag = (uptr == &cpu_unit); +inst = val[0]; for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ if ((opc_val[i] & DMASK) == (inst & masks[j])) { /* match? */ @@ -1099,15 +1141,22 @@ return get_uint (cptr, 8, 0777777, status); Outputs: status = error status */ - t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw) { -int32 cflag, d, i, j, k, sign, damask, epcmask; +int32 d, i, j, k, sign, damask, epcmask; t_stat r, sta = SCPE_OK; char gbuf[CBUFSIZE]; +t_bool cflag; +DEVICE *dptr; -cflag = (uptr == NULL) || (uptr == &cpu_unit); -while (isspace (*cptr)) cptr++; +if (uptr == NULL) + uptr = &cpu_unit; +dptr = find_dev_from_unit (uptr); +if (dptr == NULL) + return SCPE_IERR; + +while (isspace (*cptr)) + cptr++; for (i = 1; (i < 5) && (cptr[i] != 0); i++) { if (cptr[i] == 0) { for (j = i + 1; j <= 5; j++) @@ -1120,6 +1169,21 @@ 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 */ + if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */ if (cptr[0] == 0) /* must have 1 char */ return SCPE_ARG; @@ -1128,8 +1192,16 @@ if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */ ((t_value) cptr[2] & 077); return SCPE_OK; } -#if defined (PDP15) -if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */ +#if defined (PDP7) || defined (PDP9) +if (sw & SWMASK ('U')) { /* Unix v0 ASCII? */ + if (cptr[0] == 0) /* must have 1 char */ + return SCPE_ARG; + val[0] = (((t_value) cptr[0] & 0177) << 9) | + ((t_value) cptr[1] & 0177); + return SCPE_OK; + } +#elif defined (PDP15) +if (sw & SWMASK ('P')) { /* packed string? */ if (cptr[0] == 0) /* must have 1 char */ return SCPE_ARG; val[0] = (((t_value) cptr[0] & 0177) << 11) | @@ -1140,6 +1212,13 @@ if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */ (((t_value) cptr[4] & 0177) << 1); return -1; } +if (sw & SWMASK ('U')) { /* Unibus ASCII? */ + 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; + } #endif cptr = get_glyph (cptr, gbuf, 0); /* get opcode */ @@ -1149,6 +1228,7 @@ if (opcode[i] == NULL) val[0] = opc_val[i] & DMASK; /* get value */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ +cflag = (uptr == &cpu_unit); switch (j) { /* case on class */ case I_V_XR: /* index */ diff --git a/PDP18B/pdp18b_tt1.c b/PDP18B/pdp18b_tt1.c index 41cff857..17d37f3e 100644 --- a/PDP18B/pdp18b_tt1.c +++ b/PDP18B/pdp18b_tt1.c @@ -1,6 +1,6 @@ /* pdp18b_ttx.c: PDP-9/15 additional terminals simulator - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2015, 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 @@ ttix,ttox LT15/LT19 terminal input/output + 13-Sep-15 RMS Added APIVEC register 11-Oct-13 RMS Poll TTIX immediately to pick up initial connect 18-Apr-12 RMS Revised to use clock coscheduling 19-Nov-08 RMS Revised for common TMXR show routines @@ -63,6 +64,7 @@ TMXR ttx_desc = { 1, 0, 0, ttx_ldsc }; /* mux descriptor */ #define ttx_lines ttx_desc.lines /* current number of lines */ extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern int32 tmxr_poll; extern int32 stop_inst; @@ -105,6 +107,9 @@ REG ttix_reg[] = { { FLDATA (INT, int_hwre[API_TTI1], INT_V_TTI1) }, { DRDATA (TIME, ttix_unit.wait, 24), REG_NZ + PV_LEFT }, { ORDATA (DEVNUM, ttix_dib.dev, 6), REG_HRO }, +#if defined (PDP15) + { ORDATA (APIVEC, api_vec[API_TTI1][INT_V_TTI1], 6), REG_HRO }, +#endif { NULL } }; @@ -164,6 +169,9 @@ REG ttox_reg[] = { { FLDATA (INT, int_hwre[API_TTO1], INT_V_TTO1) }, { URDATA (TIME, ttox_unit[0].wait, 10, 24, 0, TTX_MAXL, PV_LEFT) }, +#if defined (PDP15) + { ORDATA (APIVEC, api_vec[API_TTO1][INT_V_TTO1], 6), REG_HRO }, +#endif { NULL } }; diff --git a/Visual Studio Projects/PDP7.vcproj b/Visual Studio Projects/PDP7.vcproj index 4897908a..a82ee620 100644 --- a/Visual Studio Projects/PDP7.vcproj +++ b/Visual Studio Projects/PDP7.vcproj @@ -212,6 +212,10 @@ RelativePath="..\PDP18B\pdp18b_mt.c" > + + diff --git a/doc/pdp18b_doc.doc b/doc/pdp18b_doc.doc index 4ebc5013..beacda79 100644 Binary files a/doc/pdp18b_doc.doc and b/doc/pdp18b_doc.doc differ