Fixed some Z80 tests related to the overflow flag

This commit is contained in:
transistor 2023-05-13 10:36:50 -07:00
parent d8638c6f82
commit cf4e31454b
2 changed files with 38 additions and 37 deletions

View File

@ -106,7 +106,7 @@ impl Z80 {
let (result1, carry1, overflow1, half_carry1) = add_bytes(acc, self.get_flag(Flags::Carry) as u8);
let (result2, carry2, overflow2, half_carry2) = add_bytes(result1, src);
self.set_arithmetic_op_flags(result2 as u16, Size::Byte, false, carry1 | carry2, overflow1 | overflow2, half_carry1 | half_carry2);
self.set_arithmetic_op_flags(result2 as u16, Size::Byte, false, carry1 | carry2, overflow1 ^ overflow2, half_carry1 | half_carry2);
self.set_register_value(Register::A, result2);
},
@ -114,9 +114,9 @@ impl Z80 {
let src = self.get_register_pair_value(src_pair);
let dest = self.get_register_pair_value(dest_pair);
let (result1, carry1, overflow1, half_carry1) = add_words(dest, self.get_flag(Flags::Carry) as u16);
let (result2, carry2, overflow2, half_carry2) = add_words(result1, src);
self.set_arithmetic_op_flags(result2, Size::Word, false, carry1 | carry2, overflow1 | overflow2, half_carry1 | half_carry2);
let (result1, carry1, overflow1, half_carry1) = add_words(dest, src);
let (result2, carry2, overflow2, half_carry2) = add_words(result1, self.get_flag(Flags::Carry) as u16);
self.set_arithmetic_op_flags(result2, Size::Word, false, carry1 | carry2, overflow1 ^ overflow2, half_carry1 | half_carry2);
self.set_register_pair_value(dest_pair, result2);
},
@ -484,9 +484,9 @@ impl Z80 {
let src = self.get_target_value(target)?;
let acc = self.get_register_value(Register::A);
let (result1, carry1, overflow1) = sub_bytes(acc, self.get_flag(Flags::Carry) as u8);
let (result2, carry2, overflow2) = sub_bytes(result1, src);
self.set_arithmetic_op_flags(result2 as u16, Size::Byte, true, carry1 | carry2, overflow1 | overflow2, (result2 & 0x10) != 0);
let (result1, carry1, overflow1) = sub_bytes(acc, src);
let (result2, carry2, overflow2) = sub_bytes(result1, self.get_flag(Flags::Carry) as u8);
self.set_arithmetic_op_flags(result2 as u16, Size::Byte, true, carry1 | carry2, overflow1 ^ overflow2, (result2 & 0x10) != 0);
self.set_register_value(Register::A, result2);
},
@ -496,7 +496,7 @@ impl Z80 {
let (result1, carry1, overflow1) = sub_words(dest, self.get_flag(Flags::Carry) as u16);
let (result2, carry2, overflow2) = sub_words(result1, src);
self.set_arithmetic_op_flags(result2, Size::Word, true, carry1 | carry2, overflow1 | overflow2, (result2 & 0x10) != 0);
self.set_arithmetic_op_flags(result2, Size::Word, true, carry1 | carry2, overflow1 ^ overflow2, (result2 & 0x10) != 0);
self.set_register_pair_value(dest_pair, result2);
},
@ -858,27 +858,28 @@ impl Z80 {
fn add_bytes(operand1: u8, operand2: u8) -> (u8, bool, bool, bool) {
let (result, carry) = operand1.overflowing_add(operand2);
let (_, overflow) = (operand1 as i8).overflowing_add(operand2 as i8);
let overflow = (operand1 & 0x80) == (operand2 & 0x80) && (operand1 & 0x80) != (result & 0x80);
let half_carry = (operand1 & 0x10) != 0 && (result & 0x10) == 0;
(result, carry, overflow, half_carry)
}
fn add_words(operand1: u16, operand2: u16) -> (u16, bool, bool, bool) {
let (result, carry) = operand1.overflowing_add(operand2);
let (_, overflow) = ((operand1 as i8) as i16).overflowing_add((operand2 as i8) as i16);
let overflow = (operand1 & 0x8000) == (operand2 & 0x8000) && (operand1 & 0x8000) != (result & 0x8000);
// TODO this is probably still wrong
let half_carry = (operand1 & 0x10) != 0 && (result & 0x10) == 0;
(result, carry, overflow, half_carry)
}
fn sub_bytes(operand1: u8, operand2: u8) -> (u8, bool, bool) {
let (result, carry) = operand1.overflowing_sub(operand2);
let (_, overflow) = (operand1 as i8).overflowing_sub(operand2 as i8);
let overflow = (operand1 & 0x80) != (operand2 & 0x80) && (operand1 & 0x80) != (result & 0x80);
(result, carry, overflow)
}
fn sub_words(operand1: u16, operand2: u16) -> (u16, bool, bool) {
let (result, carry) = operand1.overflowing_sub(operand2);
let (_, overflow) = ((operand1 as i8) as i16).overflowing_sub((operand2 as i8) as i16);
let overflow = (operand1 & 0x8000) != (operand2 & 0x8000) && (operand1 & 0x8000) != (result & 0x8000);
(result, carry, overflow)
}

View File

@ -1,4 +1,4 @@
Last run on 2023-05-12 at commit b2b9d73375d0ae7822cd3b1376b706f94b0b4456
Last run on 2023-05-13 at commit d8638c6f82f45f6235784f96d8f5eb1a766bad52
00.json completed, all passed!
01.json completed, all passed!
@ -138,12 +138,12 @@ Last run on 2023-05-12 at commit b2b9d73375d0ae7822cd3b1376b706f94b0b4456
85.json completed, all passed!
86.json completed, all passed!
87.json completed, all passed!
88.json completed: 999 passed, 1 FAILED
88.json completed, all passed!
89.json completed, all passed!
8a.json completed, all passed!
8b.json completed, all passed!
8c.json completed, all passed!
8d.json completed: 999 passed, 1 FAILED
8d.json completed, all passed!
8e.json completed, all passed!
8f.json completed, all passed!
90.json completed, all passed!
@ -154,14 +154,14 @@ Last run on 2023-05-12 at commit b2b9d73375d0ae7822cd3b1376b706f94b0b4456
95.json completed, all passed!
96.json completed, all passed!
97.json completed, all passed!
98.json completed: 998 passed, 2 FAILED
99.json completed: 999 passed, 1 FAILED
9a.json completed: 998 passed, 2 FAILED
9b.json completed: 999 passed, 1 FAILED
9c.json completed: 999 passed, 1 FAILED
9d.json completed: 999 passed, 1 FAILED
9e.json completed: 998 passed, 2 FAILED
9f.json completed: 996 passed, 4 FAILED
98.json completed, all passed!
99.json completed, all passed!
9a.json completed, all passed!
9b.json completed, all passed!
9c.json completed, all passed!
9d.json completed, all passed!
9e.json completed, all passed!
9f.json completed, all passed!
a0.json completed, all passed!
a1.json completed, all passed!
a2.json completed, all passed!
@ -455,7 +455,7 @@ cb fe.json completed, all passed!
cb ff.json completed, all passed!
cc.json completed, all passed!
cd.json completed, all passed!
ce.json completed: 998 passed, 2 FAILED
ce.json completed, all passed!
cf.json completed, all passed!
d0.json completed, all passed!
d1.json completed, all passed!
@ -489,7 +489,7 @@ dd 74.json completed, all passed!
dd 75.json completed, all passed!
dd 77.json completed, all passed!
dd 7e.json completed, all passed!
dd 8e.json completed: 998 passed, 2 FAILED
dd 8e.json completed, all passed!
dd 9e.json completed, all passed!
dd ae.json completed, all passed!
dd b6.json completed, all passed!
@ -506,7 +506,7 @@ dd e9.json completed, all passed!
dd ee.json completed: 0 passed, 1000 FAILED
dd f9.json completed, all passed!
dd fe.json completed: 0 passed, 1000 FAILED
de.json completed: 998 passed, 2 FAILED
de.json completed, all passed!
df.json completed, all passed!
e0.json completed, all passed!
e1.json completed, all passed!
@ -523,7 +523,7 @@ eb.json completed, all passed!
ec.json completed, all passed!
ed 40.json completed: 0 passed, 1000 FAILED
ed 41.json completed: 0 passed, 1000 FAILED
ed 42.json completed: 765 passed, 235 FAILED
ed 42.json completed, all passed!
ed 43.json completed, all passed!
ed 44.json completed, all passed!
ed 45.json completed: 0 passed, 1000 FAILED
@ -531,7 +531,7 @@ ed 46.json completed, all passed!
ed 47.json completed, all passed!
ed 48.json completed: 0 passed, 1000 FAILED
ed 49.json completed: 0 passed, 1000 FAILED
ed 4a.json completed: 723 passed, 277 FAILED
ed 4a.json completed, all passed!
ed 4b.json completed, all passed!
ed 4c.json completed, all passed!
ed 4d.json completed: 0 passed, 1000 FAILED
@ -539,7 +539,7 @@ ed 4e.json completed, all passed!
ed 4f.json completed, all passed!
ed 50.json completed: 0 passed, 1000 FAILED
ed 51.json completed: 0 passed, 1000 FAILED
ed 52.json completed: 746 passed, 254 FAILED
ed 52.json completed, all passed!
ed 53.json completed, all passed!
ed 54.json completed, all passed!
ed 55.json completed: 0 passed, 1000 FAILED
@ -547,7 +547,7 @@ ed 56.json completed, all passed!
ed 57.json completed: 0 passed, 1000 FAILED
ed 58.json completed: 0 passed, 1000 FAILED
ed 59.json completed: 0 passed, 1000 FAILED
ed 5a.json completed: 743 passed, 257 FAILED
ed 5a.json completed, all passed!
ed 5b.json completed, all passed!
ed 5c.json completed, all passed!
ed 5d.json completed: 0 passed, 1000 FAILED
@ -563,7 +563,7 @@ ed 66.json completed, all passed!
ed 67.json completed: 0 passed, 1000 FAILED
ed 68.json completed: 0 passed, 1000 FAILED
ed 69.json completed: 0 passed, 1000 FAILED
ed 6a.json completed: 486 passed, 514 FAILED
ed 6a.json completed, all passed!
ed 6b.json completed, all passed!
ed 6c.json completed, all passed!
ed 6d.json completed: 0 passed, 1000 FAILED
@ -571,7 +571,7 @@ ed 6e.json completed, all passed!
ed 6f.json completed: 0 passed, 1000 FAILED
ed 70.json completed: 0 passed, 1000 FAILED
ed 71.json completed: 0 passed, 1000 FAILED
ed 72.json completed: 744 passed, 256 FAILED
ed 72.json completed, all passed!
ed 73.json completed, all passed!
ed 74.json completed, all passed!
ed 75.json completed: 0 passed, 1000 FAILED
@ -579,7 +579,7 @@ ed 76.json completed, all passed!
ed 77.json completed, all passed!
ed 78.json completed: 0 passed, 1000 FAILED
ed 79.json completed: 0 passed, 1000 FAILED
ed 7a.json completed: 760 passed, 240 FAILED
ed 7a.json completed, all passed!
ed 7b.json completed, all passed!
ed 7c.json completed, all passed!
ed 7d.json completed: 0 passed, 1000 FAILED
@ -635,8 +635,8 @@ fd 74.json completed, all passed!
fd 75.json completed, all passed!
fd 77.json completed, all passed!
fd 7e.json completed, all passed!
fd 8e.json completed: 999 passed, 1 FAILED
fd 9e.json completed: 999 passed, 1 FAILED
fd 8e.json completed, all passed!
fd 9e.json completed, all passed!
fd ae.json completed, all passed!
fd b6.json completed, all passed!
fd be.json completed, all passed!
@ -655,5 +655,5 @@ fd fe.json completed: 0 passed, 1000 FAILED
fe.json completed, all passed!
ff.json completed, all passed!
passed: 543908, failed: 110092, total 83%
completed in 12m 50s
passed: 545965, failed: 108035, total 83%
completed in 10m 35s