diff --git a/PDP10/pdp10_defs.h b/PDP10/pdp10_defs.h index 643f4eb5..e82b8210 100644 --- a/PDP10/pdp10_defs.h +++ b/PDP10/pdp10_defs.h @@ -613,6 +613,7 @@ struct pdp_dib { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routines */ + uint32 ulnt; /* IO length per unit */ }; typedef struct pdp_dib DIB; diff --git a/PDP10/pdp10_ksio.c b/PDP10/pdp10_ksio.c index a61b3a7a..554d1aab 100644 --- a/PDP10/pdp10_ksio.c +++ b/PDP10/pdp10_ksio.c @@ -1156,7 +1156,8 @@ for (i = 0; dib_tab[i] != NULL; i++) { /* print table */ (dib_tab[i]->vloc<=19)? 5: 4); else fprintf (st, " "); - fprintf (st, " %2u %s\n", (dptr? dptr->numunits: 1), dptr? sim_dname (dptr): "CPU"); + fprintf (st, " %2u %s\n", (dib_tab[i]->ulnt? dib_tab[i]->lnt/dib_tab[i]->ulnt: + (dptr? dptr->numunits: 1)), dptr? sim_dname (dptr): "CPU"); } return SCPE_OK; } diff --git a/PDP10/pdp10_rp.c b/PDP10/pdp10_rp.c index e65bd9a3..c307a6c2 100644 --- a/PDP10/pdp10_rp.c +++ b/PDP10/pdp10_rp.c @@ -387,7 +387,7 @@ t_stat rp_set_size (UNIT *uptr, int32 val, char *cptr, void *desc); DIB rp_dib = { IOBA_RP, IOLN_RP, &rp_rd, &rp_wr, - 1, IVCL (RP), VEC_RP, { &rp_inta } + 1, IVCL (RP), VEC_RP, { &rp_inta }, IOLN_RP }; UNIT rp_unit[] = { diff --git a/PDP10/pdp10_tu.c b/PDP10/pdp10_tu.c index eb0cd890..f37c3ca8 100644 --- a/PDP10/pdp10_tu.c +++ b/PDP10/pdp10_tu.c @@ -359,7 +359,7 @@ t_stat tu_map_err (UNIT *uptr, t_stat st, t_bool qdt); DIB tu_dib = { IOBA_TU, IOLN_TU, &tu_rd, &tu_wr, - 1, IVCL (TU), VEC_TU, { &tu_inta } + 1, IVCL (TU), VEC_TU, { &tu_inta }, IOLN_TU, }; UNIT tu_unit[] = { diff --git a/PDP11/pdp11_dc.c b/PDP11/pdp11_dc.c index e6b180fd..3e13b342 100644 --- a/PDP11/pdp11_dc.c +++ b/PDP11/pdp11_dc.c @@ -154,7 +154,7 @@ char *dcx_description (DEVICE *dptr); DIB dci_dib = { IOBA_AUTO, IOLN_DC * DCX_LINES, &dcx_rd, &dcx_wr, - 2, IVCL (DCI), VEC_AUTO, { &dci_iack, &dco_iack } + 2, IVCL (DCI), VEC_AUTO, { &dci_iack, &dco_iack }, IOLN_DC, }; UNIT dci_unit = { UDATA (&dci_svc, 0, 0), KBD_POLL_WAIT }; diff --git a/PDP11/pdp11_defs.h b/PDP11/pdp11_defs.h index 3f4c4157..d05a4d4f 100644 --- a/PDP11/pdp11_defs.h +++ b/PDP11/pdp11_defs.h @@ -513,6 +513,7 @@ struct pdp_dib { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routines */ + uint32 ulnt; /* IO length per-unit */ }; typedef struct pdp_dib DIB; diff --git a/PDP11/pdp11_dl.c b/PDP11/pdp11_dl.c index 8570e274..f13a0813 100644 --- a/PDP11/pdp11_dl.c +++ b/PDP11/pdp11_dl.c @@ -118,7 +118,7 @@ void dlx_reset_ln (int32 ln); DIB dli_dib = { IOBA_AUTO, IOLN_DL * DLX_LINES, &dlx_rd, &dlx_wr, - 2, IVCL (DLI), VEC_AUTO, { &dli_iack, &dlo_iack } + 2, IVCL (DLI), VEC_AUTO, { &dli_iack, &dlo_iack }, IOLN_DL, }; UNIT dli_unit = { UDATA (&dli_svc, 0, 0), KBD_POLL_WAIT }; diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index c1aeeb3f..a23e8a05 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -293,7 +293,8 @@ char *dz_description (DEVICE *dptr); DIB dz_dib = { IOBA_AUTO, IOLN_DZ * DZ_MUXES, &dz_rd, &dz_wr, - 2, IVCL (DZRX), VEC_AUTO, { &dz_rxinta, &dz_txinta } + 2, IVCL (DZRX), VEC_AUTO, { &dz_rxinta, &dz_txinta }, + IOLN_DZ, }; UNIT dz_unit = { UDATA (&dz_svc, UNIT_IDLE|UNIT_ATTABLE|DZ_8B_DFLT, 0) }; diff --git a/PDP11/pdp11_hk.c b/PDP11/pdp11_hk.c index e997e86b..433d476f 100644 --- a/PDP11/pdp11_hk.c +++ b/PDP11/pdp11_hk.c @@ -581,7 +581,7 @@ char *hk_description (DEVICE *dptr); DIB hk_dib = { IOBA_AUTO, IOLN_HK, &hk_rd, &hk_wr, - 1, IVCL (HK), VEC_AUTO, { NULL } + 1, IVCL (HK), VEC_AUTO, { NULL }, IOLN_HK, }; UNIT hk_unit[] = { diff --git a/PDP11/pdp11_io_lib.c b/PDP11/pdp11_io_lib.c index b9395ca2..5b505443 100644 --- a/PDP11/pdp11_io_lib.c +++ b/PDP11/pdp11_io_lib.c @@ -327,7 +327,8 @@ for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */ l = strlen (dptr? sim_dname (dptr): "CPU"); if (l>maxname) maxname = (int32)l; - j = (dptr? dptr->numunits: 1); + j = (dibp->ulnt? dibp->lnt/dibp->ulnt: + (dptr? dptr->numunits: 1)); if (j > maxdev) maxdev = j; } /* end if */ @@ -407,7 +408,9 @@ for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */ fprintf (st, " %2u", dibp->vloc/32); else fprintf (st, " "); - fprintf (st, " %*u %s\n", maxdev, (dptr? dptr->numunits: 1), dptr? sim_dname (dptr): "CPU"); + fprintf (st, " %*u %s\n", maxdev, (dibp->ulnt? dibp->lnt/dibp->ulnt: + (dptr? dptr->numunits: 1)), + dptr? sim_dname (dptr): "CPU"); } /* end if */ } /* end for i */ return SCPE_OK; diff --git a/PDP11/pdp11_kg.c b/PDP11/pdp11_kg.c index 121b766f..0a16800e 100644 --- a/PDP11/pdp11_kg.c +++ b/PDP11/pdp11_kg.c @@ -201,7 +201,7 @@ static DIB kg_dib = { (IOLN_KG + 2) * KG_UNITS, &kg_rd, &kg_wr, - 0, 0, 0, { NULL } + 0, 0, 0, { NULL }, IOLN_KG+2 }; static UNIT kg_unit[] = { diff --git a/PDP11/pdp11_rc.c b/PDP11/pdp11_rc.c index c1103334..ce6df647 100644 --- a/PDP11/pdp11_rc.c +++ b/PDP11/pdp11_rc.c @@ -187,7 +187,7 @@ static DIB rc_dib = { IOLN_RC, &rc_rd, &rc_wr, - 1, IVCL (RC), VEC_AUTO, { NULL } + 1, IVCL (RC), VEC_AUTO, { NULL }, IOLN_RC, }; static UNIT rc_unit = { diff --git a/PDP11/pdp11_rf.c b/PDP11/pdp11_rf.c index e11c7195..1e75a9c6 100644 --- a/PDP11/pdp11_rf.c +++ b/PDP11/pdp11_rf.c @@ -145,7 +145,7 @@ uint32 update_rfcs (uint32 newcs, uint32 newdae); DIB rf_dib = { IOBA_AUTO, IOLN_RF, &rf_rd, &rf_wr, - 1, IVCL (RF), VEC_AUTO, {NULL} + 1, IVCL (RF), VEC_AUTO, {NULL}, IOLN_RF, }; diff --git a/PDP11/pdp11_rh.c b/PDP11/pdp11_rh.c index fc268f17..2141392e 100644 --- a/PDP11/pdp11_rh.c +++ b/PDP11/pdp11_rh.c @@ -207,7 +207,7 @@ static int32 mba_mapofs[(MBA_OFSMASK + 1) >> 1] = { DIB mba0_dib = { IOBA_AUTO, IOLN_RP, &mba_rd, &mba_wr, - 1, IVCL (RP), VEC_AUTO, { &mba0_inta } + 1, IVCL (RP), VEC_AUTO, { &mba0_inta }, IOLN_RP, }; UNIT mba0_unit = { UDATA (NULL, 0, 0) }; diff --git a/PDP11/pdp11_rk.c b/PDP11/pdp11_rk.c index 4c71319a..ebc1a378 100644 --- a/PDP11/pdp11_rk.c +++ b/PDP11/pdp11_rk.c @@ -216,7 +216,7 @@ t_stat rk_boot (int32 unitno, DEVICE *dptr); DIB rk_dib = { IOBA_AUTO, IOLN_RK, &rk_rd, &rk_wr, - 1, IVCL (RK), VEC_AUTO, { &rk_inta } + 1, IVCL (RK), VEC_AUTO, { &rk_inta }, IOLN_RK, }; UNIT rk_unit[] = { diff --git a/PDP11/pdp11_rl.c b/PDP11/pdp11_rl.c index 99bcd817..625a51ca 100644 --- a/PDP11/pdp11_rl.c +++ b/PDP11/pdp11_rl.c @@ -275,7 +275,7 @@ char *rl_description (DEVICE *dptr); static DIB rl_dib = { IOBA_AUTO, IOLN_RL, &rl_rd, &rl_wr, - 1, IVCL (RL), VEC_AUTO, { NULL } }; + 1, IVCL (RL), VEC_AUTO, { NULL }, IOLN_RL }; static UNIT rl_unit[] = { { UDATA (&rl_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ diff --git a/PDP11/pdp11_rq.c b/PDP11/pdp11_rq.c index e00ce750..04bfc00f 100644 --- a/PDP11/pdp11_rq.c +++ b/PDP11/pdp11_rq.c @@ -857,7 +857,7 @@ MSC rq_ctx = { 0 }; DIB rq_dib = { IOBA_AUTO, IOLN_RQ, &rq_rd, &rq_wr, - 1, IVCL (RQ), 0, { &rq_inta } + 1, IVCL (RQ), 0, { &rq_inta }, IOLN_RQ }; UNIT rq_unit[] = { diff --git a/PDP11/pdp11_rx.c b/PDP11/pdp11_rx.c index ef8ba659..ab6fbb56 100644 --- a/PDP11/pdp11_rx.c +++ b/PDP11/pdp11_rx.c @@ -144,7 +144,7 @@ void rx_done (int32 esr_flags, int32 new_ecode); DIB rx_dib = { IOBA_AUTO, IOLN_RX, &rx_rd, &rx_wr, - 1, IVCL (RX), VEC_AUTO, { NULL } + 1, IVCL (RX), VEC_AUTO, { NULL }, IOLN_RX, }; UNIT rx_unit[] = { diff --git a/PDP11/pdp11_ry.c b/PDP11/pdp11_ry.c index b7f065c8..ec7f303c 100644 --- a/PDP11/pdp11_ry.c +++ b/PDP11/pdp11_ry.c @@ -180,7 +180,7 @@ char *ry_description (DEVICE *dptr); DIB ry_dib = { IOBA_AUTO, IOLN_RY, &ry_rd, &ry_wr, - 1, IVCL (RY), VEC_AUTO, { NULL } + 1, IVCL (RY), VEC_AUTO, { NULL }, IOLN_RY, }; UNIT ry_unit[] = { diff --git a/PDP11/pdp11_ta.c b/PDP11/pdp11_ta.c index 012a98c4..a9c2c438 100644 --- a/PDP11/pdp11_ta.c +++ b/PDP11/pdp11_ta.c @@ -150,7 +150,7 @@ uint32 ta_crc (uint8 *buf, uint32 cnt); DIB ta_dib = { IOBA_AUTO, IOLN_TA, &ta_rd, &ta_wr, - 1, IVCL (TA), VEC_AUTO, { NULL } + 1, IVCL (TA), VEC_AUTO, { NULL }, IOLN_TA }; UNIT ta_unit[] = { diff --git a/PDP11/pdp11_tc.c b/PDP11/pdp11_tc.c index d3b09511..4ac9d998 100644 --- a/PDP11/pdp11_tc.c +++ b/PDP11/pdp11_tc.c @@ -319,7 +319,7 @@ int32 dt_gethdr (UNIT *uptr, int32 blk, int32 relpos); DIB dt_dib = { IOBA_AUTO, IOLN_TC, &dt_rd, &dt_wr, - 1, IVCL (DTA), VEC_AUTO, { NULL } + 1, IVCL (DTA), VEC_AUTO, { NULL }, IOLN_TC, }; UNIT dt_unit[] = { diff --git a/PDP11/pdp11_tm.c b/PDP11/pdp11_tm.c index d6d15b0d..1bccae54 100644 --- a/PDP11/pdp11_tm.c +++ b/PDP11/pdp11_tm.c @@ -191,7 +191,7 @@ t_stat tm_vlock (UNIT *uptr, int32 val, char *cptr, void *desc); DIB tm_dib = { IOBA_AUTO, IOLN_TM, &tm_rd, &tm_wr, - 1, IVCL (TM), VEC_AUTO, { NULL } + 1, IVCL (TM), VEC_AUTO, { NULL }, IOLN_TM, }; UNIT tm_unit[] = { diff --git a/PDP11/pdp11_tq.c b/PDP11/pdp11_tq.c index 04c25eee..e0f30d9f 100644 --- a/PDP11/pdp11_tq.c +++ b/PDP11/pdp11_tq.c @@ -417,7 +417,7 @@ UNIT *tq_getucb (uint32 lu); DIB tq_dib = { IOBA_AUTO, IOLN_TQ, &tq_rd, &tq_wr, - 1, IVCL (TQ), 0, { &tq_inta } + 1, IVCL (TQ), 0, { &tq_inta }, IOLN_TQ, }; UNIT tq_unit[] = { diff --git a/PDP11/pdp11_ts.c b/PDP11/pdp11_ts.c index f531f6ef..3fd3f716 100644 --- a/PDP11/pdp11_ts.c +++ b/PDP11/pdp11_ts.c @@ -311,7 +311,7 @@ char *ts_description (DEVICE *dptr); DIB ts_dib = { IOBA_AUTO, IOLN_TS, &ts_rd, &ts_wr, - 1, IVCL (TS), VEC_AUTO, { NULL } + 1, IVCL (TS), VEC_AUTO, { NULL }, IOLN_TS }; UNIT ts_unit = { UDATA (&ts_svc, UNIT_ATTABLE + UNIT_ROABLE + UNIT_DISABLE, 0) }; diff --git a/PDP11/pdp11_vh.c b/PDP11/pdp11_vh.c index 2bde9bbe..b3324c8c 100644 --- a/PDP11/pdp11_vh.c +++ b/PDP11/pdp11_vh.c @@ -361,7 +361,8 @@ static DIB vh_dib = { 2, /* # of vectors */ IVCL (VHRX), VEC_FLOAT, - { &vh_rxinta, &vh_txinta } /* int. ack. routines */ + { &vh_rxinta, &vh_txinta }, /* int. ack. routines */ + IOLN_VH, /* IO space per device */ }; static UNIT vh_unit[VH_MUXES] = { diff --git a/PDP11/pdp11_xq.c b/PDP11/pdp11_xq.c index 36f83f6d..c51502e3 100644 --- a/PDP11/pdp11_xq.c +++ b/PDP11/pdp11_xq.c @@ -326,7 +326,7 @@ struct xq_device xqb = { #define IOLN_XQ 020 DIB xqa_dib = { IOBA_AUTO, IOLN_XQ, &xq_rd, &xq_wr, - 1, IVCL (XQ), 0, { &xq_int } }; + 1, IVCL (XQ), 0, { &xq_int }, IOLN_XQ }; UNIT xqa_unit[] = { { UDATA (&xq_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 2047) }, /* receive timer */ diff --git a/PDP11/pdp11_xu.c b/PDP11/pdp11_xu.c index f29cc82f..76fb3f1e 100644 --- a/PDP11/pdp11_xu.c +++ b/PDP11/pdp11_xu.c @@ -134,7 +134,7 @@ char *xu_description (DEVICE *dptr); #define IOLN_XU 010 DIB xua_dib = { IOBA_AUTO, IOLN_XU, &xu_rd, &xu_wr, -1, IVCL (XU), VEC_AUTO, {&xu_int} }; +1, IVCL (XU), VEC_AUTO, {&xu_int}, IOLN_XU }; UNIT xua_unit[] = { { UDATA (&xu_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) }, /* receive timer */ @@ -234,7 +234,7 @@ DEVICE xu_dev = { #define IOLN_XU 010 DIB xub_dib = { IOBA_AUTO, IOLN_XU, &xu_rd, &xu_wr, - 1, IVCL (XU), 0, { &xu_int } }; + 1, IVCL (XU), 0, { &xu_int }, IOLN_XU }; UNIT xub_unit[] = { { UDATA (&xu_svc, UNIT_IDLE|UNIT_ATTABLE|UNIT_DISABLE, 0) } /* receive timer */ diff --git a/VAX/vax610_defs.h b/VAX/vax610_defs.h index 1dbd6f67..1c1654f5 100644 --- a/VAX/vax610_defs.h +++ b/VAX/vax610_defs.h @@ -196,6 +196,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */ diff --git a/VAX/vax630_defs.h b/VAX/vax630_defs.h index 30214c6a..71226846 100644 --- a/VAX/vax630_defs.h +++ b/VAX/vax630_defs.h @@ -243,6 +243,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */ diff --git a/VAX/vax730_defs.h b/VAX/vax730_defs.h index 9db8abff..728eff0e 100644 --- a/VAX/vax730_defs.h +++ b/VAX/vax730_defs.h @@ -237,6 +237,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Unibus I/O page layout - see pdp11_io_lib.c for address layout details */ diff --git a/VAX/vax750_defs.h b/VAX/vax750_defs.h index 7342482d..efcc96a4 100644 --- a/VAX/vax750_defs.h +++ b/VAX/vax750_defs.h @@ -274,6 +274,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Unibus I/O page layout - see pdp11_io_lib.c for address layout details diff --git a/VAX/vax780_defs.h b/VAX/vax780_defs.h index a9a6153a..a16901ab 100644 --- a/VAX/vax780_defs.h +++ b/VAX/vax780_defs.h @@ -286,6 +286,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Unibus I/O page layout - see pdp11_io_lib.c for address layout details diff --git a/VAX/vax860_defs.h b/VAX/vax860_defs.h index 2d8b9fbb..af78c992 100644 --- a/VAX/vax860_defs.h +++ b/VAX/vax860_defs.h @@ -321,6 +321,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Unibus I/O page layout - XUB,RQB,RQC,RQD float based on number of DZ's diff --git a/VAX/vaxmod_defs.h b/VAX/vaxmod_defs.h index 9ab73332..cd53dff7 100644 --- a/VAX/vaxmod_defs.h +++ b/VAX/vaxmod_defs.h @@ -284,6 +284,7 @@ typedef struct { int32 vloc; /* locator */ int32 vec; /* value */ int32 (*ack[VEC_DEVMAX])(void); /* ack routine */ + uint32 ulnt; /* IO length per unit */ } DIB; /* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */ diff --git a/scp.c b/scp.c index a1be25a4..00c5369a 100644 --- a/scp.c +++ b/scp.c @@ -3664,7 +3664,8 @@ if (uptr->flags & UNIT_ATT) /* already attached? */ return r; } else - return SCPE_ALATT; /* Already attached */ + if (!(uptr->dynflags & UNIT_ATTMULT)) + return SCPE_ALATT; /* Already attached */ sim_trim_endspc (cptr); /* trim trailing spc */ return scp_attach_unit (dptr, uptr, cptr); /* attach */ }