From 7d51c0144bcc12d49cc6d4d5207e086451b9b6b7 Mon Sep 17 00:00:00 2001 From: Mike Pavone Date: Thu, 9 May 2013 19:24:18 -0700 Subject: Fix terminal instruction detection in disassembler --- z80_to_x86.c | 14 ++++---------- z80inst.c | 7 +++++++ z80inst.h | 1 + zdis.c | 8 +++++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/z80_to_x86.c b/z80_to_x86.c index 390dfdb..98d68b6 100644 --- a/z80_to_x86.c +++ b/z80_to_x86.c @@ -15,7 +15,7 @@ #define SCRATCH2 R14 #define CONTEXT RSI -//#define DO_DEBUG_PRINT +#define DO_DEBUG_PRINT #ifdef DO_DEBUG_PRINT #define dprintf printf @@ -1633,12 +1633,6 @@ uint8_t * translate_z80inst(z80inst * inst, uint8_t * dst, z80_context * context return dst; } -uint8_t z80_is_terminal(z80inst * inst) -{ - return inst->op == Z80_RET || inst->op == Z80_RETI || inst->op == Z80_RETN || inst->op == Z80_JP - || inst->op == Z80_JR || inst->op == Z80_HALT || (inst->op == Z80_NOP && inst->immed == 42); -} - uint8_t * z80_get_native_address(z80_context * context, uint32_t address) { native_map_slot *map; @@ -1649,14 +1643,14 @@ uint8_t * z80_get_native_address(z80_context * context, uint32_t address) address &= 0x7FFF; map = context->banked_code_map + context->bank_reg; } else { - dprintf("z80_get_native_address: %X NULL\n", address); + //dprintf("z80_get_native_address: %X NULL\n", address); return NULL; } if (!map->base || !map->offsets || map->offsets[address] == INVALID_OFFSET || map->offsets[address] == EXTENSION_WORD) { - dprintf("z80_get_native_address: %X NULL\n", address); + //dprintf("z80_get_native_address: %X NULL\n", address); return NULL; } - dprintf("z80_get_native_address: %X %p\n", address, map->base + map->offsets[address]); + //dprintf("z80_get_native_address: %X %p\n", address, map->base + map->offsets[address]); return map->base + map->offsets[address]; } diff --git a/z80inst.c b/z80inst.c index e6d2a33..d5def01 100644 --- a/z80inst.c +++ b/z80inst.c @@ -1531,4 +1531,11 @@ uint8_t z80_word_reg(uint8_t reg) } } +uint8_t z80_is_terminal(z80inst * inst) +{ + return inst->op == Z80_RET || inst->op == Z80_RETI || inst->op == Z80_RETN || inst->op == Z80_JP + || inst->op == Z80_JR || inst->op == Z80_HALT || (inst->op == Z80_NOP && inst->immed == 42); +} + + diff --git a/z80inst.h b/z80inst.h index 609f18c..56fd8bd 100644 --- a/z80inst.h +++ b/z80inst.h @@ -135,6 +135,7 @@ int z80_disasm(z80inst * decoded, char * dst); uint8_t z80_high_reg(uint8_t reg); uint8_t z80_low_reg(uint8_t reg); uint8_t z80_word_reg(uint8_t reg); +uint8_t z80_is_terminal(z80inst * inst); #endif //Z80INST_H_ diff --git a/zdis.c b/zdis.c index f7c7201..1a032e3 100644 --- a/zdis.c +++ b/zdis.c @@ -135,9 +135,6 @@ int main(int argc, char ** argv) //z80_disasm(&instbuf, disbuf); //printf("%X: %s\n", address, disbuf); - if (instbuf.op == Z80_HALT || instbuf.op == Z80_RET || instbuf.op == Z80_RETI || instbuf.op == Z80_RETN || instbuf.op == Z80_RST) { - break; - } switch (instbuf.op) { case Z80_JR: @@ -155,9 +152,14 @@ int main(int argc, char ** argv) case Z80_JPCC: case Z80_CALL: case Z80_CALLCC: + case Z80_RST: reference(instbuf.immed); def = defer(instbuf.immed, def); break; + default: + if (z80_is_terminal(&instbuf)) { + address = filesize + 1; + } } } } -- cgit v1.2.3