From f355749eb5ef186dd93563c7f4feae43df812834 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 17 Sep 2014 09:08:12 -0700 Subject: [PATCH] SCP: Provide a way to display an arbitrary buffer contents as hex in debug output --- scp.c | 41 +++++++++++++++++++++++++++++++++++++++++ scp.h | 1 + sim_disk.c | 37 ++++--------------------------------- sim_tape.c | 37 ++----------------------------------- 4 files changed, 48 insertions(+), 68 deletions(-) diff --git a/scp.c b/scp.c index b633ac0a..9f52aa10 100644 --- a/scp.c +++ b/scp.c @@ -8080,6 +8080,47 @@ if (sim_deb && dptr && (dptr->dctrl & dbits)) { 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 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>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 * * Device help can be presented hierarchically by calling diff --git a/scp.h b/scp.h index 4122e957..56cf4d27 100644 --- a/scp.h +++ b/scp.h @@ -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_cancel_step (void); 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, uint32 before, uint32 after, int terminate); #if defined (__DECC) && defined (__VMS) && (defined (__VAX) || (__DECC_VER < 60590001)) diff --git a/sim_disk.c b/sim_disk.c index b0dc7c54..40c1dc14 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -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; -if (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); - if (detail) { - size_t i, same, group, sidx, oidx; - char outbuf[80], strbuf[18]; - static char hex[] = "0123456789ABCDEF"; +if (sim_deb && (ctx->dptr->dctrl & reason)) { + char pos[32]; - for (i=same=0; 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>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); - } - } + sprintf (pos, "lbn: %08X ", lba); + sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), pos, len, txt, reason); } } diff --git a/sim_tape.c b/sim_tape.c index bd866126..090c85ad 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -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; -if (ctx->dptr->dctrl & reason) { - sim_debug (reason, ctx->dptr, "%s%d %s len: %08X\n", ctx->dptr->name, uptr-ctx->dptr->units, txt, len); - if (detail) { - size_t i, same, group, sidx, oidx; - char outbuf[80], strbuf[18]; - static char hex[] = "0123456789ABCDEF"; - - for (i=same=0; 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>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); - } - } - } +if (sim_deb && (ctx->dptr->dctrl & reason)) + sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), "", len, txt, reason); } /* Read record length forward (internal routine)