Fixed devices missed in Auto Configuration for PDP11 simulator. CLK issue initially reported by Matt Burke

This commit is contained in:
Mark Pizzolato 2013-01-01 05:54:53 -08:00
parent 43b1c04ae4
commit b1d306cff8
2 changed files with 59 additions and 53 deletions

View file

@ -925,7 +925,7 @@ return SCPE_OK;
The table reflects the MicroVAX 3900 microcode, with one field addition - the The table reflects the MicroVAX 3900 microcode, with one field addition - the
number of controllers field handles devices where multiple instances number of controllers field handles devices where multiple instances
are simulated through a single DEVICE structure (e.g., DZ, VH). are simulated through a single DEVICE structure (e.g., DZ, VH, DL, DC).
The table has been reviewed, extended and updated to reflect the contents of The table has been reviewed, extended and updated to reflect the contents of
the auto configure table in VMS sysgen (V5.5-2) the auto configure table in VMS sysgen (V5.5-2)
@ -936,9 +936,7 @@ return SCPE_OK;
An amod value of 0 indicates that all addresses are FIXED An amod value of 0 indicates that all addresses are FIXED
An vmod value of 0 indicates that all vectors are FIXED */ An vmod value of 0 indicates that all vectors are FIXED */
#define DCX_LINES 8
#define DLX_LINES 8
#define VH_MUXES 1
typedef struct { typedef struct {
char *dnam[AUTO_MAXC]; char *dnam[AUTO_MAXC];
int32 numc; int32 numc;
@ -960,8 +958,10 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{010700} }, /* KG11-A - fx CSR, no VEC */ {010700} }, /* KG11-A - fx CSR, no VEC */
{ { "RHA", "RHB" }, 1, 1, 0, 0, { { "RHA", "RHB" }, 1, 1, 0, 0,
{016700, 012440}, {0254, 0224} }, /* RH11/RH70 - fx CSR, fx VEC */ {016700, 012440}, {0254, 0224} }, /* RH11/RH70 - fx CSR, fx VEC */
{ { "CLK" }, 1, 0, 0, 0, { { "CLK" }, 1, 1, 0, 0,
{017546}, {0100} }, /* KW11L - fx CSR, fx VEC */ {017546}, {0100} }, /* KW11L - fx CSR, fx VEC */
{ { "PCLK" }, 1, 1, 0, 0,
{012540}, {0104} }, /* KW11P - fx CSR, fx VEC */
{ { "PTR" }, 1, 1, 0, 0, { { "PTR" }, 1, 1, 0, 0,
{017550}, {0070} }, /* PC11 reader - fx CSR, fx VEC */ {017550}, {0070} }, /* PC11 reader - fx CSR, fx VEC */
{ { "PTP" }, 1, 1, 0, 0, { { "PTP" }, 1, 1, 0, 0,
@ -987,7 +987,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{014400}, {0160} }, /* RL11 - fx CSR, fx VEC */ {014400}, {0160} }, /* RL11 - fx CSR, fx VEC */
{ { "RL" }, 1, 1, 0, 0, { { "RL" }, 1, 1, 0, 0,
{014400}, {0160} }, /* RL11 - fx CSR, fx VEC */ {014400}, {0160} }, /* RL11 - fx CSR, fx VEC */
{ { "DCI" }, DCX_LINES, 2, 0, 8, { { "DCI" }, 1, 2, 0, 8,
{014000, 014010, 014020, 014030, {014000, 014010, 014020, 014030,
014040, 014050, 014060, 014070, 014040, 014050, 014060, 014070,
014100, 014110, 014120, 014130, 014100, 014110, 014120, 014130,
@ -1024,7 +1024,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
017430, 017432, 017434, 017436} }, /* DT11 - fx CSRs */ 017430, 017432, 017434, 017436} }, /* DT11 - fx CSRs */
{ { NULL }, 1, 2, 0, 8, { { NULL }, 1, 2, 0, 8,
{016200, 016240} }, /* DX11 */ {016200, 016240} }, /* DX11 */
{ { "DLI" }, DLX_LINES, 2, 0, 8, { { "DLI" }, 1, 2, 0, 8,
{016500, 016510, 016520, 016530, {016500, 016510, 016520, 016530,
016540, 016550, 016560, 016570, 016540, 016550, 016560, 016570,
016600, 016610, 016620, 016630, 016600, 016610, 016620, 016630,
@ -1046,7 +1046,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{ { NULL }, 1, 2, 8, 8 }, /* LK11A */ { { NULL }, 1, 2, 8, 8 }, /* LK11A */
{ { "DMC0", "DMC1", "DMC2", "DMC3" }, { { "DMC0", "DMC1", "DMC2", "DMC3" },
1, 2, 8, 8 }, /* DMC11 */ 1, 2, 8, 8 }, /* DMC11 */
{ { "DZ" }, DZ_MUXES, 2, 8, 8 }, /* DZ11 */ { { "DZ" }, 1, 2, 8, 8 }, /* DZ11 */
{ { NULL }, 1, 2, 8, 8 }, /* KMC11 */ { { NULL }, 1, 2, 8, 8 }, /* KMC11 */
{ { NULL }, 1, 2, 8, 8 }, /* LPP11 */ { { NULL }, 1, 2, 8, 8 }, /* LPP11 */
{ { NULL }, 1, 2, 8, 8 }, /* VMV21 */ { { NULL }, 1, 2, 8, 8 }, /* VMV21 */
@ -1090,11 +1090,13 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{004400, 004440, 004500, 004540} }, /* KTC32 */ {004400, 004440, 004500, 004540} }, /* KTC32 */
{ { NULL }, 1, 2, 0, 8, { { NULL }, 1, 2, 0, 8,
{004100} }, /* IEQ11 */ {004100} }, /* IEQ11 */
{ { "VH" }, VH_MUXES, 2, 16, 8 }, /* DHU11/DHQ11 */ { { "VH" }, 1, 2, 16, 8 }, /* DHU11/DHQ11 */
{ { NULL }, 1, 6, 32, 4 }, /* DMZ32 */ { { NULL }, 1, 6, 32, 4 }, /* DMZ32 */
{ { NULL }, 1, 6, 32, 4 }, /* CP132 */ { { NULL }, 1, 6, 32, 4 }, /* CP132 */
{ { NULL }, 1, 1, 0, 0, { { "TC" }, 1, 1, 0, 0,
{017340}, {0214} }, /* TC11 */ {017340}, {0214} }, /* TC11 */
{ { "TA" }, 1, 1, 0, 0,
{017500}, {0260} }, /* TA11 */
{ { NULL }, 1, 2, 64, 8, { { NULL }, 1, 2, 64, 8,
{017200} }, /* QVSS - fx CSR */ {017200} }, /* QVSS - fx CSR */
{ { NULL }, 1, 1, 8, 4 }, /* VS31 */ { { NULL }, 1, 1, 8, 4 }, /* VS31 */
@ -1146,6 +1148,13 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{ { NULL }, -1 } /* end table */ { { NULL }, -1 } /* end table */
}; };
#if !defined(DEV_NEXUS)
#if defined(DEV_MBUS)
#define DEV_NEXUS DEV_MBUS
#else
#define DEV_NEXUS 0
#endif
#endif
t_stat auto_config (char *name, int32 nctrl) t_stat auto_config (char *name, int32 nctrl)
{ {
uint32 csr = IOPAGEBASE + AUTO_CSRBASE; uint32 csr = IOPAGEBASE + AUTO_CSRBASE;
@ -1153,8 +1162,7 @@ uint32 vec = VEC_Q + AUTO_VECBASE;
AUTO_CON *autp; AUTO_CON *autp;
DEVICE *dptr; DEVICE *dptr;
DIB *dibp; DIB *dibp;
t_bool auto_fixed = TRUE; uint32 j, vmask, amask;
uint32 j, k, vmask, amask;
if (autcon_enb == 0) /* enabled? */ if (autcon_enb == 0) /* enabled? */
return SCPE_OK; return SCPE_OK;
@ -1173,39 +1181,37 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
amask = autp->amod - 1; amask = autp->amod - 1;
csr = (csr + amask) & ~amask; /* align csr */ csr = (csr + amask) & ~amask; /* align csr */
} }
for (j = k = 0; (j < AUTO_MAXC) && autp->dnam[j]; j++) { for (j = 0; (j < AUTO_MAXC) && autp->dnam[j]; j++) {
if (autp->dnam[j] == NULL) /* no device? */ if (autp->dnam[j] == NULL) /* no device? */
break; break;
dptr = find_dev (autp->dnam[j]); /* find ctrl */ dptr = find_dev (autp->dnam[j]); /* find ctrl */
if ((dptr == NULL) || /* enabled, floating? */ if ((dptr == NULL) || /* enabled, not nexus? */
(dptr->flags & DEV_DIS)) (dptr->flags & DEV_DIS) ||
(dptr->flags & DEV_NEXUS) )
continue; continue;
dibp = (DIB *) dptr->ctxt; /* get DIB */ dibp = (DIB *) dptr->ctxt; /* get DIB */
if (dibp == NULL) /* not there??? */ if (dibp == NULL) /* not there??? */
return SCPE_IERR; return SCPE_IERR;
if (auto_fixed || (autp->amod)) { /* dyn csr needed? */ if (autp->fixa[j]) /* fixed csr avail? */
if (autp->fixa[k]) /* fixed csr avail? */ dibp->ba = IOPAGEBASE + autp->fixa[j]; /* use it */
dibp->ba = IOPAGEBASE + autp->fixa[k]; /* use it */ else { /* no fixed left */
else { /* no fixed left */ dibp->ba = csr; /* set CSR */
dibp->ba = csr; /* set CSR */ csr += (autp->numc * autp->amod); /* next CSR */
csr += (autp->numc * autp->amod); /* next CSR */ } /* end else */
} /* end else */ if (autp->numv) { /* vec needed? */
} /* end if dyn csr */ if (autp->fixv[j]) { /* fixed vec avail? */
if (autp->numv && (autp->vmod || auto_fixed)) { /* dyn vec needed? */
uint32 numv = abs (autp->numv); /* get num vec */
if (autp->fixv[k]) { /* fixed vec avail? */
if (autp->numv > 0) if (autp->numv > 0)
dibp->vec = VEC_Q + autp->fixv[k]; /* use it */ dibp->vec = VEC_Q + autp->fixv[j]; /* use it */
} }
else { /* no fixed left */ else { /* no fixed left */
uint32 numv = abs (autp->numv); /* get num vec */
vmask = autp->vmod - 1; vmask = autp->vmod - 1;
vec = (vec + vmask) & ~vmask; /* align vector */ vec = (vec + vmask) & ~vmask; /* align vector */
if (autp->numv > 0) if (autp->numv > 0)
dibp->vec = vec; /* set vector */ dibp->vec = vec; /* set vector */
vec += (autp->numc * numv * 4); vec += (autp->numc * numv * 4);
} /* end else */ } /* end else */
} /* end if dyn vec */ } /* end vec needed */
k++; /* next instance */
} /* end for j */ } /* end for j */
if (autp->amod) /* flt CSR? gap */ if (autp->amod) /* flt CSR? gap */
csr = csr + 2; csr = csr + 2;

View file

@ -327,7 +327,7 @@ return SCPE_OK;
The table reflects the MicroVAX 3900 microcode, with one field addition - the The table reflects the MicroVAX 3900 microcode, with one field addition - the
number of controllers field handles devices where multiple instances number of controllers field handles devices where multiple instances
are simulated through a single DEVICE structure (e.g., DZ, VH). are simulated through a single DEVICE structure (e.g., DZ, VH, DL, DC).
The table has been reviewed, extended and updated to reflect the contents of The table has been reviewed, extended and updated to reflect the contents of
the auto configure table in VMS sysgen (V5.5-2) the auto configure table in VMS sysgen (V5.5-2)
@ -360,8 +360,10 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{010700} }, /* KG11-A - fx CSR, no VEC */ {010700} }, /* KG11-A - fx CSR, no VEC */
{ { "RHA", "RHB" }, 1, 1, 0, 0, { { "RHA", "RHB" }, 1, 1, 0, 0,
{016700, 012440}, {0254, 0224} }, /* RH11/RH70 - fx CSR, fx VEC */ {016700, 012440}, {0254, 0224} }, /* RH11/RH70 - fx CSR, fx VEC */
{ { "CLK" }, 1, 0, 0, 0, { { "CLK" }, 1, 1, 0, 0,
{017546}, {0100} }, /* KW11L - fx CSR, fx VEC */ {017546}, {0100} }, /* KW11L - fx CSR, fx VEC */
{ { "PCLK" }, 1, 1, 0, 0,
{012540}, {0104} }, /* KW11P - fx CSR, fx VEC */
{ { "PTR" }, 1, 1, 0, 0, { { "PTR" }, 1, 1, 0, 0,
{017550}, {0070} }, /* PC11 reader - fx CSR, fx VEC */ {017550}, {0070} }, /* PC11 reader - fx CSR, fx VEC */
{ { "PTP" }, 1, 1, 0, 0, { { "PTP" }, 1, 1, 0, 0,
@ -387,7 +389,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{014400}, {0160} }, /* RL11 - fx CSR, fx VEC */ {014400}, {0160} }, /* RL11 - fx CSR, fx VEC */
{ { "RL" }, 1, 1, 0, 0, { { "RL" }, 1, 1, 0, 0,
{014400}, {0160} }, /* RL11 - fx CSR, fx VEC */ {014400}, {0160} }, /* RL11 - fx CSR, fx VEC */
{ { "DCI" }, DCX_LINES, 2, 0, 8, { { "DCI" }, 1, 2, 0, 8,
{014000, 014010, 014020, 014030, {014000, 014010, 014020, 014030,
014040, 014050, 014060, 014070, 014040, 014050, 014060, 014070,
014100, 014110, 014120, 014130, 014100, 014110, 014120, 014130,
@ -424,7 +426,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
017430, 017432, 017434, 017436} }, /* DT11 - fx CSRs */ 017430, 017432, 017434, 017436} }, /* DT11 - fx CSRs */
{ { NULL }, 1, 2, 0, 8, { { NULL }, 1, 2, 0, 8,
{016200, 016240} }, /* DX11 */ {016200, 016240} }, /* DX11 */
{ { "DLI" }, DLX_LINES, 2, 0, 8, { { "DLI" }, 1, 2, 0, 8,
{016500, 016510, 016520, 016530, {016500, 016510, 016520, 016530,
016540, 016550, 016560, 016570, 016540, 016550, 016560, 016570,
016600, 016610, 016620, 016630, 016600, 016610, 016620, 016630,
@ -446,7 +448,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{ { NULL }, 1, 2, 8, 8 }, /* LK11A */ { { NULL }, 1, 2, 8, 8 }, /* LK11A */
{ { "DMC0", "DMC1", "DMC2", "DMC3" }, { { "DMC0", "DMC1", "DMC2", "DMC3" },
1, 2, 8, 8 }, /* DMC11 */ 1, 2, 8, 8 }, /* DMC11 */
{ { "DZ" }, DZ_MUXES, 2, 8, 8 }, /* DZ11 */ { { "DZ" }, 1, 2, 8, 8 }, /* DZ11 */
{ { NULL }, 1, 2, 8, 8 }, /* KMC11 */ { { NULL }, 1, 2, 8, 8 }, /* KMC11 */
{ { NULL }, 1, 2, 8, 8 }, /* LPP11 */ { { NULL }, 1, 2, 8, 8 }, /* LPP11 */
{ { NULL }, 1, 2, 8, 8 }, /* VMV21 */ { { NULL }, 1, 2, 8, 8 }, /* VMV21 */
@ -490,11 +492,13 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
{004400, 004440, 004500, 004540} }, /* KTC32 */ {004400, 004440, 004500, 004540} }, /* KTC32 */
{ { NULL }, 1, 2, 0, 8, { { NULL }, 1, 2, 0, 8,
{004100} }, /* IEQ11 */ {004100} }, /* IEQ11 */
{ { "VH" }, VH_MUXES, 2, 16, 8 }, /* DHU11/DHQ11 */ { { "VH" }, 1, 2, 16, 8 }, /* DHU11/DHQ11 */
{ { NULL }, 1, 6, 32, 4 }, /* DMZ32 */ { { NULL }, 1, 6, 32, 4 }, /* DMZ32 */
{ { NULL }, 1, 6, 32, 4 }, /* CP132 */ { { NULL }, 1, 6, 32, 4 }, /* CP132 */
{ { NULL }, 1, 1, 0, 0, { { "TC" }, 1, 1, 0, 0,
{017340}, {0214} }, /* TC11 */ {017340}, {0214} }, /* TC11 */
{ { "TA" }, 1, 1, 0, 0,
{017500}, {0260} }, /* TA11 */
{ { NULL }, 1, 2, 64, 8, { { NULL }, 1, 2, 64, 8,
{017200} }, /* QVSS - fx CSR */ {017200} }, /* QVSS - fx CSR */
{ { NULL }, 1, 1, 8, 4 }, /* VS31 */ { { NULL }, 1, 1, 8, 4 }, /* VS31 */
@ -560,8 +564,7 @@ uint32 vec = VEC_Q + AUTO_VECBASE;
AUTO_CON *autp; AUTO_CON *autp;
DEVICE *dptr; DEVICE *dptr;
DIB *dibp; DIB *dibp;
t_bool auto_fixed = TRUE; uint32 j, vmask, amask;
uint32 j, k, vmask, amask;
if (autcon_enb == 0) /* enabled? */ if (autcon_enb == 0) /* enabled? */
return SCPE_OK; return SCPE_OK;
@ -580,7 +583,7 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
amask = autp->amod - 1; amask = autp->amod - 1;
csr = (csr + amask) & ~amask; /* align csr */ csr = (csr + amask) & ~amask; /* align csr */
} }
for (j = k = 0; (j < AUTO_MAXC) && autp->dnam[j]; j++) { for (j = 0; (j < AUTO_MAXC) && autp->dnam[j]; j++) {
if (autp->dnam[j] == NULL) /* no device? */ if (autp->dnam[j] == NULL) /* no device? */
break; break;
dptr = find_dev (autp->dnam[j]); /* find ctrl */ dptr = find_dev (autp->dnam[j]); /* find ctrl */
@ -591,29 +594,26 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
dibp = (DIB *) dptr->ctxt; /* get DIB */ dibp = (DIB *) dptr->ctxt; /* get DIB */
if (dibp == NULL) /* not there??? */ if (dibp == NULL) /* not there??? */
return SCPE_IERR; return SCPE_IERR;
if (auto_fixed || (autp->amod)) { /* dyn csr needed? */ if (autp->fixa[j]) /* fixed csr avail? */
if (autp->fixa[k]) /* fixed csr avail? */ dibp->ba = IOPAGEBASE + autp->fixa[j]; /* use it */
dibp->ba = IOPAGEBASE + autp->fixa[k]; /* use it */ else { /* no fixed left */
else { /* no fixed left */ dibp->ba = csr; /* set CSR */
dibp->ba = csr; /* set CSR */ csr += (autp->numc * autp->amod); /* next CSR */
csr += (autp->numc * autp->amod); /* next CSR */ } /* end else */
} /* end else */ if (autp->numv) { /* vec needed? */
} /* end if dyn csr */ if (autp->fixv[j]) { /* fixed vec avail? */
if (autp->numv && (autp->vmod || auto_fixed)) { /* dyn vec needed? */
uint32 numv = abs (autp->numv); /* get num vec */
if (autp->fixv[k]) { /* fixed vec avail? */
if (autp->numv > 0) if (autp->numv > 0)
dibp->vec = VEC_Q + autp->fixv[k]; /* use it */ dibp->vec = VEC_Q + autp->fixv[j]; /* use it */
} }
else { /* no fixed left */ else { /* no fixed left */
uint32 numv = abs (autp->numv); /* get num vec */
vmask = autp->vmod - 1; vmask = autp->vmod - 1;
vec = (vec + vmask) & ~vmask; /* align vector */ vec = (vec + vmask) & ~vmask; /* align vector */
if (autp->numv > 0) if (autp->numv > 0)
dibp->vec = vec; /* set vector */ dibp->vec = vec; /* set vector */
vec += (autp->numc * numv * 4); vec += (autp->numc * numv * 4);
} /* end else */ } /* end else */
} /* end if dyn vec */ } /* end vec needed */
k++; /* next instance */
} /* end for j */ } /* end for j */
if (autp->amod) /* flt CSR? gap */ if (autp->amod) /* flt CSR? gap */
csr = csr + 2; csr = csr + 2;