diff --git a/src/machine.rs b/src/machine.rs index df23a32..e226d96 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -48,7 +48,7 @@ impl Machine { memory: Memory::new() } } - + pub fn reset(&mut self) { *self = Machine::new(); } @@ -90,6 +90,12 @@ impl Machine { self.add_with_carry(val); }, + (instruction::BMI, instruction::UseRelative(rel)) => { + let addr = self.registers.program_counter + rel; + log!(log::DEBUG, "branch if minus relative. address: {}", addr); + self.branch_if_minus(addr); + }, + (instruction::LDA, instruction::UseImmediate(val)) => { log!(log::DEBUG, "load A immediate: {}", val); self.load_accumulator(val as i8); @@ -199,6 +205,12 @@ impl Machine { log!(log::DEBUG, "accumulator: {}", self.registers.accumulator); } + + pub fn branch_if_minus(&mut self, addr: Address) { + if (self.registers.status.contains(PS_NEGATIVE)) { + self.registers.program_counter = addr; + } + } } impl std::fmt::Show for Machine { @@ -210,7 +222,6 @@ impl std::fmt::Show for Machine { #[test] fn add_with_carry_test() { - let mut machine = Machine::new(); machine.add_with_carry(1); @@ -233,7 +244,7 @@ fn add_with_carry_test() { assert_eq!(machine.registers.status.contains(PS_ZERO), false); assert_eq!(machine.registers.status.contains(PS_NEGATIVE), false); assert_eq!(machine.registers.status.contains(PS_OVERFLOW), false); - + let mut machine = Machine::new(); machine.add_with_carry(127); @@ -281,3 +292,26 @@ fn add_with_carry_test() { assert_eq!(machine.registers.status.contains(PS_NEGATIVE), true); assert_eq!(machine.registers.status.contains(PS_OVERFLOW), true); } + +#[test] +fn branch_if_minus_test() { + { + let mut machine = Machine::new(); + let registers_before = machine.registers; + + machine.branch_if_minus(Address(0xABCD)); + assert_eq!(machine.registers, registers_before); + assert_eq!(machine.registers.program_counter, Address(0)); + } + + { + let mut machine = Machine::new(); + + machine.registers.status.set_with_mask(PS_NEGATIVE, PS_NEGATIVE); + let registers_before = machine.registers; + + machine.branch_if_minus(Address(0xABCD)); + assert_eq!(machine.registers, registers_before); + assert_eq!(machine.registers.program_counter, Address(0xABCD)); + } +}