From 1e6024bd0576607d35f438b5d78ad3e57026b07b Mon Sep 17 00:00:00 2001 From: "R. Belmont" Date: Fri, 10 Aug 2012 03:49:24 +0000 Subject: [PATCH] drcbec: compute flags correctly for ADDC/SUBB [R. Belmont] --- src/emu/cpu/drcbec.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/emu/cpu/drcbec.c b/src/emu/cpu/drcbec.c index 491175a9145..36e4e509511 100644 --- a/src/emu/cpu/drcbec.c +++ b/src/emu/cpu/drcbec.c @@ -938,7 +938,15 @@ int drcbe_c::execute(code_handle &entry) if (PARAM2 + 1 != 0) flags = FLAGS32_NZCV_ADD(temp32, PARAM1, PARAM2 + (flags & FLAG_C)); else - flags = FLAGS32_NZCV_ADD(temp32, PARAM1 + (flags & FLAG_C), PARAM2); + { + if ((PARAM2 == 0xffffffff) && (flags & FLAG_C)) + { + flags = FLAGS32_NZCV_ADD(temp32, PARAM1 + (flags & FLAG_C), PARAM2); + flags |= FLAG_C; + } + else + flags = FLAGS32_NZCV_ADD(temp32, PARAM1 + (flags & FLAG_C), PARAM2); + } PARAM0 = temp32; break; @@ -958,10 +966,16 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SUBB, 4, 1): temp32 = PARAM1 - PARAM2 - (flags & FLAG_C); + temp64 = (UINT64)PARAM1 - (UINT64)PARAM2 - (UINT64)(flags & FLAG_C); if (PARAM2 + 1 != 0) flags = FLAGS32_NZCV_SUB(temp32, PARAM1, PARAM2 + (flags & FLAG_C)); else - flags = FLAGS32_NZCV_SUB(temp32, PARAM1 - (flags & FLAG_C), PARAM2); + { + flags = FLAGS32_NZCV_SUB(temp32, PARAM1 - (flags & FLAG_C), PARAM2); + flags &= ~(FLAG_C | FLAG_V); + flags |= ((temp64>>32) & 1) ? FLAG_C : 0; + flags |= (((PARAM1) ^ (PARAM2)) & ((PARAM1) ^ (temp64)) & 0x80000000) ? FLAG_V : 0; + } PARAM0 = temp32; break;