From 48ba877259b01f0b306fe47b7d9987558eb27df1 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 28 Dec 2012 08:10:30 -0800 Subject: [PATCH] Added VAX 11/785 model variation to the VAX 11/780 simulator based on VAX 8600/8650 model variants and some information from Matt Burke's VAX 11/785 page at 9track.net --- VAX/vax780_defs.h | 14 ++++++++++++++ VAX/vax780_sbi.c | 24 +++++++++++++++++++++++- VAX/vax780_stddev.c | 20 ++++++++++++++++---- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/VAX/vax780_defs.h b/VAX/vax780_defs.h index a3506d5c..8c426022 100644 --- a/VAX/vax780_defs.h +++ b/VAX/vax780_defs.h @@ -56,6 +56,8 @@ /* Microcode constructs */ #define VAX780_SID (1 << 24) /* system ID */ +#define VAX780_TYP (0 << 23) /* sys type: 780 */ +#define VAX785_TYP (1 << 23) /* sys type: 785 */ #define VAX780_ECO (7 << 19) /* ucode revision */ #define VAX780_PLANT (0 << 12) /* plant (Salem NH) */ #define VAX780_SN (1234) @@ -68,6 +70,10 @@ #define VER_WCSP (VER_FPLA) /* WCS primary version */ #define VER_WCSS 0x12 /* WCS secondary version */ #define VER_PCS ((VER_WCSS >> 4) & 0x3) /* PCS version */ +#define VER_WCSP_785 0x01 /* 785 WCS primary version */ +#define VER_WCSS_785 0x00 /* 785 WCS secondary version */ +#define VER_PCS_785 0x04 /* 785 PCS version */ +#define VER_MTCH_785 0x04 /* 785 PCS/WCS primary version */ /* Interrupts */ @@ -142,6 +148,11 @@ #define LP_MBZ84_TEST(r) if ((((uint32)(r)) & 0xF8C00000) != 0) RSVD_OPND_FAULT #define LP_MBZ92_TEST(r) if ((((uint32)(r)) & 0x7FC00000) != 0) RSVD_OPND_FAULT +/* CPU */ + +#define CPU_MODEL_MODIFIERS \ + { MTAB_XTD|MTAB_VDV, 0, "MODEL", "MODEL={785|780}", \ + &cpu_set_model, &cpu_show_model }, /* Memory */ #define MAXMEMWIDTH 23 /* max mem, MS780C */ @@ -470,6 +481,9 @@ t_stat show_nexus (FILE *st, UNIT *uptr, int32 val, void *desc); void sbi_set_errcnf (void); int32 clk_cosched (int32 wait); +t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc); +t_stat cpu_show_model (FILE *st, UNIT *uptr, int32 val, void *desc); + #include "pdp11_io_lib.h" #endif diff --git a/VAX/vax780_sbi.c b/VAX/vax780_sbi.c index 76f39006..24ca0cf0 100644 --- a/VAX/vax780_sbi.c +++ b/VAX/vax780_sbi.c @@ -108,6 +108,7 @@ uint32 sbi_sc = 0; /* SBI silo comparator * uint32 sbi_mt = 0; /* SBI maintenance */ uint32 sbi_er = 0; /* SBI error status */ uint32 sbi_tmo = 0; /* SBI timeout addr */ +int32 sys_model = 0; /* 780 or 785 */ static char cpu_boot_cmd[CBUFSIZE] = { 0 }; /* boot command */ static t_stat (*nexusR[NEXUS_NUM])(int32 *dat, int32 ad, int32 md); @@ -389,7 +390,10 @@ switch (rg) { break; case MT_SID: /* SID */ - val = VAX780_SID | VAX780_ECO | VAX780_PLANT | VAX780_SN; + if (sys_model) + val = VAX780_SID | VAX785_TYP | VAX780_ECO | VAX780_PLANT | VAX780_SN; + else + val = VAX780_SID | VAX780_TYP | VAX780_ECO | VAX780_PLANT | VAX780_SN; break; default: @@ -814,3 +818,21 @@ for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { /* loop thru dev */ } /* end for */ return SCPE_OK; } + +t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc) +{ +if (cptr == NULL) return SCPE_ARG; +if (strcmp(cptr, "780") == 0) + sys_model = 0; +else if (strcmp(cptr, "785") == 0) + sys_model = 1; +else + return SCPE_ARG; +return SCPE_OK; +} + +t_stat cpu_show_model (FILE *st, UNIT *uptr, int32 val, void *desc) +{ +fprintf (st, "model=%s", (sys_model ? "785" : "780")); +return SCPE_OK; +} diff --git a/VAX/vax780_stddev.c b/VAX/vax780_stddev.c index a3bf1669..53af0285 100644 --- a/VAX/vax780_stddev.c +++ b/VAX/vax780_stddev.c @@ -110,6 +110,9 @@ #define COMM_WCSV 0153 /* WCS version */ #define COMM_WCSS 0154 /* WCS secondary */ #define COMM_FPLV 0155 /* FPLA version */ +#define COMM_MTCH_785 0153 /* 785 PCS/WCS version */ +#define COMM_WCSP_785 0154 /* 785 WCS version */ +#define COMM_WCSS_785 0155 /* 785 WCS secondary */ #define COMM_DATA 0x300 /* comm data return */ #define MISC_MASK 0xFF /* console data mask */ #define MISC_SWDN 0x1 /* software done */ @@ -1054,6 +1057,7 @@ return; t_stat fl_reset (DEVICE *dptr) { uint32 i; +extern int32 sys_model; fl_esr = FL_STAINC; fl_ecode = 0; /* clear error */ @@ -1065,10 +1069,18 @@ sim_cancel (&fl_unit); /* cancel drive */ fl_unit.TRACK = 0; for (i = 0; i < COMM_LNT; i++) comm_region[i] = 0; -comm_region[COMM_FPLV] = VER_FPLA; -comm_region[COMM_PCSV] = VER_PCS; -comm_region[COMM_WCSV] = VER_WCSP; -comm_region[COMM_WCSS] = VER_WCSS; +if (sys_model) { /* 785 */ + comm_region[COMM_WCSS_785] = VER_WCSS_785; + comm_region[COMM_WCSP_785] = VER_WCSP_785; + comm_region[COMM_MTCH_785] = VER_MTCH_785; + comm_region[COMM_PCSV] = VER_PCS_785; + } +else { /* 780 */ + comm_region[COMM_FPLV] = VER_FPLA; + comm_region[COMM_PCSV] = VER_PCS; + comm_region[COMM_WCSV] = VER_WCSP; + comm_region[COMM_WCSS] = VER_WCSS; + } comm_region[COMM_GH] = 1; return SCPE_OK; }