PDP-11/VAX update: SHOW IOSPACE
Teach SHOW IOSPACE to output vector and BR addresses as well as CSR addresses.
This commit is contained in:
parent
1bfc2bc57e
commit
4497bba48f
2 changed files with 91 additions and 3 deletions
|
@ -298,9 +298,77 @@ t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, void *desc)
|
||||||
uint32 i, j;
|
uint32 i, j;
|
||||||
DEVICE *dptr;
|
DEVICE *dptr;
|
||||||
DIB *dibp;
|
DIB *dibp;
|
||||||
|
uint32 maxaddr, maxname;
|
||||||
|
int32 maxvec, vecwid;
|
||||||
|
char valbuf[40];
|
||||||
|
|
||||||
if (build_dib_tab ()) /* build IO page */
|
if (build_dib_tab ()) /* build IO page */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
|
||||||
|
maxaddr = 0;
|
||||||
|
maxvec = 0;
|
||||||
|
maxname = 0;
|
||||||
|
|
||||||
|
for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */
|
||||||
|
size_t l;
|
||||||
|
if (iodibp[i] && (iodibp[i] != dibp)) { /* new block? */
|
||||||
|
dibp = iodibp[i]; /* DIB for block */
|
||||||
|
for (j = 0, dptr = NULL; sim_devices[j] != NULL; j++) {
|
||||||
|
if (((DIB*) sim_devices[j]->ctxt) == dibp) {
|
||||||
|
dptr = sim_devices[j]; /* locate device */
|
||||||
|
break;
|
||||||
|
} /* end if */
|
||||||
|
} /* end for j */
|
||||||
|
if ((dibp->ba+ dibp->lnt - 1) > maxaddr)
|
||||||
|
maxaddr = dibp->ba+ dibp->lnt - 1;
|
||||||
|
if (dibp->vec > maxvec)
|
||||||
|
maxvec = dibp->vec;
|
||||||
|
l = strlen (dptr? sim_dname (dptr): "CPU");
|
||||||
|
if (l>maxname)
|
||||||
|
maxname = (int32)l;
|
||||||
|
} /* end if */
|
||||||
|
} /* end for i */
|
||||||
|
maxaddr = fprint_val (NULL, (t_value) dibp->ba, DEV_RDX, 32, PV_LEFT);
|
||||||
|
sprintf (valbuf, "%03o", maxvec);
|
||||||
|
vecwid = maxvec = (int32) strlen (valbuf);
|
||||||
|
if (vecwid < 3)
|
||||||
|
vecwid = 3;
|
||||||
|
|
||||||
|
j = strlen ("Address");
|
||||||
|
i = (maxaddr*2)+3+1;
|
||||||
|
if (i <= j)
|
||||||
|
i = 0;
|
||||||
|
else
|
||||||
|
i -= j;
|
||||||
|
maxaddr = i+j;
|
||||||
|
fprintf (st, "%*.*sAddress%*.*s", i/2, i/2, " ", (i/2)+i%2, (i/2)+i%2, " ");
|
||||||
|
|
||||||
|
j = strlen ("Vector");
|
||||||
|
i = ((maxvec*2)+1+1);
|
||||||
|
if (i <= j)
|
||||||
|
i = 0;
|
||||||
|
else
|
||||||
|
i -= j;
|
||||||
|
maxvec = i+j;
|
||||||
|
fprintf (st, " %*.*sVector%*.*s", i/2, i/2, " ", (i/2)+i%2, (i/2)+i%2, " ");
|
||||||
|
|
||||||
|
fprintf (st, " BR Device\n");
|
||||||
|
for (i = 0; i < maxaddr; i++)
|
||||||
|
fputc ('-', st);
|
||||||
|
fprintf (st, " ");
|
||||||
|
for (i = 0; i < (uint32)maxvec; i++)
|
||||||
|
fputc ('-', st);
|
||||||
|
|
||||||
|
fprintf (st, " -- ");
|
||||||
|
|
||||||
|
i = strlen ("Device");
|
||||||
|
if (maxname < i)
|
||||||
|
maxname = i;
|
||||||
|
|
||||||
|
for (i = 0; i < maxname; i++)
|
||||||
|
fputc ('-', st);
|
||||||
|
fputc ('\n', st);
|
||||||
|
|
||||||
for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */
|
for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */
|
||||||
if (iodibp[i] && (iodibp[i] != dibp)) { /* new block? */
|
if (iodibp[i] && (iodibp[i] != dibp)) { /* new block? */
|
||||||
dibp = iodibp[i]; /* DIB for block */
|
dibp = iodibp[i]; /* DIB for block */
|
||||||
|
@ -313,9 +381,23 @@ for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */
|
||||||
fprint_val (st, (t_value) dibp->ba, DEV_RDX, 32, PV_LEFT);
|
fprint_val (st, (t_value) dibp->ba, DEV_RDX, 32, PV_LEFT);
|
||||||
fprintf (st, " - ");
|
fprintf (st, " - ");
|
||||||
fprint_val (st, (t_value) dibp->ba + dibp->lnt - 1, DEV_RDX, 32, PV_LEFT);
|
fprint_val (st, (t_value) dibp->ba + dibp->lnt - 1, DEV_RDX, 32, PV_LEFT);
|
||||||
fprintf (st, "%c\t%s\n", /* print block entry */
|
fprintf (st, "%c ", /* print block entry */
|
||||||
(dibp->ba < IOPAGEBASE + AUTO_CSRBASE + AUTO_CSRMAX)? '*': ' ',
|
(dibp->ba < IOPAGEBASE + AUTO_CSRBASE + AUTO_CSRMAX)? '*': ' ');
|
||||||
dptr? sim_dname (dptr): "CPU");
|
if (dibp->vec == 0)
|
||||||
|
fprintf (st, "%*s", ((vecwid*2)+1+1), " ");
|
||||||
|
else {
|
||||||
|
fprintf (st, "%0*o", vecwid, dibp->vec);
|
||||||
|
if (dibp->vnum > 1)
|
||||||
|
fprintf (st, "-%0*o", vecwid, dibp->vec + (4 * (dibp->vnum - 1)));
|
||||||
|
else
|
||||||
|
fprintf (st, " %*s", vecwid, " ");
|
||||||
|
fprintf (st, "%1s", (dibp->vnum >= AUTO_VECBASE)? "*": " ");
|
||||||
|
}
|
||||||
|
if (dibp->vnum || dibp->vloc)
|
||||||
|
fprintf (st, " %2u", dibp->vloc/32);
|
||||||
|
else
|
||||||
|
fprintf (st, " ");
|
||||||
|
fprintf (st, " %s\n", dptr? sim_dname (dptr): "CPU");
|
||||||
} /* end if */
|
} /* end if */
|
||||||
} /* end for i */
|
} /* end for i */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
|
6
scp.c
6
scp.c
|
@ -6098,6 +6098,8 @@ return val;
|
||||||
format = leading zeroes format
|
format = leading zeroes format
|
||||||
Outputs:
|
Outputs:
|
||||||
status = error status
|
status = error status
|
||||||
|
if stream is NULL, returns length of output that would
|
||||||
|
have been generated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
t_stat fprint_val (FILE *stream, t_value val, uint32 radix,
|
t_stat fprint_val (FILE *stream, t_value val, uint32 radix,
|
||||||
|
@ -6134,6 +6136,8 @@ switch (format) {
|
||||||
dbuf[MAX_WIDTH - (digit * 4)] = ',';
|
dbuf[MAX_WIDTH - (digit * 4)] = ',';
|
||||||
d = d - commas;
|
d = d - commas;
|
||||||
if (width > MAX_WIDTH) {
|
if (width > MAX_WIDTH) {
|
||||||
|
if (!stream)
|
||||||
|
return width;
|
||||||
fprintf (stream, "%*s", -((int)width), dbuf);
|
fprintf (stream, "%*s", -((int)width), dbuf);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
@ -6154,6 +6158,8 @@ switch (format) {
|
||||||
d = MAX_WIDTH - (ndigits + commas);
|
d = MAX_WIDTH - (ndigits + commas);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!stream)
|
||||||
|
return strlen(dbuf+d);
|
||||||
if (fputs (&dbuf[d], stream) == EOF)
|
if (fputs (&dbuf[d], stream) == EOF)
|
||||||
return SCPE_IOERR;
|
return SCPE_IOERR;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
|
Loading…
Add table
Reference in a new issue