From 42d6f414fc428971a3db3c754eb75c4b42004743 Mon Sep 17 00:00:00 2001 From: Christian Gauger-Cosgrove Date: Thu, 16 Nov 2023 10:32:15 -1000 Subject: [PATCH] PDP11, VAX: Add MSCP RD33 and various SDI ESE SSD disk types to RQ devices --- PDP11/pdp11_rq.c | 208 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 183 insertions(+), 25 deletions(-) diff --git a/PDP11/pdp11_rq.c b/PDP11/pdp11_rq.c index 7f50648b..7aaedae0 100644 --- a/PDP11/pdp11_rq.c +++ b/PDP11/pdp11_rq.c @@ -241,23 +241,25 @@ struct rqpkt { /* The RQDX3 supports multiple disk drive types (x = not implemented): - type sec surf cyl tpg gpc RCT LBNs - + type sec surf cyl tpg gpc RCT LBNs notes + type sec surf cyl tpg gpc RCT LBNs notes + RX18 9 1 40 9 1 - 360 RX50 10 1 80 5 16 - 800 RX33 15 2 80 2 1 - 2400 - RD51 18 4 306 4 1 36*4 21600 - RD31 17 4 615 4 1 3*8 41560 - RD52 17 8 512 8 1 4*8 60480 - RD32 17 6 820 6 1 4*8 83204 -x RD33 17 7 1170 ? ? ? 138565 - RD53 17 8 1024 8 1 5*8 138672 - RD54 17 15 1225 15 1 7*8 311200 +x RD50 17 4 153 ? ? ? ? Seagate ST-506 + RD51 18 4 306 4 1 36*4 21600 Seagate ST-412 + RD31 17 4 615 4 1 3*8 41560 Seagate ST-225 + RD52 17 8 512 8 1 4*8 60480 Quantum 540, ATASI 3046, Evotek ET3540 + RD32 17 6 820 6 1 4*8 83204 Seagate ST-251 + RD33 17 7 1170 ? ? ? 138565 Microscience HH-1090 + RD53 17 8 1024 8 1 5*8 138672 Micropolis 1325, Micropolis 1335 + RD54 17 15 1225 15 1 7*8 311200 Maxtor XT-2190 The simulator also supports larger drives that only existed - on SDI controllers. + on SDI controllers (UDA50/UDA50A, KDA50, KDB50). RA60 42(+1) 6 1600 6 1 1008 400176 -x RA70 33(+1) 11 1507+ 11 1 ? 547041 + RA70 33(+1) 11 1507+ 11 1 ? 547041 RA80 31 14 559 ? ? ? 237212 RA81 51(+1) 14 1258 14 1 2856 891072 RA82 57(+1) 15 1435 15 1 3420 1216665 @@ -265,12 +267,33 @@ x RA70 33(+1) 11 1507+ 11 1 ? 547041 RA72 51(+1) 20 1921 20 1 2040 1953300 RA90 69(+1) 13 2656 13 1 1794 2376153 RA92 73(+1) 13 3101 13 1 949 2940951 -x RA73 70(+1) 21 2667+ 21 1 ? 3920490 + RA73 70(+1) 21 2667+ 21 1 ? 3920490 + ESE20 4 128 480 ? ? ? 245760 + ESE52 4 128 465 ? ? ? 238080 + ESE56 4 128 465 ? ? ? 1196544 + ESE58 4 128 465 ? ? ? 1915392 LESI attached RC25 disks (one removable, one fixed) - type sec surf cyl tpg gpc RCT LBNs - RC25 31 2 821 ? ? ? 50902 - RCF25 31 2 821 ? ? ? 50902 + type sec surf cyl tpg gpc RCT LBNs + RC25 31 2 821 ? ? ? 50902 + RCF25 31 2 821 ? ? ? 50902 + + DSSI attached ISEs, as the simulation currently stands the DSSI + devices are accessed in a pseudo-KFQSA manner -- the ISEs are + accessed as Storage System Port (SSP) devices, like the RQDX3 or + UDA50/KDA50; however the exact function of the KFQSA is not, neither + are the SHAC or EDA640 controllers. + + type sec surf cyl tpg gpc RCT LBNs + RF30 37 6 1320 ? ? ? 293040 + RF31 50 8 1861 ? ? ? 744400 + RF35 57 14 1861 ? ? ? 1485078 +x RF36 ? ? ? ? ? ? ? + RF71 37 16 1320 ? ? ? 781440 + RF72 50 21 1861 ? ? ? 1954050 + RF73 71 21 2621 ? ? ? 3907911 +x RF74 ? ? ? ? ? ? ? +x RF75 ? ? ? ? ? ? ? Each drive can be a different type. The drive field in the unit flags specified the drive type and thus, indirectly, @@ -285,6 +308,27 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define RQDF_RC DRVFL_TYPE_RC /* RC drive */ +/* The RX18 information comes from the VT-180 Series Technical Manual + * (EK-VT18X-TM-001) and from the MSCP specification document as well as + * references in the RSX-11/M+ documentation to the RX18 existing as a + * device attachable to the RUX50. + */ +#define RX18_DTYPE 33 +#define RX18_SECT 9 +#define RX18_SURF 1 +#define RX18_CYL 40 +#define RX18_TPG RD33_SURF +#define RX18_GPC 1 +#define RX18_XBN 0 +#define RX18_DBN 0 +#define RX18_LBN 360 +#define RX18_RCTS 0 +#define RX18_RCTC 0 +#define RX18_RBN 0 +#define RX18_MOD 17 +#define RX18_MED 0x25658012 +#define RX18_FLGS RQDF_RMV + #define RX50_SECT 10 #define RX50_SURF 1 #define RX50_CYL 80 @@ -541,6 +585,24 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define RD32_MED 0x25644020 #define RD32_FLGS RQDF_MFM +/* The RD33 information comes from the Ultrix-32 v4.5 disktab file and + * from Phil Budne's "dec.disks" file. + */ +#define RD33_SECT 17 +#define RD33_SURF 7 +#define RD33_CYL 1170 +#define RD33_TPG RD33_SURF +#define RD33_GPC 1 +#define RD33_XBN 54 +#define RD33_DBN 65 +#define RD33_LBN 138635 +#define RD33_RCTS 5 +#define RD33_RCTC 8 +#define RD33_RBN 317 +#define RD33_MOD 24 +#define RD33_MED 0x25644021 +#define RD33_FLGS 0 + #define RC25_SECT 50 /* */ #define RC25_SURF 8 #define RC25_CYL 1260 /* */ @@ -713,6 +775,76 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define RF73_MED 0x22646049 #define RF73_FLGS RQDF_DSSI /* DSSI drive */ +/* The ESE20 and the ESE5x information comes from the "ESE50 Solid State + * Disk User Guide" (EK-ESE50-UG.B01), and the "ESE20 Solid State Disk" + * brochure. + * + * The ESE5x models are named using their "media name" from the MSCP + * reference document. + */ + +#define ESE20_SECT 4 +#define ESE20_SURF 128 +#define ESE20_CYL 480 +#define ESE20_TPG ESE20_SURF +#define ESE20_GPC 1 +#define ESE20_XBN 0 +#define ESE20_DBN 0 +#define ESE20_LBN 245760 +#define ESE20_RCTS 0 +#define ESE20_RCTC 1 +#define ESE20_RBN 0 +#define ESE20_MOD 25 +#define ESE20_MED 0x254B3294 +#define ESE20_FLGS RQDF_SDI + +#define ESE52_SECT 4 +#define ESE52_SURF 128 +#define ESE52_CYL 465 +#define ESE52_TPG ESE52_SURF +#define ESE52_GPC 1 +#define ESE52_XBN 0 +#define ESE52_DBN 0 +#define ESE52_LBN 238080 +#define ESE52_RCTS 0 +#define ESE52_RCTC 1 +#define ESE52_RBN 0 +#define ESE52_MOD 31 +#define ESE52_MED 0x254B32B4 +#define ESE52_FLGS RQDF_SDI + +#define ESE56_SECT 4 +#define ESE56_SURF 128 +#define ESE56_CYL 2337 +#define ESE56_TPG ESE56_SURF +#define ESE56_GPC 1 +#define ESE56_XBN 0 +#define ESE56_DBN 0 +#define ESE56_LBN 1196544 +#define ESE56_RCTS 0 +#define ESE56_RCTC 1 +#define ESE56_RBN 0 +#define ESE56_MOD 48 +#define ESE56_MED 0x254B32B8 +#define ESE56_FLGS RQDF_SDI + +#define ESE58_SECT 4 +#define ESE58_SURF 128 +#define ESE58_CYL 3741 +#define ESE58_TPG ESE58_SURF +#define ESE58_GPC 1 +#define ESE58_XBN 0 +#define ESE58_DBN 0 +#define ESE58_LBN 1915392 +#define ESE58_RCTS 0 +#define ESE58_RCTC 1 +#define ESE58_RBN 0 +#define ESE58_MOD 49 +#define ESE58_MED 0x254B32BA +#define ESE58_FLGS RQDF_SDI + + + /* Controller parameters */ #define CBUS_QBUS 1 #define CBUS_UNIBUS 2 @@ -730,10 +862,10 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define RUX50_MODEL 10 #define RUX50_BUSES CBUS_UNIBUS -#define UDA50_CTYPE 3 // UNIBUS SDI (RAxx) controller -#define UDA50_UQPM 6 -#define UDA50_MODEL 6 -#define UDA50_BUSES CBUS_UNIBUS +#define UDA50A_CTYPE 3 // UNIBUS SDI (RAxx) controller +#define UDA50A_UQPM 6 +#define UDA50A_MODEL 6 +#define UDA50A_BUSES CBUS_UNIBUS #define RQDX3_CTYPE 4 // QBUS RX50/RDxx controller #define RQDX3_UQPM 19 @@ -765,6 +897,15 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define KDB50_MODEL 18 #define KDB50_BUSES CBUS_QBUS +#define RQDX4_CTYPE 10 // QBUS RXxx/RDxx controller +#define RQDX4_UQPM 20 // CSS, Reading Special +#define RQDX4_MODEL 20 +#define RQDX4_BUSES CBUS_QBUS + +#define UDA50_CTYPE 11 // Old UNIBUS SDI (RAxx) controller +#define UDA50_UQPM 2 +#define UDA50_MODEL 2 +#define UDA50_BUSES CBUS_UNIBUS #define RQ_DRV(d) \ @@ -782,10 +923,12 @@ x RA73 70(+1) 21 2667+ 21 1 ? 3920490 #define RQ_SIZE(d) d##_LBN static DRVTYP drv_tab[] = { + RQ_DRV (RX18), RQ_DRV (RX50), RQ_DRV (RX33), RQ_DRV (RD51), RQ_DRV (RD31), + RQ_DRV (RD33), RQ_DRV (RD52), RQ_DRV (RD53), RQ_DRV (RD54), @@ -808,6 +951,10 @@ static DRVTYP drv_tab[] = { RQ_DRV (RF71), RQ_DRV (RF72), RQ_DRV (RF73), + RQ_DRV (ESE20), + RQ_DRV (ESE52), + RQ_DRV (ESE56), + RQ_DRV (ESE58), RQ_DRV_A (RA8U, RAUSER), { 0 } }; @@ -826,13 +973,15 @@ static struct ctlrtyp ctlr_tab[] = { { 0, 0, 0, "DEFAULT" }, RQ_CTLR (KLESI), RQ_CTLR (RUX50), - RQ_CTLR (UDA50), + RQ_CTLR (UDA50A), RQ_CTLR (RQDX3), RQ_CTLR (KDA50), RQ_CTLR (KRQ50), RQ_CTLR (KRU50), RQ_CTLR (RQDX1), RQ_CTLR (KDB50), + RQ_CTLR (RQDX4), + RQ_CTLR (UDA50), { 0 } }; @@ -1054,13 +1203,19 @@ MTAB rq_mod[] = { { MTAB_XTD|MTAB_VDV|MTAB_NMO, RQ_SH_ALL, "ALL", NULL, NULL, &rq_show_ctrl, NULL, "Display complete controller state" }, { MTAB_XTD|MTAB_VDV, RQDX1_CTYPE, NULL, "RQDX1", - &rq_set_ctype, NULL, NULL, "Set RQDX1 (QBUS RX50/RDnn) Controller Type" }, + &rq_set_ctype, NULL, NULL, "Set RQDX1/2 (QBUS RX50/RDnn) Controller Type" }, { MTAB_XTD|MTAB_VDV, RQDX3_CTYPE, NULL, "RQDX3", &rq_set_ctype, NULL, NULL, "Set RQDX3 (QBUS RX50/RDnn) Controller Type" }, + { MTAB_XTD|MTAB_VDV, RQDX4_CTYPE, NULL, "RQDX4", + &rq_set_ctype, NULL, NULL, "Set RQDX4 (QBUS RX50/RDnn) Controller Type" }, { MTAB_XTD|MTAB_VDV, UDA50_CTYPE, NULL, "UDA50", &rq_set_ctype, NULL, NULL, "Set UDA50 (UNIBUS SDI RAnn) Controller Type" }, + { MTAB_XTD|MTAB_VDV, UDA50A_CTYPE, NULL, "UDA50A", + &rq_set_ctype, NULL, NULL, "Set UDA50A (UNIBUS SDI RAnn) Controller Type" }, { MTAB_XTD|MTAB_VDV, KDA50_CTYPE, NULL, "KDA50", &rq_set_ctype, NULL, NULL, "Set KDA50 (QBUS SDI RAnn) Controller Type" }, + { MTAB_XTD|MTAB_VDV, KDB50_CTYPE, NULL, "KDB50", + &rq_set_ctype, NULL, NULL, "Set KDB50 (QBUS SDI RAnn) Controller Type" }, { MTAB_XTD|MTAB_VDV, KRQ50_CTYPE, NULL, "KRQ50", &rq_set_ctype, NULL, NULL, "Set KRQ50 (QBUS CDROM) Controller Type" }, { MTAB_XTD|MTAB_VDV, KRU50_CTYPE, NULL, "KRU50", @@ -2834,7 +2989,7 @@ MSC *cp = rq_ctxmap[uptr->cnum]; if (val < 0) return SCPE_ARG; if ((ctlr_tab[val].buses & (UNIBUS? CBUS_UNIBUS : CBUS_QBUS)) == 0) -return sim_messagef (SCPE_ARG, "%s: %s controller not valid on a %s system\n", uptr->dptr->name, ctlr_tab[val].name, (UNIBUS? "Unibus" : "Qbus" )); + return sim_messagef (SCPE_ARG, "%s: %s controller not valid on a %s system\n", uptr->dptr->name, ctlr_tab[val].name, (UNIBUS? "Unibus" : "Qbus" )); cp->ctype = val; return SCPE_OK; } @@ -2908,7 +3063,7 @@ if (cp->ctype == DEFAULT_CTYPE) #if defined (VAX_610) cp->ctype = RQDX1_CTYPE; #else - cp->ctype = (UNIBUS? UDA50_CTYPE : RQDX3_CTYPE); + cp->ctype = (UNIBUS? UDA50A_CTYPE : RQDX3_CTYPE); #endif if ((ctlr_tab[cp->ctype].buses & (UNIBUS? CBUS_UNIBUS : CBUS_QBUS)) == 0) { @@ -3235,11 +3390,14 @@ return SCPE_OK; t_stat rq_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { -fprintf (st, "UDA50 MSCP Disk Controller (%s)\n\n", dptr->name); +MSC *cp = rq_ctxmap[dptr->units->cnum]; + +fprintf (st, "%s MSCP Disk Controller (%s)\n\n", ctlr_tab[cp->ctype].name, dptr->name); fprintf (st, "The simulator implements four MSCP disk controllers, RQ, RQB, RQC, RQD.\n"); fprintf (st, "Initially, RQB, RQC, and RQD are disabled. Each RQ controller simulates\n"); fprintf (st, "an MSCP disk controller with four drives. The MSCP controller type can be\n"); -fprintf (st, "specified as one of RQDX1, RQDX3, UDA50, KDA50, KRQ50, KLESI or RUX50.\n"); +fprintf (st, "specified as one of RQDX1, RQDX3, UDA50A, UDA50, KDA50, KRQ50, KRU50,\n"); +fprintf (st, "KDB50, RQDX4 or RUX50.\n\n"); fprintf (st, "RQ options include the ability to set units write enabled or write locked,\n"); fprintf (st, "and to set the drive type to one of many disk types:\n"); fprint_set_help (st, dptr);