fix overflow flag

This commit is contained in:
2024-01-21 20:46:30 -05:00
parent 01b3493547
commit bdc24dcf24
2 changed files with 23 additions and 15 deletions
+19 -11
View File
@@ -170,11 +170,11 @@ mod alu_tests {
let (result, affected_flags) = adc_bin(200_u8, 155_u8, false);
assert_eq!(result, 99);
assert_eq!(affected_flags, [Negative(false), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(false), Overflow(true), Zero(false), Carry(true)]);
let (result, affected_flags) = adc_bin(200_u8, 155_u8, true);
assert_eq!(result, 100);
assert_eq!(affected_flags, [Negative(false), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(false), Overflow(true), Zero(false), Carry(true)]);
let (result, affected_flags) = adc_bin(200_u8, 54_u8, true);
assert_eq!(result, 255);
@@ -184,6 +184,14 @@ mod alu_tests {
assert_eq!(result, 255);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(false)]);
let (result, affected_flags) = adc_bin(0x7F_u8, 0x81_u8, false);
assert_eq!(result, 0x00);
assert_eq!(affected_flags, [Negative(false), Overflow(false), Zero(true), Carry(true)]);
let (result, affected_flags) = adc_bin(0x7F_u8, 0x7F_u8, true);
assert_eq!(result, 0xFF);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(false)]);
// 16 bits
let (result, affected_flags) = adc_bin(0_u16, 0_u16, false);
assert_eq!(result, 0);
@@ -195,11 +203,11 @@ mod alu_tests {
let (result, affected_flags) = adc_bin(65530_u16, 10_u16, false);
assert_eq!(result, 4);
assert_eq!(affected_flags, [Negative(false), Overflow(true), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(false), Overflow(false), Zero(false), Carry(true)]);
let (result, affected_flags) = adc_bin(65530_u16, 10_u16, true);
assert_eq!(result, 5);
assert_eq!(affected_flags, [Negative(false), Overflow(true), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(false), Overflow(false), Zero(false), Carry(true)]);
let (result, affected_flags) = adc_bin(65530_u16, 4_u16, true);
assert_eq!(result, 65535);
@@ -272,16 +280,16 @@ mod alu_tests {
let (result, affected_flags) = sbc_bin(0_u8, 1_u8, false);
assert_eq!(result, 0b11111111);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(true)]);
let (result, affected_flags) = sbc_bin(0_u8, 1_u8, true);
assert_eq!(result, 0b11111110);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(true)]);
// overflow
let (result, affected_flags) = sbc_bin(0x50_u8, 0xB0_u8, false);
assert_eq!(result, 0xA0);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(true)]);
// 16 bit
let (result, affected_flags) = sbc_bin(1_u16, 1_u16, false);
@@ -290,11 +298,11 @@ mod alu_tests {
let (result, affected_flags) = sbc_bin(0_u16, 1_u16, false);
assert_eq!(result, 0b11111111_11111111);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(true)]);
let (result, affected_flags) = sbc_bin(0_u16, 1_u16, true);
assert_eq!(result, 0b11111111_11111110);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(true)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(true)]);
}
#[test]
@@ -306,7 +314,7 @@ mod alu_tests {
let (result, affected_flags) = sbc_bcd(0x49_u8, 0x50_u8, true);
assert_eq!(result, 0x99);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(false)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(false)]);
// 16 bit
let (result, affected_flags) = sbc_bcd(0x4999_u16, 0x4998_u16, false);
@@ -315,7 +323,7 @@ mod alu_tests {
let (result, affected_flags) = sbc_bcd(0x4999_u16, 0x5000_u16, true);
assert_eq!(result, 0x9999);
assert_eq!(affected_flags, [Negative(true), Overflow(false), Zero(false), Carry(false)]);
assert_eq!(affected_flags, [Negative(true), Overflow(true), Zero(false), Carry(false)]);
}
#[test]
+4 -4
View File
@@ -46,10 +46,10 @@ macro_rules! define_operation {
macro_rules! define_is_overflow {
($t:ty) => {
fn is_overflow(&self, v: $t, r: $t) -> bool {
let target = (*self).is_negative();
let value = v.is_negative();
let result = r.is_negative();
(target ^ result) && (target ^ value)
let target_msb = (*self).is_negative();
let value_msb = v.is_negative();
let result_msb = r.is_negative();
(target_msb ^ result_msb) && !(target_msb ^ value_msb)
}
}
}