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:
Timothe Litt 2013-07-05 00:23:33 -04:00
parent 1bfc2bc57e
commit 4497bba48f
2 changed files with 91 additions and 3 deletions

View file

@ -298,9 +298,77 @@ t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, void *desc)
uint32 i, j;
DEVICE *dptr;
DIB *dibp;
uint32 maxaddr, maxname;
int32 maxvec, vecwid;
char valbuf[40];
if (build_dib_tab ()) /* build IO page */
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 */
if (iodibp[i] && (iodibp[i] != dibp)) { /* new 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);
fprintf (st, " - ");
fprint_val (st, (t_value) dibp->ba + dibp->lnt - 1, DEV_RDX, 32, PV_LEFT);
fprintf (st, "%c\t%s\n", /* print block entry */
(dibp->ba < IOPAGEBASE + AUTO_CSRBASE + AUTO_CSRMAX)? '*': ' ',
dptr? sim_dname (dptr): "CPU");
fprintf (st, "%c ", /* print block entry */
(dibp->ba < IOPAGEBASE + AUTO_CSRBASE + AUTO_CSRMAX)? '*': ' ');
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 for i */
return SCPE_OK;

6
scp.c
View file

@ -6098,6 +6098,8 @@ return val;
format = leading zeroes format
Outputs:
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,
@ -6134,6 +6136,8 @@ switch (format) {
dbuf[MAX_WIDTH - (digit * 4)] = ',';
d = d - commas;
if (width > MAX_WIDTH) {
if (!stream)
return width;
fprintf (stream, "%*s", -((int)width), dbuf);
return SCPE_OK;
}
@ -6154,6 +6158,8 @@ switch (format) {
d = MAX_WIDTH - (ndigits + commas);
break;
}
if (!stream)
return strlen(dbuf+d);
if (fputs (&dbuf[d], stream) == EOF)
return SCPE_IOERR;
return SCPE_OK;