blob: 2bd132873b75f9b528e73f337a988e1b2eb6ec3a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include "common.h"
#include <stdio.h>
#include <ctype.h>
#include "con-utils.h"
#include "print-utils.h"
void print_blanks(uint_fast8_t count)
{
while(count--)
putchar(' ');
}
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;
}
|