From 5ecdae2d2564083d07bfcff6c6d0e77145796fa6 Mon Sep 17 00:00:00 2001 From: Sam M W Date: Sat, 20 Apr 2024 16:30:42 +0100 Subject: [PATCH] get overflow calcs to look at boolean algebra instead of comparison to magic number --- src/cpu.rs | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/src/cpu.rs b/src/cpu.rs index dea2f5f..1d2b81f 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -747,8 +747,7 @@ impl CPU { || (a_after == 0 && c_before == 0x01) || (value == 0xff && c_before == 0x01); - let did_overflow = (a_before > 127 && value > 127 && a_after < 128) - || (a_before < 128 && value < 128 && a_after > 127); + let did_overflow = (a_after ^ a_before) & (a_after ^ value) & 0x80 != 0; let mask = Status::PS_CARRY | Status::PS_OVERFLOW; @@ -779,8 +778,7 @@ impl CPU { || (a_after == 0 && c_before == 0x01) || (value == 0xff && c_before == 0x01); - let did_overflow = (a_before > 127 && value > 127 && a_after < 128) - || (a_before < 128 && value < 128 && a_after > 127); + let did_overflow = (a_after ^ a_before) & (a_after ^ value) & 0x80 != 0; let mask = Status::PS_CARRY | Status::PS_OVERFLOW; @@ -817,18 +815,7 @@ impl CPU { let a_after = a_before.wrapping_sub(value).wrapping_sub(nc); - // The overflow flag is set on two's-complement overflow. - // - // range of A is -128 to 127 - // range of - M - (1 - C) is -128 to 128 - // -(127 + 1) to -(-128 + 0) - // - let over = (nc == 0 && value > 127) && a_before < 128 && a_after > 127; - - let under = - (a_before > 127) && (0u8.wrapping_sub(value).wrapping_sub(nc) > 127) && a_after < 128; - - let did_overflow = over || under; + let did_overflow = (a_after ^ a_before) & (a_after ^ value) & 0x80 == 0; let mask = Status::PS_CARRY | Status::PS_OVERFLOW; @@ -863,18 +850,7 @@ impl CPU { let a_after = a_before.wrapping_sub(value).wrapping_sub(nc); - // The overflow flag is set on two's-complement overflow. - // - // range of A is -128 to 127 - // range of - M - (1 - C) is -128 to 128 - // -(127 + 1) to -(-128 + 0) - // - let over = (nc == 0 && value > 127) && a_before < 128 && a_after > 127; - - let under = - (a_before > 127) && (0u8.wrapping_sub(value).wrapping_sub(nc) > 127) && a_after < 128; - - let did_overflow = over || under; + let did_overflow = (a_after ^ a_before) & (a_after ^ value) & 0x80 == 0; let mask = Status::PS_CARRY | Status::PS_OVERFLOW;