From eb27595cd5dae3b7eb61247c3e2569f226d55cc2 Mon Sep 17 00:00:00 2001 From: Andrew Keeton Date: Thu, 6 Nov 2014 20:00:09 -0500 Subject: [PATCH 1/3] Add branch_if_positive_test(). --- src/machine.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/machine.rs b/src/machine.rs index 5372e3d..54df5a4 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -956,3 +956,16 @@ fn branch_if_minus_test() { assert_eq!(machine.registers.program_counter, Address(0xABCD)); } } + +#[test] +fn branch_if_positive_test() { + let mut machine = Machine::new(); + + machine.registers.status.insert(PS_NEGATIVE); + machine.branch_if_positive(Address(0xABCD)); + assert_eq!(machine.registers.program_counter, Address(0)); + + machine.registers.status.remove(PS_NEGATIVE); + machine.branch_if_positive(Address(0xABCD)); + assert_eq!(machine.registers.program_counter, Address(0xABCD)); +} From f3160e1bcc7fd8a431c01e7de367b359077c6a67 Mon Sep 17 00:00:00 2001 From: Andrew Keeton Date: Thu, 6 Nov 2014 20:02:40 -0500 Subject: [PATCH 2/3] Add branch_if_positive(). --- src/machine.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/machine.rs b/src/machine.rs index 54df5a4..210c46c 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -583,6 +583,12 @@ impl Machine { } } + fn branch_if_positive(&mut self, addr: Address) { + if !self.registers.status.contains(PS_NEGATIVE) { + self.registers.program_counter = addr; + } + } + fn push_on_stack(&mut self, val: u8) { let addr = self.registers.stack_pointer.to_address(); self.memory.set_byte(addr, val); From 83d303f878c6701bea7ccd29a24701607d767a2c Mon Sep 17 00:00:00 2001 From: Andrew Keeton Date: Thu, 6 Nov 2014 20:04:03 -0500 Subject: [PATCH 3/3] Add BPL to execute_instruction(). --- src/machine.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/machine.rs b/src/machine.rs index 210c46c..1980cf0 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -157,6 +157,12 @@ impl Machine { self.branch_if_minus(addr); } + (instruction::BPL, instruction::UseRelative(rel)) => { + let addr = self.registers.program_counter + + AddressDiff(rel as i32); + self.branch_if_positive(addr); + } + (instruction::CLC, instruction::UseImplied) => { self.registers.status.and(!PS_CARRY); }