changeset 817:e95978c0988c

Added a -s paramter for specifying a start offset in the Z80 disassembler
author Michael Pavone <pavone@retrodev.com>
date Tue, 28 Jul 2015 20:47:13 -0700
parents 7ed55a361e79
children a634ed0a92cf
files zdis.c
diffstat 1 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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);