summaryrefslogtreecommitdiff
path: root/avr/print-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'avr/print-utils.c')
-rw-r--r--avr/print-utils.c49
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;
+}