SCP: Provide a way to display an arbitrary buffer contents as hex in debug output
This commit is contained in:
parent
defe5f07d9
commit
f355749eb5
4 changed files with 48 additions and 68 deletions
41
scp.c
41
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<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
|
||||
*
|
||||
* Device help can be presented hierarchically by calling
|
||||
|
|
1
scp.h
1
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))
|
||||
|
|
37
sim_disk.c
37
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<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);
|
||||
}
|
||||
}
|
||||
sprintf (pos, "lbn: %08X ", lba);
|
||||
sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), pos, len, txt, reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
37
sim_tape.c
37
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<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);
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
|
|
Loading…
Add table
Reference in a new issue