SCP: Add EBCDIC and RADIX-50 data to debug output of block data.
Tape and Disk contents may exist in various formats. The -D and -E debug switches add RADIX-50 and EBCDIC output respectively.
This commit is contained in:
parent
aa5bc9e867
commit
ff0f9a7198
1 changed files with 75 additions and 6 deletions
81
scp.c
81
scp.c
|
@ -1030,6 +1030,12 @@ static const char simh_help[] =
|
||||||
"5-N\n"
|
"5-N\n"
|
||||||
" The -N switch causes a new/empty file to be written to. The default\n"
|
" The -N switch causes a new/empty file to be written to. The default\n"
|
||||||
" is to append to an existing debug log file.\n"
|
" is to append to an existing debug log file.\n"
|
||||||
|
"5-D\n"
|
||||||
|
" The -D switch causes data blob output to also display the data as\n"
|
||||||
|
" RADIX-50 characters.\n"
|
||||||
|
"5-E\n"
|
||||||
|
" The -E switch causes data blob output to also display the data as\n"
|
||||||
|
" EBCDIC characters.\n"
|
||||||
#define HLP_SET_BREAK "*Commands SET Breakpoints"
|
#define HLP_SET_BREAK "*Commands SET Breakpoints"
|
||||||
"3Breakpoints\n"
|
"3Breakpoints\n"
|
||||||
"+set break <list> set breakpoints\n"
|
"+set break <list> set breakpoints\n"
|
||||||
|
@ -9948,9 +9954,44 @@ void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *pos
|
||||||
if (sim_deb && (dptr->dctrl & reason)) {
|
if (sim_deb && (dptr->dctrl & reason)) {
|
||||||
sim_debug (reason, dptr, "%s %s %slen: %08X\n", sim_uname(uptr), txt, position, (unsigned int)len);
|
sim_debug (reason, dptr, "%s %s %slen: %08X\n", sim_uname(uptr), txt, position, (unsigned int)len);
|
||||||
if (data && len) {
|
if (data && len) {
|
||||||
unsigned int i, same, group, sidx, oidx;
|
unsigned int i, same, group, sidx, oidx, ridx, eidx, soff;
|
||||||
char outbuf[80], strbuf[18];
|
char outbuf[80], strbuf[28], rad50buf[36], ebcdicbuf[32];
|
||||||
static char hex[] = "0123456789ABCDEF";
|
static char hex[] = "0123456789ABCDEF";
|
||||||
|
static char rad50[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$._0123456789";
|
||||||
|
static char ebcdic2ascii[] = {
|
||||||
|
0000,0001,0002,0003,0234,0011,0206,0177,
|
||||||
|
0227,0215,0216,0013,0014,0015,0016,0017,
|
||||||
|
0020,0021,0022,0023,0235,0205,0010,0207,
|
||||||
|
0030,0031,0222,0217,0034,0035,0036,0037,
|
||||||
|
0200,0201,0202,0203,0204,0012,0027,0033,
|
||||||
|
0210,0211,0212,0213,0214,0005,0006,0007,
|
||||||
|
0220,0221,0026,0223,0224,0225,0226,0004,
|
||||||
|
0230,0231,0232,0233,0024,0025,0236,0032,
|
||||||
|
0040,0240,0241,0242,0243,0244,0245,0246,
|
||||||
|
0247,0250,0133,0056,0074,0050,0053,0041,
|
||||||
|
0046,0251,0252,0253,0254,0255,0256,0257,
|
||||||
|
0260,0261,0135,0044,0052,0051,0073,0136,
|
||||||
|
0055,0057,0262,0263,0264,0265,0266,0267,
|
||||||
|
0270,0271,0174,0054,0045,0137,0076,0077,
|
||||||
|
0272,0273,0274,0275,0276,0277,0300,0301,
|
||||||
|
0302,0140,0072,0043,0100,0047,0075,0042,
|
||||||
|
0303,0141,0142,0143,0144,0145,0146,0147,
|
||||||
|
0150,0151,0304,0305,0306,0307,0310,0311,
|
||||||
|
0312,0152,0153,0154,0155,0156,0157,0160,
|
||||||
|
0161,0162,0313,0314,0315,0316,0317,0320,
|
||||||
|
0321,0176,0163,0164,0165,0166,0167,0170,
|
||||||
|
0171,0172,0322,0323,0324,0325,0326,0327,
|
||||||
|
0330,0331,0332,0333,0334,0335,0336,0337,
|
||||||
|
0340,0341,0342,0343,0344,0345,0346,0347,
|
||||||
|
0173,0101,0102,0103,0104,0105,0106,0107,
|
||||||
|
0110,0111,0350,0351,0352,0353,0354,0355,
|
||||||
|
0175,0112,0113,0114,0115,0116,0117,0120,
|
||||||
|
0121,0122,0356,0357,0360,0361,0362,0363,
|
||||||
|
0134,0237,0123,0124,0125,0126,0127,0130,
|
||||||
|
0131,0132,0364,0365,0366,0367,0370,0371,
|
||||||
|
0060,0061,0062,0063,0064,0065,0066,0067,
|
||||||
|
0070,0071,0372,0373,0374,0375,0376,0377,
|
||||||
|
};
|
||||||
|
|
||||||
for (i=same=0; i<len; i += 16) {
|
for (i=same=0; i<len; i += 16) {
|
||||||
if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) {
|
if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) {
|
||||||
|
@ -9962,18 +10003,46 @@ if (sim_deb && (dptr->dctrl & reason)) {
|
||||||
same = 0;
|
same = 0;
|
||||||
}
|
}
|
||||||
group = (((len - i) > 16) ? 16 : (len - i));
|
group = (((len - i) > 16) ? 16 : (len - i));
|
||||||
|
strcpy (ebcdicbuf, (sim_deb_switches & SWMASK ('E')) ? " EBCDIC:" : "");
|
||||||
|
eidx = strlen(ebcdicbuf);
|
||||||
|
strcpy (rad50buf, (sim_deb_switches & SWMASK ('D')) ? " RAD50:" : "");
|
||||||
|
ridx = strlen(rad50buf);
|
||||||
|
strcpy (strbuf, (sim_deb_switches & (SWMASK ('E') | SWMASK ('D'))) ? "ASCII:" : "");
|
||||||
|
soff = strlen(strbuf);
|
||||||
for (sidx=oidx=0; sidx<group; ++sidx) {
|
for (sidx=oidx=0; sidx<group; ++sidx) {
|
||||||
outbuf[oidx++] = ' ';
|
outbuf[oidx++] = ' ';
|
||||||
outbuf[oidx++] = hex[(data[i+sidx]>>4)&0xf];
|
outbuf[oidx++] = hex[(data[i+sidx]>>4)&0xf];
|
||||||
outbuf[oidx++] = hex[data[i+sidx]&0xf];
|
outbuf[oidx++] = hex[data[i+sidx]&0xf];
|
||||||
if (sim_isprint (data[i+sidx]))
|
if (sim_isprint (data[i+sidx]))
|
||||||
strbuf[sidx] = data[i+sidx];
|
strbuf[soff+sidx] = data[i+sidx];
|
||||||
else
|
else
|
||||||
strbuf[sidx] = '.';
|
strbuf[soff+sidx] = '.';
|
||||||
|
if (ridx && ((sidx&1) == 0)) {
|
||||||
|
uint16 word = data[i+sidx] + (((uint16)data[i+sidx+1]) << 8);
|
||||||
|
|
||||||
|
if (word >= 64000) {
|
||||||
|
rad50buf[ridx++] = '|'; /* Invalid RAD-50 character */
|
||||||
|
rad50buf[ridx++] = '|'; /* Invalid RAD-50 character */
|
||||||
|
rad50buf[ridx++] = '|'; /* Invalid RAD-50 character */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rad50buf[ridx++] = rad50[word/1600];
|
||||||
|
rad50buf[ridx++] = rad50[(word/40)%40];
|
||||||
|
rad50buf[ridx++] = rad50[word%40];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eidx) {
|
||||||
|
if (sim_isprint (ebcdic2ascii[data[i+sidx]]))
|
||||||
|
ebcdicbuf[eidx++] = ebcdic2ascii[data[i+sidx]];
|
||||||
|
else
|
||||||
|
ebcdicbuf[eidx++] = '.';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
outbuf[oidx] = '\0';
|
outbuf[oidx] = '\0';
|
||||||
strbuf[sidx] = '\0';
|
strbuf[soff+sidx] = '\0';
|
||||||
sim_debug (reason, dptr, "%04X%-48s %s\n", i, outbuf, strbuf);
|
ebcdicbuf[eidx] = '\0';
|
||||||
|
rad50buf[ridx] = '\0';
|
||||||
|
sim_debug (reason, dptr, "%04X%-48s %s%s%s\n", i, outbuf, strbuf, ebcdicbuf, rad50buf);
|
||||||
}
|
}
|
||||||
if (same > 0) {
|
if (same > 0) {
|
||||||
sim_debug (reason, dptr, "%04X thru %04X same as above\n", i-(16*same), (unsigned int)(len-1));
|
sim_debug (reason, dptr, "%04X thru %04X same as above\n", i-(16*same), (unsigned int)(len-1));
|
||||||
|
|
Loading…
Add table
Reference in a new issue