summaryrefslogtreecommitdiff
path: root/m68k_to_x86.c
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-04-20 17:41:07 -0700
committerMike Pavone <pavone@retrodev.com>2013-04-20 17:41:07 -0700
commit4b15ae46b9597ca32b75748630839e362daed9ed (patch)
treef29595a0617e7f4bc009e8d67aca8c39e0f37408 /m68k_to_x86.c
parent9a46382752dfa7330252301f890fd0a8ae5b3614 (diff)
Fix muls with a negative immediate source.
Diffstat (limited to 'm68k_to_x86.c')
-rw-r--r--m68k_to_x86.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index c4360c7..e0da24f 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -3303,8 +3303,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
case M68K_MULU:
dst = cycles(dst, 70); //TODO: Calculate the actual value based on the value of the <ea> parameter
if (src_op.mode == MODE_IMMED) {
- //immediate value should already be sign extended to 32-bits
- dst = mov_ir(dst, inst->op == M68K_MULU ? (src_op.disp & 0xFFFF) : src_op.disp, SCRATCH1, SZ_D);
+ dst = mov_ir(dst, inst->op == M68K_MULU ? (src_op.disp & 0xFFFF) : ((src_op.disp & 0x8000) ? src_op.disp | 0xFFFF0000 : src_op.disp), SCRATCH1, SZ_D);
} else if (src_op.mode == MODE_REG_DIRECT) {
if (inst->op == M68K_MULS) {
dst = movsx_rr(dst, src_op.base, SCRATCH1, SZ_W, SZ_D);