FreeCalypso > hg > freecalypso-reveng
diff dspanal/char2coff.c @ 308:f8344bc4fd61
dspanal: char2coff utility written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 28 Oct 2019 05:20:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dspanal/char2coff.c Mon Oct 28 05:20:50 2019 +0000 @@ -0,0 +1,93 @@ +/* + * This program will convert C char array files into COFF + * for disassembly analysis. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include "coffout.h" + +extern unsigned read_char_file(); + +static u_char binbuffer[300000]; +static unsigned array_size; +static u_char *array_ptr, *array_end; + +#define MAX_SECTIONS 256 + +static struct coff_section sections[MAX_SECTIONS]; +static unsigned nsections; + +static void +add_section(addr, size, data) + uint32_t addr, size; + u_char *data; +{ + struct coff_section *sec; + + if (nsections >= MAX_SECTIONS) { + fprintf(stderr, "error: too many sections\n"); + exit(1); + } + sec = sections + nsections; + sec->addr = addr; + sec->size = size; + sec->data = data; + sec->flags = 0x0020; + sec->mempage = 0x00; + nsections++; +} + +static uint32_t +get_longword() +{ + uint32_t datum; + + if (array_ptr + 4 > array_end) { + fprintf(stderr, "error: parse spills past end of array\n"); + exit(1); + } + datum = (array_ptr[3] << 24) | (array_ptr[2] << 16) | + (array_ptr[1] << 8) | array_ptr[0]; + array_ptr += 4; + return datum; +} + +main(argc, argv) + char **argv; +{ + uint32_t addr, size; + + if (argc != 3) { + fprintf(stderr, "usage: %s char-array-file coff-output-file\n", + argv[0]); + exit(1); + } + array_size = read_char_file(argv[1], binbuffer, sizeof binbuffer); + array_ptr = binbuffer; + array_end = array_ptr + array_size; + if (get_longword() != 0) { + fprintf(stderr, "error: initial tag 0 is missing\n"); + exit(1); + } + if (get_longword() != 3) { + fprintf(stderr, "error: initial vers 3 is missing\n"); + exit(1); + } + for (;;) { + size = get_longword(); + if (size > 0x10000) { + fprintf(stderr, "error: section size unreasonable\n"); + exit(1); + } + addr = get_longword(); + if (!size) + break; + add_section(addr, size, array_ptr); + array_ptr += size << 1; + } + emit_coff_output(argv[2], sections, nsections); + exit(0); +}