PDP11, VAX: Add settable unit numbers for RQ drives

This commit is contained in:
Mark Pizzolato 2018-04-11 03:12:12 -07:00
parent 8bec55b976
commit 5a18d31449

View file

@ -170,6 +170,7 @@ extern int32 MMR2;
#define pktq us10 /* packet queue */
#define uf buf /* settable unit flags */
#define cnum wait /* controller index */
#define unit_plug u4 /* drive unit plug value */
#define io_status u5 /* io status from callback */
#define io_complete u6 /* io completion flag */
#define rqxb filebuf /* xfer buffer */
@ -758,7 +759,6 @@ int32 rq_xtime = RQ_XTIME; /* transfer time */
typedef struct {
uint32 cnum; /* ctrl number */
uint16 ubase; /* unit base */
uint32 sa; /* status, addr */
uint32 saw; /* written data */
uint32 s1dat; /* S1 data */
@ -842,6 +842,8 @@ t_stat rq_boot (int32 unitno, DEVICE *dptr);
t_stat rq_set_wlk (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat rq_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat rq_set_ctype (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat rq_set_plug (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat rq_show_plug (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat rq_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat rq_show_ctype (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat rq_show_wlk (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
@ -923,7 +925,6 @@ UNIT rq_unit[] = {
};
REG rq_reg[] = {
{ GRDATAD (UBASE, rq_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO },
{ GRDATAD (SA, rq_ctx.sa, DEV_RDX, 16, 0, "status/address register") },
{ GRDATAD (SAW, rq_ctx.saw, DEV_RDX, 16, 0, "written data") },
{ GRDATAD (S1DAT, rq_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") },
@ -958,6 +959,7 @@ REG rq_reg[] = {
{ URDATAD (PKTQ, rq_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") },
{ URDATAD (UFLG, rq_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") },
{ URDATA (CAPAC, rq_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) },
{ URDATAD (PLUG, rq_unit[0].unit_plug, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_RO, "unit plug value, units 0 to 3") },
{ GRDATA (DEVADDR, rq_dib.ba, DEV_RDX, 32, 0), REG_HRO },
{ GRDATA (DEVVEC, rq_dib.vec, DEV_RDX, 16, 0), REG_HRO },
{ DRDATA (DEVLBN, drv_tab[RA8U_DTYPE].lbn, 22), REG_HRO },
@ -1045,6 +1047,8 @@ MTAB rq_mod[] = {
&rq_set_type, NULL, NULL, "Set RAUSER Disk Type and its size" },
{ MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL,
NULL, &rq_show_type, NULL, "Display device type" },
{ MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "UNIT", "UNIT=val (0-65534)",
&rq_set_plug, &rq_show_plug, NULL, "Set/Display Unit plug value" },
{ UNIT_NOAUTO, UNIT_NOAUTO, "noautosize", "NOAUTOSIZE", NULL, NULL, NULL, "Disables disk autosize on attach" },
{ UNIT_NOAUTO, 0, "autosize", "AUTOSIZE", NULL, NULL, NULL, "Enables disk autosize on attach" },
{ MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "FORMAT", "FORMAT={SIMH|VHD|RAW}",
@ -1104,7 +1108,6 @@ UNIT rqb_unit[] = {
};
REG rqb_reg[] = {
{ GRDATAD (UBASE, rqb_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO },
{ GRDATAD (SA, rqb_ctx.sa, DEV_RDX, 16, 0, "status/address register") },
{ GRDATAD (SAW, rqb_ctx.saw, DEV_RDX, 16, 0, "written data") },
{ GRDATAD (S1DAT, rqb_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") },
@ -1135,6 +1138,7 @@ REG rqb_reg[] = {
{ URDATAD (PKTQ, rqb_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") },
{ URDATAD (UFLG, rqb_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") },
{ URDATA (CAPAC, rqb_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) },
{ URDATAD (PLUG, rqb_unit[0].unit_plug, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_RO, "unit plug value, units 0 to 3") },
{ GRDATA (DEVADDR, rqb_dib.ba, DEV_RDX, 32, 0), REG_HRO },
{ GRDATA (DEVVEC, rqb_dib.vec, DEV_RDX, 16, 0), REG_HRO },
{ NULL }
@ -1179,7 +1183,6 @@ UNIT rqc_unit[] = {
};
REG rqc_reg[] = {
{ GRDATAD (UBASE, rqc_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO },
{ GRDATAD (SA, rqc_ctx.sa, DEV_RDX, 16, 0, "status/address register") },
{ GRDATAD (SAW, rqc_ctx.saw, DEV_RDX, 16, 0, "written data") },
{ GRDATAD (S1DAT, rqc_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") },
@ -1210,6 +1213,7 @@ REG rqc_reg[] = {
{ URDATAD (PKTQ, rqc_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") },
{ URDATAD (UFLG, rqc_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") },
{ URDATA (CAPAC, rqc_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) },
{ URDATAD (PLUG, rqc_unit[0].unit_plug, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_RO, "unit plug value, units 0 to 3") },
{ GRDATA (DEVADDR, rqc_dib.ba, DEV_RDX, 32, 0), REG_HRO },
{ GRDATA (DEVVEC, rqc_dib.vec, DEV_RDX, 16, 0), REG_HRO },
{ NULL }
@ -1254,7 +1258,6 @@ UNIT rqd_unit[] = {
};
REG rqd_reg[] = {
{ GRDATAD (UBASE, rqd_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO },
{ GRDATAD (SA, rqd_ctx.sa, DEV_RDX, 16, 0, "status/address register") },
{ GRDATAD (SAW, rqd_ctx.saw, DEV_RDX, 16, 0, "written data") },
{ GRDATAD (S1DAT, rqd_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") },
@ -1285,6 +1288,7 @@ REG rqd_reg[] = {
{ URDATAD (PKTQ, rqd_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") },
{ URDATAD (UFLG, rqd_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") },
{ URDATA (CAPAC, rqd_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) },
{ URDATAD (PLUG, rqd_unit[0].unit_plug, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_RO, "unit plug value, units 0 to 3") },
{ GRDATA (DEVADDR, rqd_dib.ba, DEV_RDX, 32, 0), REG_HRO },
{ GRDATA (DEVVEC, rqd_dib.vec, DEV_RDX, 16, 0), REG_HRO },
{ NULL }
@ -1573,12 +1577,12 @@ DEVICE *dptr = rq_devmap[uptr->cnum];
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_tmrsvc\n");
sim_activate_after (uptr, 1000000); /* reactivate */
for (i = 0; i < RQ_NUMDR; i++) { /* poll */
for (i = 0; i < dptr->numunits - 2; i++) { /* poll */
nuptr = dptr->units + i;
if ((nuptr->flags & UNIT_ATP) && /* ATN pending? */
(nuptr->flags & UNIT_ATT) && /* still online? */
(cp->cflgs & CF_ATN)) { /* wanted? */
if (!rq_una (cp, i))
if (!rq_una (cp, nuptr->unit_plug))
return SCPE_OK;
}
nuptr->flags = nuptr->flags & ~UNIT_ATP;
@ -1760,7 +1764,7 @@ UNIT *uptr;
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_gus\n");
if (cp->pak[pkt].d[CMD_MOD] & MD_NXU) { /* next unit? */
if (lu >= (cp->ubase + RQ_NUMDR)) { /* end of range? */
if (lu == 65535) { /* end of range? */
lu = 0; /* reset to 0 */
cp->pak[pkt].d[RSP_UN] = lu;
}
@ -2140,8 +2144,8 @@ bc = GETP32 (pkt, RW_WBCL); /* byte count */
bl = GETP32 (pkt, RW_WBLL); /* block addr */
ma = GETP32 (pkt, RW_WMPL); /* block addr */
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_svc(unit=%d, pkt=%d, cmd=%s, lbn=%0X, bc=%0x, phase=%s)\n",
(int)(uptr-rq_devmap[cp->cnum]->units), pkt, rq_cmdname[cp->pak[pkt].d[CMD_OPC]&0x3f], bl, bc,
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_svc(%s,unit=%d, pkt=%d, cmd=%s, lbn=%0X, bc=%0x, phase=%s)\n",
sim_uname (uptr), uptr->unit_plug, pkt, rq_cmdname[cp->pak[pkt].d[CMD_OPC]&0x3f], bl, bc,
uptr->io_complete ? "bottom" : "top");
tbc = (bc > RQ_MAXFR)? RQ_MAXFR: bc; /* trim cnt to max */
@ -2404,13 +2408,12 @@ return rq_putpkt (cp, pkt, TRUE);
/* Unit now available attention packet */
t_bool rq_una (MSC *cp, uint16 un)
t_bool rq_una (MSC *cp, uint16 lu)
{
uint16 pkt;
uint16 lu = cp->ubase + un;
UNIT *uptr = rq_getucb (cp, lu);
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_una (Unit=%d)\n", lu);
sim_debug (DBG_TRC, rq_devmap[cp->cnum], "rq_una (%s. Unit=%d)\n", sim_uname (uptr), lu);
if (uptr == NULL) /* huh? */
return OK;
if (!rq_deqf (cp, &pkt)) /* get log pkt */
@ -2593,14 +2596,13 @@ return OK;
UNIT *rq_getucb (MSC *cp, uint16 lu)
{
DEVICE *dptr = rq_devmap[cp->cnum];
UNIT *uptr;
uint32 i;
if ((lu < cp->ubase) || (lu >= (cp->ubase + RQ_NUMDR)))
return NULL;
uptr = dptr->units + (lu % RQ_NUMDR);
if (uptr->flags & UNIT_DIS)
return NULL;
return uptr;
for (i = 0; i < dptr->numunits - 2; i++)
if ((lu == dptr->units[i].unit_plug) &&
!(dptr->units[i].flags & UNIT_DIS))
return &dptr->units[i];
return NULL;
}
/* Hack unit flags */
@ -2797,6 +2799,36 @@ uptr->capac = (t_addr)drv_tab[val].lbn;
return SCPE_OK;
}
/* Show unit plug */
t_stat rq_show_plug (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
{
fprintf (st, "UNIT=%d", uptr->unit_plug);
return SCPE_OK;
}
/* Set unit plug */
t_stat rq_set_plug (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
MSC *cp = rq_ctxmap[uptr->cnum];
int32 plug;
uint32 i;
t_stat r;
DEVICE *dptr = find_dev_from_unit (uptr);
plug = (int32) get_uint (cptr, 10, 0xFFFFFFFF, &r);
if ((r != SCPE_OK) || (plug > 65534))
return sim_messagef (SCPE_ARG, "Invalid Unit Plug Number: %s\n", cptr);
if (uptr->unit_plug == plug)
return SCPE_OK;
for (i=0; i < dptr->numunits - 2; i++)
if (dptr->units[i].unit_plug == plug)
return sim_messagef (SCPE_ARG, "Unit Plug %d Already In Use on %s\n", plug, sim_uname (&dptr->units[i]));
uptr->unit_plug = plug;
return SCPE_OK;
}
/* Show unit type */
t_stat rq_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
@ -2863,6 +2895,7 @@ t_stat rq_reset (DEVICE *dptr)
int32 i, j, cidx;
UNIT *uptr;
MSC *cp;
static t_bool plugs_inited = FALSE;
DIB *dibp = (DIB *) dptr->ctxt;
sim_debug (DBG_TRC, dptr, "rq_reset\n");
@ -2878,11 +2911,22 @@ cp->cnum = cidx; /* init index */
if (cp->ctype == DEFAULT_CTYPE)
cp->ctype = (UNIBUS? UDA50_CTYPE : RQDX3_CTYPE);
#if defined (VM_VAX) /* VAX */
cp->ubase = 0; /* unit base = 0 */
#else /* PDP-11 */
cp->ubase = (uint16)(cidx * RQ_NUMDR); /* init unit base */
if (!plugs_inited ) {
uint32 d, u = 0;
plugs_inited = TRUE;
for (i = 0; i < RQ_NUMCT; i++) {
for (d = 0; d < rq_devmap[i]->numunits - 2; d++) {
rq_devmap[i]->units[d].unit_plug =
#if defined (VM_VAX)
d; /* VAX default units */
#else
u; /* PDP11 unique unit numbers */
#endif
++u;
}
}
}
cp->csta = CST_S1; /* init stage 1 */
cp->s1dat = 0; /* no S1 data */
@ -3004,10 +3048,11 @@ t_stat rq_boot (int32 unitno, DEVICE *dptr)
{
size_t i;
DIB *dibp = (DIB *) dptr->ctxt;
UNIT *uptr = &dptr->units[unitno];
for (i = 0; i < BOOT_LEN; i++)
M[(BOOT_START >> 1) + i] = boot_rom[i];
M[BOOT_UNIT >> 1] = unitno & 3;
M[BOOT_UNIT >> 1] = uptr->unit_plug;
M[BOOT_CSR >> 1] = dibp->ba & DMASK;
cpu_set_boot (BOOT_ENTRY);
return SCPE_OK;