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}