changeset 314:54c0e5f22198

Show absolute addresses for JR, JRCC and DJNZ in Z80 disassembler
author Mike Pavone <pavone@retrodev.com>
date Thu, 09 May 2013 19:38:28 -0700
parents a13329645ea3
children 684e71e9f0d0
files z80_to_x86.c z80inst.c z80inst.h zdis.c
diffstat 4 files changed, 10 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/z80_to_x86.c	Thu May 09 19:24:18 2013 -0700
+++ b/z80_to_x86.c	Thu May 09 19:38:28 2013 -0700
@@ -1622,7 +1622,7 @@
 	case Z80_OTDR:*/
 	default: {
 		char disbuf[80];
-		z80_disasm(inst, disbuf);
+		z80_disasm(inst, disbuf, address);
 		fprintf(stderr, "unimplemented instruction: %s\n", disbuf);
 		FILE * f = fopen("zram.bin", "wb");
 		fwrite(context->mem_pointers[0], 1, 8 * 1024, f);
@@ -1773,7 +1773,7 @@
 	dprintf("Retranslating code at Z80 address %X, native address %p\n", address, orig_start);
 	after = z80_decode(inst, &instbuf);
 	#ifdef DO_DEBUG_PRINT
-	z80_disasm(&instbuf, disbuf);
+	z80_disasm(&instbuf, disbuf, address);
 	if (instbuf.op == Z80_NOP) {
 		printf("%X\t%s(%d)\n", address, disbuf, instbuf.immed);
 	} else {
@@ -1863,7 +1863,7 @@
 			}
 			next = z80_decode(encoded, &inst);
 			#ifdef DO_DEBUG_PRINT
-			z80_disasm(&inst, disbuf);
+			z80_disasm(&inst, disbuf, address);
 			if (inst.op == Z80_NOP) {
 				printf("%X\t%s(%d)\n", address, disbuf, inst.immed);
 			} else {
--- a/z80inst.c	Thu May 09 19:24:18 2013 -0700
+++ b/z80inst.c	Thu May 09 19:38:28 2013 -0700
@@ -1371,7 +1371,7 @@
 	"m"
 };
 
-int z80_disasm(z80inst * decoded, char * dst)
+int z80_disasm(z80inst * decoded, char * dst, uint16_t address)
 {
 	int len = sprintf(dst, "%s", z80_mnemonics[decoded->op]);
 	uint8_t needcomma;
@@ -1438,7 +1438,10 @@
 			len += sprintf(dst+len,  "%s (%s)", needcomma ? "," : "" , z80_regs[decoded->ea_reg]);
 			break;
 		case Z80_IMMED:
-			if (decoded->immed >= 63 || decoded->op == Z80_JP || decoded->op == Z80_JPCC || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_RST)
+			if (decoded->op == Z80_JR || decoded->op == Z80_JRCC || decoded->op == Z80_DJNZ) {
+					address += 2 + decoded->immed;
+					len += sprintf(dst+len, "%s %X", needcomma ? "," : "" , address);
+			} else if (decoded->immed >= 63 || decoded->op == Z80_JP || decoded->op == Z80_JPCC || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_RST)
 			{
 				len += sprintf(dst+len, "%s $%X", needcomma ? "," : "" , decoded->immed);
 			} else {
--- a/z80inst.h	Thu May 09 19:24:18 2013 -0700
+++ b/z80inst.h	Thu May 09 19:38:28 2013 -0700
@@ -131,7 +131,7 @@
 } z80inst;
 
 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded);
-int z80_disasm(z80inst * decoded, char * dst);
+int z80_disasm(z80inst * decoded, char * dst, uint16_t address);
 uint8_t z80_high_reg(uint8_t reg);
 uint8_t z80_low_reg(uint8_t reg);
 uint8_t z80_word_reg(uint8_t reg);
--- a/zdis.c	Thu May 09 19:24:18 2013 -0700
+++ b/zdis.c	Thu May 09 19:38:28 2013 -0700
@@ -186,7 +186,7 @@
 					printf("\t%s\n", disbuf);
 				}*/
 			} else {
-				z80_disasm(&instbuf, disbuf);
+				z80_disasm(&instbuf, disbuf, address);
 				printf("%X: %s\n", address, disbuf);
 			}
 		}