dcpu16

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 3982443b346c6cf5fba7b34e24a805a05304cb07
parent de77deba6d07d981f1f7b8d45b2fad47eeeb1152
Author: Travis Geiselbrecht <geist@foobox.com>
Date:   Fri,  6 Apr 2012 00:12:38 -0700

assembler: add -O <outputmode> option

available options are
pretty: same as before
hex: one word per line, hex format
binary: raw binary

Diffstat:
Massembler.c | 46+++++++++++++++++++++++++++++++++++++---------
1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/assembler.c b/assembler.c @@ -56,6 +56,12 @@ static int token; static char tstring[128]; static u16 tnumber; +enum outformat { + OUTFORMAT_PRETTY, + OUTFORMAT_HEX, + OUTFORMAT_BINARY, +}; + void die(const char *fmt, ...) { va_list ap; fprintf(stderr,"%s:%d: ", filename, linenumber); @@ -331,7 +337,7 @@ done: fclose(fin); } -void emit(const char *fn) { +void emit(const char *fn, enum outformat format) { FILE *fp; u16 *pc = image; u16 *end = image + PC; @@ -347,12 +353,19 @@ void emit(const char *fn) { if (!fp) die("cannot write file"); while (pc < end) { - if (pc == dis) { - char out[128]; - dis = disassemble(pc, out); - fprintf(fp, "%04x\t%04x:\t%s\n", *pc, (unsigned)(pc-image), out); - } else { + if (format == OUTFORMAT_PRETTY) { + if (pc == dis) { + char out[128]; + dis = disassemble(pc, out); + fprintf(fp, "%04x\t%04x:\t%s\n", *pc, (unsigned)(pc-image), out); + } else { + fprintf(fp, "%04x\n", *pc); + } + } else if (format == OUTFORMAT_HEX) { fprintf(fp, "%04x\n", *pc); + } else if (format == OUTFORMAT_BINARY) { + /* XXX handle host endian */ + fwrite(pc, sizeof(*pc), 1, fp); } pc++; } @@ -362,11 +375,13 @@ void emit(const char *fn) { static void usage(int argc, char **argv) { - fprintf(stderr, "usage: %s [-o output] <input file(s)>\n", argv[0]); + fprintf(stderr, "usage: %s [-o output] [-O output_format] <input file(s)>\n", argv[0]); + fprintf(stderr, "\toutput_format can be one of: pretty, hex, binary\n"); } int main(int argc, char **argv) { const char *outfn = "out.hex"; + enum outformat oformat = OUTFORMAT_PRETTY; for (;;) { int c; @@ -375,10 +390,11 @@ int main(int argc, char **argv) { static struct option long_options[] = { {"help", 0, 0, 'h'}, {"output", 1, 0, 'o'}, + {"outformat", 1, 0, 'O'}, {0, 0, 0, 0}, }; - c = getopt_long(argc, argv, "ho:", long_options, &option_index); + c = getopt_long(argc, argv, "ho:O:", long_options, &option_index); if (c == -1) break; @@ -389,6 +405,18 @@ int main(int argc, char **argv) { case 'o': outfn = optarg; break; + case 'O': + if (!strcasecmp(optarg, "binary")) { + oformat = OUTFORMAT_BINARY; + } else if (!strcasecmp(optarg, "hex")) { + oformat = OUTFORMAT_HEX; + } else if (!strcasecmp(optarg, "pretty")) { + oformat = OUTFORMAT_PRETTY; + } else { + usage(argc, argv); + return 1; + } + break; default: usage(argc, argv); return 1; @@ -412,7 +440,7 @@ int main(int argc, char **argv) { if (PC != 0) { linebuffer[0] = 0; resolve_fixups(); - emit(outfn); + emit(outfn, oformat); } return 0; }