mirror of
https://github.com/simh/simh.git
synced 2026-01-13 23:35:57 +00:00
PDP11, VAX: Fix AutoConfigure to allow multiple dynamically configured devices to allocate from the same pool of fixed addresses.
Dynamically configured devices simulate multiple controllers with a single DEVICE structure and can have the number of controllers being simulated set by the user. DLI, DZ, DUP, DMC, TDC, VH, DC are all dynamically configured devices. DLI and TDC are dynamically configured devices which get static bus addresses.
This commit is contained in:
parent
b4e604aae4
commit
3e3c05523c
@ -521,6 +521,12 @@ struct pdp_dib {
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
};
|
||||
|
||||
typedef struct pdp_dib DIB;
|
||||
|
||||
@ -551,15 +551,15 @@ return SCPE_OK;
|
||||
|
||||
/* Autoconfiguration
|
||||
|
||||
The table reflects the MicroVAX 3900 microcode, with one field addition - the
|
||||
number of controllers field handles devices where multiple instances
|
||||
are simulated through a single DEVICE structure (e.g., DZ, VH, DL, DC).
|
||||
The table reflects the MicroVAX 3900 microcode, with one field
|
||||
addition:
|
||||
a valid flag marking the end of the list when the value is -1
|
||||
|
||||
The table has been reviewed, extended and updated to reflect the contents of
|
||||
the auto configure table in VMS sysgen (V5.5-2)
|
||||
The table has been reviewed, extended and updated to reflect the
|
||||
contents of the auto configure table in VMS sysgen (V5.5-2)
|
||||
|
||||
A minus number of vectors indicates a field that should be calculated
|
||||
but not placed in the DIB (RQ, TQ dynamic vectors)
|
||||
A minus number of vectors indicates a field that should be
|
||||
calculated but not placed in the DIB (RQ, TQ dynamic vectors)
|
||||
|
||||
An amod value of 0 indicates that all addresses are FIXED
|
||||
An vmod value of 0 indicates that all vectors are FIXED */
|
||||
@ -567,7 +567,7 @@ return SCPE_OK;
|
||||
|
||||
typedef struct {
|
||||
const char *dnam[AUTO_MAXC];
|
||||
int32 numc;
|
||||
int32 valid;
|
||||
int32 numv;
|
||||
uint32 amod;
|
||||
uint32 vmod;
|
||||
@ -624,11 +624,6 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
|
||||
014240, 014250, 014260, 014270,
|
||||
014300, 014310, 014320, 014330,
|
||||
014340, 014350, 014360, 014370} }, /* DC11 - fx CSRs */
|
||||
{ { "TDC" }, 1, 2, 0, 8,
|
||||
{016500, 016510, 016520, 016530,
|
||||
016540, 016550, 016560, 016570,
|
||||
016600, 016610, 016620, 016630,
|
||||
016640, 016650, 016660, 016670} }, /* TU58 - fx CSRs */
|
||||
{ { NULL }, 1, 1, 0, 4,
|
||||
{015200, 015210, 015220, 015230,
|
||||
015240, 015250, 015260, 015270,
|
||||
@ -652,11 +647,11 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
|
||||
017430, 017432, 017434, 017436} }, /* DT11 - fx CSRs */
|
||||
{ { NULL }, 1, 2, 0, 8,
|
||||
{016200, 016240} }, /* DX11 */
|
||||
{ { "DLI" }, 1, 2, 0, 8,
|
||||
{ { "TDC", "DLI" }, 1, 2, 0, 8,
|
||||
{016500, 016510, 016520, 016530,
|
||||
016540, 016550, 016560, 016570,
|
||||
016600, 016610, 016620, 016630,
|
||||
016740, 016750, 016760, 016770} }, /* KL11/DL11/DLV11 - fx CSRs */
|
||||
016740, 016750, 016760, 016770} }, /* KL11/DL11/DLV11/TU58 - fx CSRs */
|
||||
{ { NULL }, 1, 2, 0, 8, { 0 } }, /* DLV11J - fx CSRs */
|
||||
{ { NULL }, 1, 2, 8, 8 }, /* DJ11 */
|
||||
{ { NULL }, 1, 2, 16, 8 }, /* DH11 */
|
||||
@ -773,7 +768,7 @@ AUTO_CON auto_tab[] = {/*c #v am vm fxa fxv */
|
||||
{ { NULL }, 1, 2, 4, 8 }, /* DTC05, DECvoice */
|
||||
{ { NULL }, 1, 2, 8, 8 }, /* KWV32 (DSV11) */
|
||||
{ { NULL }, 1, 1, 64, 4 }, /* QZA */
|
||||
{ { NULL }, -1 } /* end table */
|
||||
{ { NULL }, -1 } /* end table */
|
||||
};
|
||||
|
||||
#if !defined(DEV_NEXUS)
|
||||
@ -801,7 +796,7 @@ if (done)
|
||||
for (j = 0; (dptr = sim_devices[j]) != NULL; j++) {
|
||||
if ((dptr->flags & (DEV_UBUS | DEV_QBUS)) == 0)
|
||||
continue;
|
||||
for (autp = auto_tab; autp->numc >= 0; autp++) {
|
||||
for (autp = auto_tab; autp->valid >= 0; autp++) {
|
||||
for (k=0; autp->dnam[k]; k++) {
|
||||
if (!strcmp(dptr->name, autp->dnam[k])) {
|
||||
dibp = (DIB *)dptr->ctxt;
|
||||
@ -827,7 +822,7 @@ t_stat auto_config (const char *name, int32 nctrl)
|
||||
{
|
||||
uint32 csr = IOPAGEBASE + AUTO_CSRBASE;
|
||||
uint32 vec = AUTO_VECBASE;
|
||||
int32 ilvl, ibit;
|
||||
int32 ilvl, ibit, numc;
|
||||
extern UNIT cpu_unit;
|
||||
AUTO_CON *autp;
|
||||
DEVICE *dptr;
|
||||
@ -837,20 +832,13 @@ uint32 j, k, jdis, vmask, amask;
|
||||
if (autcon_enb == 0) /* enabled? */
|
||||
return SCPE_OK;
|
||||
if (name) { /* updating? */
|
||||
if (nctrl < 0)
|
||||
dptr = find_dev (name);
|
||||
dibp = (DIB *) dptr->ctxt; /* get DIB */
|
||||
if ((nctrl < 0) || (dptr == NULL) || (dibp == NULL))
|
||||
return SCPE_ARG;
|
||||
for (autp = auto_tab; autp->numc >= 0; autp++) {
|
||||
for (j = 0; (j < AUTO_MAXC) && autp->dnam[j]; j++) {
|
||||
if (strcmp (name, autp->dnam[j]) == 0) {
|
||||
autp->numc = nctrl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((j < AUTO_MAXC) && autp->dnam[j] && (strcmp (name, autp->dnam[j]) == 0))
|
||||
break;
|
||||
}
|
||||
dibp->numc = nctrl;
|
||||
}
|
||||
for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
|
||||
for (autp = auto_tab; autp->valid >= 0; autp++) { /* loop thru table */
|
||||
if (autp->amod) { /* floating csr? */
|
||||
amask = autp->amod - 1;
|
||||
csr = (csr + amask) & ~amask; /* align csr */
|
||||
@ -877,6 +865,7 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
|
||||
dibp = (DIB *) dptr->ctxt; /* get DIB */
|
||||
if (dibp == NULL) /* not there??? */
|
||||
return SCPE_IERR;
|
||||
numc = dibp->numc ? dibp->numc : 1;
|
||||
ilvl = dibp->vloc / 32;
|
||||
ibit = dibp->vloc % 32;
|
||||
/* Identify how many devices earlier in the device list are
|
||||
@ -891,7 +880,7 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
|
||||
dibp->ba = IOPAGEBASE + autp->fixa[j-jdis]; /* use it */
|
||||
else { /* no fixed left */
|
||||
dibp->ba = csr; /* set CSR */
|
||||
csr += (autp->numc * autp->amod); /* next CSR */
|
||||
csr += (numc * autp->amod); /* next CSR */
|
||||
} /* end else */
|
||||
if (autp->numv) { /* vec needed? */
|
||||
if (autp->fixv[j-jdis]) { /* fixed vec avail? */
|
||||
@ -904,7 +893,7 @@ for (autp = auto_tab; autp->numc >= 0; autp++) { /* loop thru table */
|
||||
vec = (vec + vmask) & ~vmask; /* align vector */
|
||||
if (autp->numv > 0)
|
||||
dibp->vec = vec; /* set vector */
|
||||
vec += (autp->numc * numv * 4);
|
||||
vec += (numc * numv * 4);
|
||||
} /* end else */
|
||||
} /* end vec needed */
|
||||
} /* end for j */
|
||||
|
||||
@ -196,7 +196,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */
|
||||
|
||||
@ -246,7 +246,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */
|
||||
|
||||
@ -238,7 +238,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Unibus I/O page layout - see pdp11_io_lib.c for address layout details */
|
||||
|
||||
@ -278,7 +278,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Unibus I/O page layout - see pdp11_io_lib.c for address layout details
|
||||
|
||||
@ -292,7 +292,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Unibus I/O page layout - see pdp11_io_lib.c for address layout details
|
||||
|
||||
@ -322,7 +322,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Unibus I/O page layout - XUB,RQB,RQC,RQD float based on number of DZ's
|
||||
|
||||
@ -296,7 +296,15 @@ typedef struct {
|
||||
int32 vloc; /* locator */
|
||||
int32 vec; /* value */
|
||||
int32 (*ack[VEC_DEVMAX])(void); /* ack routine */
|
||||
uint32 ulnt; /* IO length per unit */
|
||||
uint32 ulnt; /* IO length per-device */
|
||||
/* Only need to be populated */
|
||||
/* when numunits != num devices */
|
||||
int32 numc; /* Number of controllers */
|
||||
/* this field handles devices */
|
||||
/* where multiple instances are */
|
||||
/* simulated through a single */
|
||||
/* DEVICE structure (e.g., DZ, VH, DL, DC). */
|
||||
/* Populated by auto-configure */
|
||||
} DIB;
|
||||
|
||||
/* Qbus I/O page layout - see pdp11_io_lib.c for address layout details */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user