# HG changeset patch # User Mike Pavone # Date 1368153508 25200 # Node ID 54c0e5f2219845fd94440a60314c3046ec3fcdaf # Parent a13329645ea3fdafbf418ab6300a27d05f89f910 Show absolute addresses for JR, JRCC and DJNZ in Z80 disassembler diff -r a13329645ea3 -r 54c0e5f22198 z80_to_x86.c --- 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 { diff -r a13329645ea3 -r 54c0e5f22198 z80inst.c --- 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 { diff -r a13329645ea3 -r 54c0e5f22198 z80inst.h --- 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); diff -r a13329645ea3 -r 54c0e5f22198 zdis.c --- 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); } }