diff options
-rw-r--r-- | z80_to_x86.c | 6 | ||||
-rw-r--r-- | z80inst.c | 7 | ||||
-rw-r--r-- | z80inst.h | 2 | ||||
-rw-r--r-- | zdis.c | 2 |
4 files changed, 10 insertions, 7 deletions
diff --git a/z80_to_x86.c b/z80_to_x86.c index 98d68b6..a04c2a0 100644 --- a/z80_to_x86.c +++ b/z80_to_x86.c @@ -1622,7 +1622,7 @@ uint8_t * translate_z80inst(z80inst * inst, uint8_t * dst, z80_context * context 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 @@ void * z80_retranslate_inst(uint32_t address, z80_context * context) 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 @@ void translate_z80_stream(z80_context * context, uint32_t address) } 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 { @@ -1371,7 +1371,7 @@ char * z80_conditions[Z80_CC_M+1] = { "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 @@ int z80_disasm(z80inst * decoded, char * dst) 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 { @@ -131,7 +131,7 @@ typedef struct { } 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); @@ -186,7 +186,7 @@ int main(int argc, char ** argv) printf("\t%s\n", disbuf); }*/ } else { - z80_disasm(&instbuf, disbuf); + z80_disasm(&instbuf, disbuf, address); printf("%X: %s\n", address, disbuf); } } |