# HG changeset patch # User Michael Pavone # Date 1438141633 25200 # Node ID e95978c0988c862c5bdf9645d657f1e41a360472 # Parent 7ed55a361e796fd06f311c0ce01a93eda28c1c18 Added a -s paramter for specifying a start offset in the Z80 disassembler diff -r 7ed55a361e79 -r e95978c0988c zdis.c --- a/zdis.c Mon Jul 27 23:49:14 2015 -0700 +++ b/zdis.c Tue Jul 28 20:47:13 2015 -0700 @@ -77,6 +77,7 @@ fread(filebuf, 1, filesize, f); fclose(f); deferred *def = NULL, *tmpd; + uint16_t offset = 0; for(uint8_t opt = 2; opt < argc; ++opt) { if (argv[opt][0] == '-') { FILE * address_log; @@ -111,6 +112,15 @@ } } } + break; + case 's': + opt++; + if (opt >= argc) { + fputs("-s must be followed by a start offset in hex\n", stderr); + exit(1); + } + offset = strtol(argv[opt], NULL, 16); + break; } } else { uint16_t address = strtol(argv[opt], NULL, 16); @@ -118,7 +128,7 @@ reference(address); } } - uint16_t start = 0; + uint16_t start = offset; uint8_t *encoded, *next; uint32_t size; if (!def || !only) { @@ -130,7 +140,7 @@ encoded = NULL; address = def->address; if (!is_visited(address)) { - encoded = filebuf + address; + encoded = filebuf + address - offset; } tmpd = def; def = def->next; @@ -140,7 +150,7 @@ break; } for(;;) { - if (address > filesize || is_visited(address)) { + if ((address - offset) > filesize || is_visited(address) || address < offset) { break; } visit(address); @@ -154,7 +164,7 @@ { case Z80_JR: address += instbuf.immed; - encoded = filebuf + address; + encoded = filebuf + address - offset; break; case Z80_JRCC: reference(address + instbuf.immed); @@ -162,7 +172,7 @@ break; case Z80_JP: address = instbuf.immed; - encoded = filebuf + address; + encoded = filebuf + address - offset; break; case Z80_JPCC: case Z80_CALL: @@ -186,9 +196,9 @@ } puts(""); } - for (address = 0; address < filesize; address++) { + for (address = offset; address < filesize; address++) { if (is_visited(address)) { - encoded = filebuf + address; + encoded = filebuf + address - offset; z80_decode(encoded, &instbuf); if (labels) { /*m68k_disasm_labels(&instbuf, disbuf);