summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2012-12-28 10:37:09 -0800
committerMike Pavone <pavone@retrodev.com>2012-12-28 10:37:09 -0800
commit761bca4b9e4a3826e81123f113b217fcea34a517 (patch)
tree7f0d8e1a261ffbce48becfb207b4ac4c0f337e3a
parent923af7c3b7caeba2cc319dbec6ef4688849a299a (diff)
Implemented move from SR
-rw-r--r--m68k_to_x86.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index a07bb07..aabf407 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -1443,6 +1443,7 @@ uint8_t * translate_m68k_jsr(uint8_t * dst, m68kinst * inst, x86_68k_options * o
break;
default:
printf("address mode %d not yet supported (jsr)\n", inst->src.addr_mode);
+ exit(1);
}
return dst;
}
@@ -1913,15 +1914,21 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
}
}
break;
- //case M68K_EXT:
- // break;
case M68K_ILLEGAL:
dst = call(dst, (uint8_t *)m68k_save_context);
dst = mov_rr(dst, CONTEXT, RDI, SZ_Q);
dst = call(dst, (uint8_t *)print_regs_exit);
break;
- /*case M68K_MOVE_FROM_SR:
- break;*/
+ case M68K_MOVE_FROM_SR:
+ //TODO: Trap if not in system mode
+ dst = call(dst, (uint8_t *)get_sr);
+ if (dst_op.mode == MODE_REG_DIRECT) {
+ dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_W);
+ } else {
+ dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_W);
+ }
+ dst = m68k_save_result(inst, dst, opts);
+ break;
case M68K_MOVE_CCR:
case M68K_MOVE_SR:
//TODO: Privilege check for MOVE to SR