1
0
mirror of https://github.com/simh/simh.git synced 2026-01-14 15:45:18 +00:00

VAX750, VAX780, VAX8600: Add Extra Massbus for New RPB disks

This commit is contained in:
Mark Pizzolato 2023-05-22 11:03:39 -10:00
parent ef0f49204e
commit 6e7cf79eb3
11 changed files with 75 additions and 37 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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,

View File

@ -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 */

View File

@ -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 },

View File

@ -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 */

View File

@ -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,

View File

@ -242,6 +242,10 @@
RelativePath="..\PDP11\pdp11_rp.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rpb.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rq.c"
>

View File

@ -246,6 +246,10 @@
RelativePath="..\PDP11\pdp11_rp.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rpb.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rq.c"
>

View File

@ -246,6 +246,10 @@
RelativePath="..\PDP11\pdp11_rp.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rpb.c"
>
</File>
<File
RelativePath="..\PDP11\pdp11_rq.c"
>

View File

@ -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}