summaryrefslogtreecommitdiff
path: root/avr/print-utils.c
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;
}