summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--z80_to_x86.c6
-rw-r--r--z80inst.c7
-rw-r--r--z80inst.h2
-rw-r--r--zdis.c2
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 {
diff --git a/z80inst.c b/z80inst.c
index d5def01..3643f43 100644
--- a/z80inst.c
+++ b/z80inst.c
@@ -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 {
diff --git a/z80inst.h b/z80inst.h
index 56fd8bd..985a561 100644
--- a/z80inst.h
+++ b/z80inst.h
@@ -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);
diff --git a/zdis.c b/zdis.c
index 1a032e3..00a8886 100644
--- a/zdis.c
+++ b/zdis.c
@@ -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);
}
}