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;
|
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
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_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))
|
||||||
|
|
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;
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
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;
|
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue