summaryrefslogtreecommitdiff
path: root/m68k_core.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2016-04-27 21:39:17 -0700
committerMichael Pavone <pavone@retrodev.com>2016-04-27 21:39:17 -0700
commit77a5b1309cb7a510cf4ec659ee8aa34d605f92b1 (patch)
tree5c5b300cb4df637012a4d70a27c16b9ae6b51a0a /m68k_core.c
parentf09de63e08bbd4ed2733bb0af9b666e770ead9b3 (diff)
Implemented IR and undefined bits of info word for address error exception frames
Diffstat (limited to 'm68k_core.c')
-rw-r--r--m68k_core.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/m68k_core.c b/m68k_core.c
index f2817cf..69cd94d 100644
--- a/m68k_core.c
+++ b/m68k_core.c
@@ -702,6 +702,17 @@ void m68k_handle_deferred(m68k_context * context)
}
}
+uint16_t m68k_get_ir(m68k_context *context)
+{
+ uint32_t inst_addr = get_instruction_start(context->options, context->native_code_map, context->last_prefetch_address-2);
+ uint16_t *native_addr = get_native_pointer(inst_addr, (void **)context->mem_pointers, &context->options->gen);
+ if (native_addr) {
+ return *native_addr;
+ }
+ fprintf(stderr, "M68K: Failed to calculate value of IR. Last prefetch address: %X\n", context->last_prefetch_address);
+ return 0xFFFF;
+}
+
typedef enum {
RAW_FUNC = 1,
BINARY_ARITH,
@@ -826,6 +837,7 @@ void translate_m68k(m68k_options * opts, m68kinst * inst)
if (
(inst->src.addr_mode > MODE_AREG && inst->src.addr_mode < MODE_IMMEDIATE)
|| (inst->dst.addr_mode > MODE_AREG && inst->dst.addr_mode < MODE_IMMEDIATE)
+ || (inst->op == M68K_BCC && (inst->src.params.immed & 1))
) {
//Not accurate for all cases, but probably good enough for now
m68k_set_last_prefetch(opts, inst->address + inst->bytes);