From 2f89043b35a58afac2d731982cbb499cd4d06f5d Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 20 Mar 2021 21:11:49 +0100 Subject: [DYNAREC] Various bugfixes (and now the 4 tests games works again) --- src/emu/x64run_private.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/emu') diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index b279ca1d..429f766d 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -771,7 +771,7 @@ void UpdateFlags(x64emu_t *emu) CLEAR_FLAG(F_CF); break; case d_adc8: - CONDITIONAL_SET_FLAG(emu->res.u8 & 0x100, F_CF); + CONDITIONAL_SET_FLAG(emu->res.u16 & 0x100, F_CF); CONDITIONAL_SET_FLAG((emu->res.u8 & 0xff) == 0, F_ZF); CONDITIONAL_SET_FLAG(emu->res.u8 & 0x80, F_SF); CONDITIONAL_SET_FLAG(PARITY(emu->res.u8 & 0xff), F_PF); @@ -780,7 +780,7 @@ void UpdateFlags(x64emu_t *emu) CONDITIONAL_SET_FLAG(cc & 0x8, F_AF); break; case d_adc16: - CONDITIONAL_SET_FLAG(emu->res.u16 & 0x10000, F_CF); + CONDITIONAL_SET_FLAG(emu->res.u32 & 0x10000, F_CF); CONDITIONAL_SET_FLAG((emu->res.u16 & 0xffff) == 0, F_ZF); CONDITIONAL_SET_FLAG(emu->res.u16 & 0x8000, F_SF); CONDITIONAL_SET_FLAG(PARITY(emu->res.u16 & 0xff), F_PF); @@ -789,7 +789,7 @@ void UpdateFlags(x64emu_t *emu) CONDITIONAL_SET_FLAG(cc & 0x8, F_AF); break; case d_adc32: - CONDITIONAL_SET_FLAG(emu->res.u32 & 0x100000000L, F_CF); + CONDITIONAL_SET_FLAG(emu->res.u64 & 0x100000000L, F_CF); CONDITIONAL_SET_FLAG((emu->res.u32 & 0xffffffff) == 0, F_ZF); CONDITIONAL_SET_FLAG(emu->res.u32 & 0x80000000, F_SF); CONDITIONAL_SET_FLAG(PARITY(emu->res.u32 & 0xff), F_PF); @@ -797,6 +797,21 @@ void UpdateFlags(x64emu_t *emu) CONDITIONAL_SET_FLAG(XOR2(cc >> 30), F_OF); CONDITIONAL_SET_FLAG(cc & 0x8, F_AF); break; + case d_adc32b: + if(emu->res.u32 == (emu->op1.u32+emu->op2.u32)) { + lo = (emu->op1.u32 & 0xFFFF) + (emu->op2.u32 & 0xFFFF); + } else { + lo = 1 + (emu->op1.u32 & 0xFFFF) + (emu->op2.u32 & 0xFFFF); + } + hi = (lo >> 16) + (emu->op1.u32 >> 16) + (emu->op2.u32 >> 16); + CONDITIONAL_SET_FLAG(hi & 0x10000, F_CF); + CONDITIONAL_SET_FLAG(!emu->res.u32, F_ZF); + CONDITIONAL_SET_FLAG(emu->res.u32 & 0x80000000, F_SF); + CONDITIONAL_SET_FLAG(PARITY(emu->res.u64 & 0xff), F_PF); + cc = (emu->op2.u32 & emu->op1.u32) | ((~emu->res.u32) & (emu->op2.u32 | emu->op1.u32)); + CONDITIONAL_SET_FLAG(XOR2(cc >> 30), F_OF); + CONDITIONAL_SET_FLAG(cc & 0x8, F_AF); + break; case d_adc64: if(emu->res.u64 == (emu->op1.u64+emu->op2.u64)) { lo = (emu->op1.u64 & 0xFFFFFFFF) + (emu->op2.u64 & 0xFFFFFFFF); -- cgit 1.4.1