diff miscprog/ftmdump.c @ 221:9f2e0c34fe33

ftmdump (C1xx factory data reverse eng) tool written
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 17 Nov 2017 19:58:07 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/miscprog/ftmdump.c	Fri Nov 17 19:58:07 2017 +0000
@@ -0,0 +1,76 @@
+/*
+ * This program parses the record structure in Compal's FTM sector (or at least
+ * that's what I *think* it is called) and dumps each record in hex for further
+ * human analysis.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+
+char *infname;
+FILE *inf;
+u_char header[8];
+u_char endmarker[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+unsigned hdr_words[4];
+
+main(argc, argv)
+	char **argv;
+{
+	if (argc < 2 || argc > 3) {
+		fprintf(stderr, "usage: %s binfile [offset]\n", argv[0]);
+		exit(1);
+	}
+	infname = argv[1];
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(1);
+	}
+	if (argc == 3)
+		fseek(inf, strtoul(argv[2], 0, 0), SEEK_SET);
+	for (;;) {
+		fread(header, 1, 8, inf);
+		if (!bcmp(header, endmarker, 8))
+			break;
+		process_record();
+	}
+	exit(0);
+}
+
+process_record()
+{
+	u_char readbuf[16];
+	int pos, chunk, i, c;
+
+	for (i = 0; i < 4; i++)
+		hdr_words[i] = header[i*2] | (header[i*2+1] << 8);
+	printf("%04X %04X %04X %04X:\n\n", hdr_words[0], hdr_words[1],
+		hdr_words[2], hdr_words[3]);
+	for (pos = 0; pos < hdr_words[3]; pos += chunk) {
+		chunk = hdr_words[3] - pos;
+		if (chunk > 16)
+			chunk = 16;
+		fread(readbuf, 1, chunk, inf);
+		printf("%04X:", pos);
+		for (i = 0; i < 16; i++) {
+			if (i == 0 || i == 8)
+				putchar(' ');
+			if (i < chunk)
+				printf(" %02X", readbuf[i]);
+			else
+				fputs("   ", stdout);
+		}
+		fputs("  ", stdout);
+		for (i = 0; i < chunk; i++) {
+			c = readbuf[i];
+			if (c < ' ' || c > '~')
+				c = '.';
+			putchar(c);
+		}
+		putchar('\n');
+	}
+	putchar('\n');
+}