SCP: Provide a way to display an arbitrary buffer contents as hex in debug output

This commit is contained in:
Mark Pizzolato 2014-09-17 09:08:12 -07:00
parent defe5f07d9
commit f355749eb5
4 changed files with 48 additions and 68 deletions

41
scp.c
View file

@ -8080,6 +8080,47 @@ if (sim_deb && dptr && (dptr->dctrl & dbits)) {
return; return;
} }
void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *position, size_t len, const char *txt, uint32 reason)
{
if (sim_deb && (dptr->dctrl & reason)) {
sim_debug (reason, dptr, "%s %s %slen: %08X\n", sim_uname(uptr), txt, position, len);
if (data && len) {
size_t i, same, group, sidx, oidx;
char outbuf[80], strbuf[18];
static char hex[] = "0123456789ABCDEF";
for (i=same=0; i<len; i += 16) {
if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) {
++same;
continue;
}
if (same > 0) {
sim_debug (reason, dptr, "%04X thru %04X same as above\n", i-(16*same), i-1);
same = 0;
}
group = (((len - i) > 16) ? 16 : (len - i));
for (sidx=oidx=0; sidx<group; ++sidx) {
outbuf[oidx++] = ' ';
outbuf[oidx++] = hex[(data[i+sidx]>>4)&0xf];
outbuf[oidx++] = hex[data[i+sidx]&0xf];
if (isprint (data[i+sidx]))
strbuf[sidx] = data[i+sidx];
else
strbuf[sidx] = '.';
}
outbuf[oidx] = '\0';
strbuf[sidx] = '\0';
sim_debug (reason, dptr, "%04X%-48s %s\n", i, outbuf, strbuf);
}
if (same > 0) {
sim_debug (reason, dptr, "%04X thru %04X same as above\n", i-(16*same), len-1);
}
}
}
}
/* Hierarchical help presentation /* Hierarchical help presentation
* *
* Device help can be presented hierarchically by calling * Device help can be presented hierarchically by calling

1
scp.h
View file

@ -146,6 +146,7 @@ const char *sim_error_text (t_stat stat);
t_stat sim_string_to_stat (char *cptr, t_stat *cond); t_stat sim_string_to_stat (char *cptr, t_stat *cond);
t_stat sim_cancel_step (void); t_stat sim_cancel_step (void);
void sim_printf (const char* fmt, ...); void sim_printf (const char* fmt, ...);
void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *position, size_t len, const char *txt, uint32 reason);
void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs, void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs,
uint32 before, uint32 after, int terminate); uint32 before, uint32 after, int terminate);
#if defined (__DECC) && defined (__VMS) && (defined (__VAX) || (__DECC_VER < 60590001)) #if defined (__DECC) && defined (__VMS) && (defined (__VAX) || (__DECC_VER < 60590001))

View file

@ -1455,40 +1455,11 @@ void sim_disk_data_trace(UNIT *uptr, const uint8 *data, size_t lba, size_t len,
{ {
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
if (ctx->dptr->dctrl & reason) { if (sim_deb && (ctx->dptr->dctrl & reason)) {
sim_debug (reason, ctx->dptr, "%s%d %s lbn: %08X len: %08X\n", ctx->dptr->name, (int)(uptr-ctx->dptr->units), txt, lba, len); char pos[32];
if (detail) {
size_t i, same, group, sidx, oidx;
char outbuf[80], strbuf[18];
static char hex[] = "0123456789ABCDEF";
for (i=same=0; i<len; i += 16) { sprintf (pos, "lbn: %08X ", lba);
if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) { sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), pos, len, txt, reason);
++same;
continue;
}
if (same > 0) {
sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), i-1);
same = 0;
}
group = (((len - i) > 16) ? 16 : (len - i));
for (sidx=oidx=0; sidx<group; ++sidx) {
outbuf[oidx++] = ' ';
outbuf[oidx++] = hex[(data[i+sidx]>>4)&0xf];
outbuf[oidx++] = hex[data[i+sidx]&0xf];
if (isprint (data[i+sidx]))
strbuf[sidx] = data[i+sidx];
else
strbuf[sidx] = '.';
}
outbuf[oidx] = '\0';
strbuf[sidx] = '\0';
sim_debug (reason, ctx->dptr, "%04X%-48s %s\n", i, outbuf, strbuf);
}
if (same > 0) {
sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1);
}
}
} }
} }

View file

@ -549,41 +549,8 @@ void sim_tape_data_trace(UNIT *uptr, const uint8 *data, size_t len, const char*
{ {
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
if (ctx->dptr->dctrl & reason) { if (sim_deb && (ctx->dptr->dctrl & reason))
sim_debug (reason, ctx->dptr, "%s%d %s len: %08X\n", ctx->dptr->name, uptr-ctx->dptr->units, txt, len); sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), "", len, txt, reason);
if (detail) {
size_t i, same, group, sidx, oidx;
char outbuf[80], strbuf[18];
static char hex[] = "0123456789ABCDEF";
for (i=same=0; i<len; i += 16) {
if ((i > 0) && (0 == memcmp (&data[i], &data[i-16], 16))) {
++same;
continue;
}
if (same > 0) {
sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), i-1);
same = 0;
}
group = (((len - i) > 16) ? 16 : (len - i));
for (sidx=oidx=0; sidx<group; ++sidx) {
outbuf[oidx++] = ' ';
outbuf[oidx++] = hex[(data[i+sidx]>>4)&0xf];
outbuf[oidx++] = hex[data[i+sidx]&0xf];
if (isprint (data[i+sidx]))
strbuf[sidx] = data[i+sidx];
else
strbuf[sidx] = '.';
}
outbuf[oidx] = '\0';
strbuf[sidx] = '\0';
sim_debug (reason, ctx->dptr, "%04X%-48s %s\n", i, outbuf, strbuf);
}
if (same > 0) {
sim_debug (reason, ctx->dptr, "%04X thru %04X same as above\n", i-(16*same), len-1);
}
}
}
} }
/* Read record length forward (internal routine) /* Read record length forward (internal routine)