Skip to content

Commit 38e7f69

Browse files
committed
fix: ADC carry and overflow flags
1 parent 7f8fce4 commit 38e7f69

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

src/core.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -343,12 +343,18 @@ impl Cpu {
343343
fn adc(&mut self, mode: &AddressingMode) {
344344
let addr = self.get_operand_address(mode);
345345
let param = self.mem_read(addr);
346-
let (new_val, overflow) = self.a.overflowing_add(param);
347-
self.a = new_val;
346+
let (mid, overflow) = self.a.overflowing_add(param);
348347

349-
self.set_zero_and_negative_flags(new_val);
350-
self.set_flag(Flag::Carry, overflow);
351-
self.set_flag(Flag::Overflow, false); // TODO: not implemented -- fix it for snake to work?
348+
let c = if self.get_flag(Flag::Carry) { 1 } else { 0 };
349+
let (result, overflow2) = mid.overflowing_add(c);
350+
351+
self.set_zero_and_negative_flags(result);
352+
self.set_flag(Flag::Carry, overflow || overflow2);
353+
354+
let v = (result ^ self.a) & (result ^ param) & 0x80;
355+
self.set_flag(Flag::Overflow, v > 0);
356+
357+
self.a = result;
352358
}
353359

354360
/// AND (bitwise AND with accumulator)
@@ -1527,6 +1533,8 @@ mod tests {
15271533

15281534
#[test]
15291535
fn test_nestest() {
1536+
let max_known_good_line = 313;
1537+
15301538
let program = fs::read("roms/nestest.nes").unwrap();
15311539

15321540
let mut cpu = Cpu::new();
@@ -1552,7 +1560,6 @@ mod tests {
15521560
Err(e) => e.into_inner(),
15531561
};
15541562

1555-
let max_known_good_line = 230;
15561563
for (idx, e) in expected.lines().enumerate() {
15571564
let line_num = idx + 1;
15581565
if line_num > max_known_good_line {

0 commit comments

Comments
 (0)