diff options
Diffstat (limited to 'avr/print-utils.c')
-rw-r--r-- | avr/print-utils.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/avr/print-utils.c b/avr/print-utils.c index b814d97..2bd1328 100644 --- a/avr/print-utils.c +++ b/avr/print-utils.c @@ -1,4 +1,7 @@ +#include "common.h" #include <stdio.h> +#include <ctype.h> +#include "con-utils.h" #include "print-utils.h" void print_blanks(uint_fast8_t count) @@ -8,3 +11,49 @@ void print_blanks(uint_fast8_t count) } +int dump_mem(uint32_t startaddr, uint32_t len, + void (*readfkt)(uint8_t *, uint32_t, uint8_t), char *title) +{ + uint8_t buf[16]; + char *indent = NULL; + uint8_t llen = 16; + uint8_t pre = startaddr % 16; + uint32_t addr = startaddr & ~0x0f; + len += pre; + uint8_t i; + + if (title && *title) { + printf_P(PSTR("%s\n"),title); + indent = " "; + } + + while (len) { + if (len < 16) + llen = len; + readfkt(buf, addr + pre, llen - pre); + + printf_P(PSTR("%s%.5lx:"),indent, addr); + for (i = 0; i < llen; i++) { + if ((i % 8) == 0) + putchar(' '); + if (i < pre) + printf_P(PSTR(".. ")); + else + printf_P(PSTR("%.2x "), buf[i-pre]); + } + /* fill line with whitespace for nice ASCII print */ + print_blanks(3 * (16u - i) + (16u-i)/8 + 1 + pre); + /* Print data in ASCII characters */ + for (i = pre; i < llen; i++) + printf_P(PSTR("%c"), isprint(buf[i-pre]) ? buf[i-pre] : '.'); + putchar('\n'); + + pre = 0; + addr += 16; + len -= llen; + + if (ctrlc()) + return -1; + } + return 0; +} |