diff --git a/ch5/ch5-cpu4/src/main.rs b/ch5/ch5-cpu4/src/main.rs index 6fc0db65..006f1f2f 100644 --- a/ch5/ch5-cpu4/src/main.rs +++ b/ch5/ch5-cpu4/src/main.rs @@ -59,14 +59,14 @@ impl CPU { } fn se(&mut self, vx: u8, kk: u8) { - if vx == kk { + if self.registers[vx as usize] == kk { self.position_in_memory += 2; } } /// () SNE **S**tore if **n**ot **e**qual fn sne(&mut self, vx: u8, kk: u8) { - if vx != kk { + if self.registers[vx as usize] != kk { self.position_in_memory += 2; } } @@ -102,9 +102,10 @@ impl CPU { // (7xkk) fn add_xy(&mut self, x: u8, y: u8) { - self.registers[x as usize] += self.registers[y as usize]; - - // TODO: SET CARRY FLAG!!!! + /// Set carry flag + let (wrapped, is_overflow) = self.registers[x as usize].overflowing_add(self.registers[y as usize]); + self.registers[0xF] = if is_overflow {1} else {0}; + self.registers[x as usize] = wrapped; } fn and_xy(&mut self, x: u8, y: u8) { @@ -154,4 +155,4 @@ fn main() { assert_eq!(cpu.registers[0], 45); println!("5 + (10 * 2) + (10 * 2) = {}", cpu.registers[0]); -} \ No newline at end of file +}