From 6e7cf79eb3ca6c3ce4944f99768b4ce63afbd8ba Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 22 May 2023 11:03:39 -1000 Subject: [PATCH] VAX750, VAX780, VAX8600: Add Extra Massbus for New RPB disks --- VAX/vax750_cmi.c | 4 ++ VAX/vax750_defs.h | 4 +- VAX/vax750_syslist.c | 3 ++ VAX/vax7x0_mba.c | 65 ++++++++++++++++----------- VAX/vax860_abus.c | 1 + VAX/vax860_defs.h | 4 +- VAX/vax860_syslist.c | 3 ++ Visual Studio Projects/VAX750.vcproj | 4 ++ Visual Studio Projects/VAX780.vcproj | 4 ++ Visual Studio Projects/VAX8600.vcproj | 4 ++ makefile | 16 +++---- 11 files changed, 75 insertions(+), 37 deletions(-) diff --git a/VAX/vax750_cmi.c b/VAX/vax750_cmi.c index 4b4416e2..02965612 100644 --- a/VAX/vax750_cmi.c +++ b/VAX/vax750_cmi.c @@ -585,6 +585,10 @@ static struct boot_dev boot_tab[] = { { "RP", "DB", "ka750_new.bin", BOOT_B, 0, 0 }, /* DBAn */ { "RP", "DRA", "ka750_new.bin", BOOT_B, BOOT_MB, 0 }, /* DRAn */ { "RP", "DR", "ka750_new.bin", BOOT_B, 0, 0 }, /* DRAn */ + { "RPB", "DBB", "ka750_new.bin", BOOT_B, BOOT_MB, 0 }, /* DBAn */ + { "RPB", "DBB", "ka750_new.bin", BOOT_B, 0, 0 }, /* DBAn */ + { "RPB", "DRB", "ka750_new.bin", BOOT_B, BOOT_MB, 0 }, /* DRAn */ + { "RPB", "DRB", "ka750_new.bin", BOOT_B, 0, 0 }, /* DRAn */ { "HK", "DMA", "ka750_old.bin", BOOT_B, BOOT_HK, 0 }, /* DMAn */ { "HK", "DM", "ka750_old.bin", BOOT_B, 0, 0 }, /* DMAn */ { "RL", "DLA", "ka750_old.bin", BOOT_C, BOOT_RL, 0 }, /* DLAn */ diff --git a/VAX/vax750_defs.h b/VAX/vax750_defs.h index 4c7b451e..a7cdbbea 100644 --- a/VAX/vax750_defs.h +++ b/VAX/vax750_defs.h @@ -79,10 +79,11 @@ #define NEXUS_NUM 16 /* number of nexus */ #define MCTL_NUM 2 /* number of mem ctrl */ -#define MBA_NUM 2 /* number of MBA's */ +#define MBA_NUM 3 /* number of MBA's */ #define TR_MCTL 0 /* nexus assignments */ #define TR_MBA0 4 #define TR_MBA1 5 +#define TR_MBA2 6 #define TR_UBA 8 #define TR_CI 15 #define NEXUS_HLVL (IPL_HMAX - IPL_HMIN + 1) @@ -99,6 +100,7 @@ #define IPL_UBA (0x15 - IPL_HMIN) #define IPL_MBA0 (0x15 - IPL_HMIN) #define IPL_MBA1 (0x15 - IPL_HMIN) +#define IPL_MBA2 (0x15 - IPL_HMIN) #define IPL_CI (0x15 - IPL_HMIN) /* Nexus interrupt macros */ diff --git a/VAX/vax750_syslist.c b/VAX/vax750_syslist.c index 75642805..82413400 100644 --- a/VAX/vax750_syslist.c +++ b/VAX/vax750_syslist.c @@ -55,6 +55,7 @@ extern DEVICE rl_dev; extern DEVICE hk_dev; extern DEVICE rk_dev; extern DEVICE rp_dev; +extern DEVICE rpb_dev; extern DEVICE ry_dev; extern DEVICE ts_dev; extern DEVICE tq_dev; @@ -75,6 +76,7 @@ DEVICE *sim_devices[] = { &uba_dev, &mba_dev[0], &mba_dev[1], + &mba_dev[2], &clk_dev, &tmr_dev, &tti_dev, @@ -87,6 +89,7 @@ DEVICE *sim_devices[] = { &cr_dev, &lpt_dev, &rp_dev, + &rpb_dev, &rl_dev, &hk_dev, &rk_dev, diff --git a/VAX/vax7x0_mba.c b/VAX/vax7x0_mba.c index 23eefa49..0dc96dc0 100644 --- a/VAX/vax7x0_mba.c +++ b/VAX/vax7x0_mba.c @@ -269,7 +269,7 @@ static t_stat (*mbregR[MBA_NUM])(int32 *dat, int32 ad, int32 md); static t_stat (*mbregW[MBA_NUM])(int32 dat, int32 ad, int32 md); static int32 (*mbabort[MBA_NUM])(void); -static int32 mba_active = 0; /* Number of active MBA's */ +static uint32 mba_active = 0; /* Number of active MBA's */ /* Massbus adapter data structures @@ -324,6 +324,7 @@ REG mba1_reg[] = { { NULL } }; +#if MBA_NUM != 2 DIB mba2_dib = { TR_MBA2, 0, &mba_rdreg, &mba_wrreg, 0, NVCL (MBA2) }; UNIT mba2_unit = { UDATA (NULL, 0, 0) }; @@ -346,6 +347,7 @@ REG mba2_reg[] = { { FLDATAD (NEXINT, nexus_req[IPL_MBA2], TR_MBA2, "nexus interrupt request") }, { NULL } }; +#endif DEBTAB mba_deb[] = { { "REGREAD", MBA_DEB_RRD }, @@ -376,6 +378,7 @@ DEVICE mba_dev[] = { &mba1_dib, DEV_NEXUS | DEV_DEBUG, 0, mba_deb, NULL, NULL, &mba_help, NULL, NULL, &mba_description +#if MBA_NUM != 2 }, { "MBA2", &mba2_unit, mba2_reg, mba2_mod, @@ -385,6 +388,7 @@ DEVICE mba_dev[] = { &mba2_dib, DEV_NEXUS | DEV_DEBUG, 0, mba_deb, NULL, NULL, &mba_help, NULL, NULL, &mba_description +#endif } }; @@ -392,8 +396,8 @@ DEVICE mba_dev[] = { t_stat mba_rdreg (int32 *val, int32 pa, int32 lnt) { -int32 mb, ofs, drv, rtype; -uint32 t; +int32 ofs, drv, rtype; +uint32 mb, t; t_stat r; mb = NEXUS_GETNEX (pa) - TR_MBA0; /* get MBA */ @@ -410,7 +414,7 @@ if ((pa & 3) || (lnt != L_LONG)) { /* unaligned or not lw? return SCPE_OK; } #endif -if (mb >= MBA_NUM) /* valid? */ +if (mb >= mba_active) /* valid? */ return SCPE_NXM; rtype = MBA_RTYPE (pa); /* get reg type */ @@ -491,8 +495,8 @@ return SCPE_OK; t_stat mba_wrreg (int32 val, int32 pa, int32 lnt) { -int32 mb, ofs, drv, rtype; -uint32 old_reg, old_sr; +int32 ofs, drv, rtype; +uint32 mb, old_reg, old_sr; t_stat r; t_bool cs1dt; @@ -504,7 +508,7 @@ if ((pa & 3) || (lnt != L_LONG)) { /* unaligned or not lw? #endif return SCPE_OK; } -if (mb >= MBA_NUM) /* valid? */ +if (mb >= mba_active) /* valid? */ return SCPE_NXM; rtype = MBA_RTYPE (pa); /* get reg type */ @@ -630,7 +634,7 @@ int32 mba_rdbufW (uint32 mb, int32 bc, uint16 *buf) int32 i, j, ba, mbc, pbc; uint32 pa, dat; -if (mb >= MBA_NUM) /* valid MBA? */ +if (mb >= mba_active) /* valid MBA? */ return 0; ba = mba_va[mb]; /* get virt addr */ mbc = (MBABC_WR + 1) - mba_bc[mb]; /* get Mbus bc */ @@ -679,7 +683,7 @@ int32 mba_wrbufW (uint32 mb, int32 bc, const uint16 *buf) int32 i, j, ba, mbc, pbc; uint32 pa, dat; -if (mb >= MBA_NUM) /* valid MBA? */ +if (mb >= mba_active) /* valid MBA? */ return 0; ba = mba_va[mb]; /* get virt addr */ mbc = (MBABC_WR + 1) - mba_bc[mb]; /* get Mbus bc */ @@ -729,7 +733,7 @@ int32 mba_chbufW (uint32 mb, int32 bc, uint16 *buf) int32 i, j, ba, mbc, pbc; uint32 pa, dat, cmp; -if (mb >= MBA_NUM) /* valid MBA? */ +if (mb >= mba_active) /* valid MBA? */ return 0; ba = mba_va[mb]; /* get virt addr */ mbc = (MBABC_WR + 1) - mba_bc[mb]; /* get Mbus bc */ @@ -811,7 +815,7 @@ return; int32 mba_get_bc (uint32 mb) { -if (mb >= MBA_NUM) +if (mb >= mba_active) return 0; return (MBABC_WR + 1) - mba_bc[mb]; } @@ -820,7 +824,7 @@ void mba_set_int (uint32 mb) { DIB *dibp; -if (mb >= MBA_NUM) +if (mb >= mba_active) return; dibp = (DIB *) mba_dev[mb].ctxt; if (dibp) { @@ -834,7 +838,7 @@ void mba_clr_int (uint32 mb) { DIB *dibp; -if (mb >= MBA_NUM) +if (mb >= mba_active) return; dibp = (DIB *) mba_dev[mb].ctxt; if (dibp) { @@ -848,7 +852,7 @@ void mba_upd_sr (uint32 set, uint32 clr, uint32 mb) { uint32 o_sr; -if (mb >= MBA_NUM) +if (mb >= mba_active) return; o_sr = mba_sr[mb]; if (set & MBASR_ABORTS) @@ -894,14 +898,23 @@ return build_dib_tab(); t_stat mba_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { -fprintf (st, "Massbus Adapters (MBA0, MBA1)\n\n"); -fprintf (st, "The Massbus adapters (MBA0, MBA1) simulate RH780's. RP disk drives get\n"); -fprintf (st, "assigned to MBA0 if it is enabled, and TU tape drives get assigned to\n"); -fprintf (st, "MBA1 if RP is enabled, and MBA0 otherwise.\n"); -fprint_set_help (st, dptr); -fprint_show_help (st, dptr); -fprint_reg_help (st, dptr); -return SCPE_OK; +const char *const text = +/*567901234567890123456789012345678901234567890123456789012345678901234567890*/ +#if MBA_NUM == 3 +" Massbus Adapters (MBA0, MBA1, MBA2)\n\n" +" The Massbus adapters (MBA0, MBA1, MBA2) simulate RH780's. RP, RPB and TU\n" +" get assigned to MBA0, MBA1 and MBA2 in that order if they are enabled.\n" +#else +" Massbus Adapters (MBA0, MBA1)\n\n" +" The Massbus adapters (MBA0, MBA1) simulate RH780's. RP disk drives get\n" +" assigned to MBA0 if it is enabled, and TU tape drives get assigned to\n" +" MBA1 if RP is enabled, and MBA0 otherwise.\n" +#endif +"1$Set commands\n" +"1$Show commands\n" +"1$Registers\n"; + +return scp_help (st, dptr, uptr, flag, text, ""); } const char *mba_description (DEVICE *dptr) @@ -1004,11 +1017,9 @@ if ((mbregR[idx] && dibp->rd && /* conflict? */ (mbregW[idx] && dibp->wr && (mbregW[idx] != dibp->wr)) || (mbabort[idx] && dibp->ack[0] && - (mbabort[idx] != dibp->ack[0]))) { - sim_printf ("Massbus %s assignment conflict at %d\n", - sim_dname (dptr), dibp->ba); - return SCPE_STOP; - } + (mbabort[idx] != dibp->ack[0]))) + return sim_messagef (SCPE_STOP, "Massbus %s assignment conflict at %d\n", + sim_dname (dptr), dibp->ba); if (dibp->rd) /* set rd dispatch */ mbregR[idx] = dibp->rd; if (dibp->wr) /* set wr dispatch */ diff --git a/VAX/vax860_abus.c b/VAX/vax860_abus.c index d0be2711..7dafcc96 100644 --- a/VAX/vax860_abus.c +++ b/VAX/vax860_abus.c @@ -93,6 +93,7 @@ char cpu_boot_cmd[CBUFSIZE] = { 0 }; /* boot command */ static struct boot_dev boot_tab[] = { { "RP", BOOT_MB, 0 }, + { "RPB", BOOT_MB, 0 }, { "HK", BOOT_HK, 0 }, { "RL", BOOT_RL, 0 }, { "RQ", BOOT_UDA, 1 << 24 }, diff --git a/VAX/vax860_defs.h b/VAX/vax860_defs.h index 7fab89f5..d3570ace 100644 --- a/VAX/vax860_defs.h +++ b/VAX/vax860_defs.h @@ -110,12 +110,13 @@ #define NEXUS_NUM 16 /* number of nexus */ #define MCTL_NUM 2 /* number of mem ctrl */ -#define MBA_NUM 2 /* number of MBA's */ +#define MBA_NUM 3 /* number of MBA's */ #define TR_MCTL0 1 /* nexus assignments */ #define TR_MCTL1 2 #define TR_UBA 3 #define TR_MBA0 8 #define TR_MBA1 9 +#define TR_MBA2 10 #define TR_CI 14 #define NEXUS_HLVL (IPL_HMAX - IPL_HMIN + 1) #define SCB_NEXUS 0x100 /* nexus intr base */ @@ -131,6 +132,7 @@ #define IPL_UBA (0x15 - IPL_HMIN) #define IPL_MBA0 (0x15 - IPL_HMIN) #define IPL_MBA1 (0x15 - IPL_HMIN) +#define IPL_MBA2 (0x15 - IPL_HMIN) #define IPL_CI (0x15 - IPL_HMIN) /* Nexus interrupt macros */ diff --git a/VAX/vax860_syslist.c b/VAX/vax860_syslist.c index c02520f4..6722b38d 100644 --- a/VAX/vax860_syslist.c +++ b/VAX/vax860_syslist.c @@ -55,6 +55,7 @@ extern DEVICE rl_dev; extern DEVICE hk_dev; extern DEVICE rk_dev; extern DEVICE rp_dev; +extern DEVICE rpb_dev; extern DEVICE ry_dev; extern DEVICE ts_dev; extern DEVICE tq_dev; @@ -74,6 +75,7 @@ DEVICE *sim_devices[] = { &uba_dev, &mba_dev[0], &mba_dev[1], + &mba_dev[2], &clk_dev, &tmr_dev, &tti_dev, @@ -86,6 +88,7 @@ DEVICE *sim_devices[] = { &cr_dev, &lpt_dev, &rp_dev, + &rpb_dev, &rl_dev, &hk_dev, &rk_dev, diff --git a/Visual Studio Projects/VAX750.vcproj b/Visual Studio Projects/VAX750.vcproj index a14eeac5..1e32a0c0 100644 --- a/Visual Studio Projects/VAX750.vcproj +++ b/Visual Studio Projects/VAX750.vcproj @@ -242,6 +242,10 @@ RelativePath="..\PDP11\pdp11_rp.c" > + + diff --git a/Visual Studio Projects/VAX780.vcproj b/Visual Studio Projects/VAX780.vcproj index 19bb0f68..b963c86d 100644 --- a/Visual Studio Projects/VAX780.vcproj +++ b/Visual Studio Projects/VAX780.vcproj @@ -246,6 +246,10 @@ RelativePath="..\PDP11\pdp11_rp.c" > + + diff --git a/Visual Studio Projects/VAX8600.vcproj b/Visual Studio Projects/VAX8600.vcproj index 88ddfab1..a534a8e3 100644 --- a/Visual Studio Projects/VAX8600.vcproj +++ b/Visual Studio Projects/VAX8600.vcproj @@ -246,6 +246,10 @@ RelativePath="..\PDP11\pdp11_rp.c" > + + diff --git a/makefile b/makefile index 1f318380..471b48c9 100644 --- a/makefile +++ b/makefile @@ -1779,10 +1779,10 @@ VAX750 = ${VAXD}/vax_cpu.c ${VAXD}/vax_cpu1.c ${VAXD}/vax_fpa.c \ ${PDP11D}/pdp11_rl.c ${PDP11D}/pdp11_rq.c ${PDP11D}/pdp11_ts.c \ ${PDP11D}/pdp11_dz.c ${PDP11D}/pdp11_lp.c ${PDP11D}/pdp11_tq.c \ ${PDP11D}/pdp11_xu.c ${PDP11D}/pdp11_ry.c ${PDP11D}/pdp11_cr.c \ - ${PDP11D}/pdp11_hk.c ${PDP11D}/pdp11_rp.c ${PDP11D}/pdp11_tu.c \ - ${PDP11D}/pdp11_vh.c ${PDP11D}/pdp11_dmc.c ${PDP11D}/pdp11_dup.c \ - ${PDP11D}/pdp11_td.c ${PDP11D}/pdp11_tc.c ${PDP11D}/pdp11_rk.c \ - ${PDP11D}/pdp11_io_lib.c ${PDP11D}/pdp11_ch.c \ + ${PDP11D}/pdp11_hk.c ${PDP11D}/pdp11_rp.c ${PDP11D}/pdp11_rpb.c \ + ${PDP11D}/pdp11_tu.c ${PDP11D}/pdp11_vh.c ${PDP11D}/pdp11_dmc.c \ + ${PDP11D}/pdp11_dup.c ${PDP11D}/pdp11_td.c ${PDP11D}/pdp11_tc.c \ + ${PDP11D}/pdp11_rk.c ${PDP11D}/pdp11_io_lib.c ${PDP11D}/pdp11_ch.c \ $(NETWORK_DEPS) VAX750_OPT = -DVM_VAX -DVAX_750 -DUSE_INT64 -DUSE_ADDR64 -I ${VAXD} -I ${PDP11D} ${NETWORK_OPT} @@ -1829,10 +1829,10 @@ VAX8600 = ${VAXD}/vax_cpu.c ${VAXD}/vax_cpu1.c ${VAXD}/vax_fpa.c \ ${PDP11D}/pdp11_rl.c ${PDP11D}/pdp11_rq.c ${PDP11D}/pdp11_ts.c \ ${PDP11D}/pdp11_dz.c ${PDP11D}/pdp11_lp.c ${PDP11D}/pdp11_tq.c \ ${PDP11D}/pdp11_xu.c ${PDP11D}/pdp11_ry.c ${PDP11D}/pdp11_cr.c \ - ${PDP11D}/pdp11_rp.c ${PDP11D}/pdp11_tu.c ${PDP11D}/pdp11_hk.c \ - ${PDP11D}/pdp11_vh.c ${PDP11D}/pdp11_dmc.c ${PDP11D}/pdp11_dup.c \ - ${PDP11D}/pdp11_td.c ${PDP11D}/pdp11_tc.c ${PDP11D}/pdp11_rk.c \ - ${PDP11D}/pdp11_io_lib.c ${PDP11D}/pdp11_ch.c \ + ${PDP11D}/pdp11_rp.c ${PDP11D}/pdp11_rpb.c ${PDP11D}/pdp11_tu.c \ + ${PDP11D}/pdp11_hk.c ${PDP11D}/pdp11_vh.c ${PDP11D}/pdp11_dmc.c \ + ${PDP11D}/pdp11_dup.c ${PDP11D}/pdp11_td.c ${PDP11D}/pdp11_tc.c \ + ${PDP11D}/pdp11_rk.c ${PDP11D}/pdp11_io_lib.c ${PDP11D}/pdp11_ch.c \ $(NETWORK_DEPS) VAX8600_OPT = -DVM_VAX -DVAX_860 -DUSE_INT64 -DUSE_ADDR64 -I ${VAXD} -I ${PDP11D} ${NETWORK_OPT}