Address Register indirect With postincrement: When using the stack pointer (A7) with byte size data, the register is incremented by two.
Address Register indirect With predecrement: When using the stack pointer (A7) with byte size data, the register is decremented by two. Signed-off-by: Laurent Vivier <laur...@vivier.eu> --- target/m68k/translate.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index cf5d8dd..c83d902 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -725,7 +725,10 @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContext *s, } reg = get_areg(s, reg0); tmp = tcg_temp_new(); - tcg_gen_subi_i32(tmp, reg, opsize_bytes(opsize)); + tcg_gen_subi_i32(tmp, reg, + reg0 == 7 && opsize == OS_BYTE + ? 2 + : opsize_bytes(opsize)); return tmp; case 5: /* Indirect displacement. */ reg = get_areg(s, reg0); @@ -801,7 +804,10 @@ static TCGv gen_ea_mode(CPUM68KState *env, DisasContext *s, int mode, int reg0, result = gen_ldst(s, opsize, reg, val, what); if (what == EA_STORE || !addrp) { TCGv tmp = tcg_temp_new(); - tcg_gen_addi_i32(tmp, reg, opsize_bytes(opsize)); + tcg_gen_addi_i32(tmp, reg, + reg0 == 7 && opsize == OS_BYTE + ? 2 + : opsize_bytes(opsize)); delay_set_areg(s, reg0, tmp, true); } return result; -- 2.7.4