|
| 1 | +#[cfg(test)] |
| 2 | +// Similar to JMP testing, and just branch further into the code |
| 3 | +// Eg. Set [BRANCH 0x02 0x00 INX] |
| 4 | +// And just test for x and see if branch has been or hasn't been done |
| 5 | +mod branch_test { |
| 6 | + use crate::cpu::op::*; |
| 7 | + use crate::cpu::CpuFlags; |
| 8 | + use crate::cpu::CPU; |
| 9 | + |
| 10 | + // All this will do is run [op 0x01 0x00 INX] |
| 11 | + // Specify clear if the flag should be clear(This will enable all flags except the chosen flag) |
| 12 | + // It will initalize all flags as empty, specify in flags to enable flags |
| 13 | + // If x == 1, branch is successful, if not, branch is unsuccessful |
| 14 | + fn jump(cpu: &mut CPU, op: u8, clear: bool, flag: CpuFlags) { |
| 15 | + cpu.load_and_reset(vec![op, 0x01, 0x00, op::INX]); |
| 16 | + if clear { |
| 17 | + println!("branch_test: Allocating flags to clear!"); |
| 18 | + cpu.flags = CpuFlags::from_bits_truncate(0b1111_1111); |
| 19 | + cpu.flags.remove(flag); |
| 20 | + } else { |
| 21 | + cpu.flags.insert(flag); |
| 22 | + } |
| 23 | + cpu.run(); |
| 24 | + } |
| 25 | + |
| 26 | + // Each test will test when branch should occur and branch should not occur |
| 27 | + // Clear tests if flag is clear |
| 28 | + fn helper_test(op: u8, clear: bool, flag: CpuFlags) { |
| 29 | + let mut cpu = CPU::new(); |
| 30 | + // First test should succeed |
| 31 | + jump(&mut cpu, op, clear, flag); |
| 32 | + assert!( |
| 33 | + cpu.x == 1, |
| 34 | + "Helper_test positive failed on {:#x}, cpu.x is {}", |
| 35 | + op, |
| 36 | + cpu.x |
| 37 | + ); |
| 38 | + |
| 39 | + // Second test should fail |
| 40 | + jump(&mut cpu, op, !clear, flag); |
| 41 | + assert!( |
| 42 | + cpu.x == 0, |
| 43 | + "Helper_test negative failed on {:#x}, cpu.x is {}", |
| 44 | + op, |
| 45 | + cpu.x |
| 46 | + ); |
| 47 | + } |
| 48 | + |
| 49 | + #[test] |
| 50 | + fn bpl_test() { |
| 51 | + helper_test(branch_op::BPL, true, CpuFlags::NEGATIVE); |
| 52 | + } |
| 53 | + |
| 54 | + #[test] |
| 55 | + fn bmi_test() { |
| 56 | + helper_test(branch_op::BMI, false, CpuFlags::NEGATIVE); |
| 57 | + } |
| 58 | + |
| 59 | + #[test] |
| 60 | + fn bvc_test() { |
| 61 | + helper_test(branch_op::BVC, true, CpuFlags::OVERFLOW); |
| 62 | + } |
| 63 | + |
| 64 | + #[test] |
| 65 | + fn bvs_test() { |
| 66 | + helper_test(branch_op::BVS, false, CpuFlags::OVERFLOW); |
| 67 | + } |
| 68 | + |
| 69 | + #[test] |
| 70 | + fn bcc_test() { |
| 71 | + helper_test(branch_op::BCC, true, CpuFlags::CARRY); |
| 72 | + } |
| 73 | + |
| 74 | + #[test] |
| 75 | + fn bcs_test() { |
| 76 | + helper_test(branch_op::BCS, false, CpuFlags::CARRY); |
| 77 | + } |
| 78 | + |
| 79 | + #[test] |
| 80 | + fn bne_test() { |
| 81 | + helper_test(branch_op::BNE, true, CpuFlags::ZERO); |
| 82 | + } |
| 83 | + |
| 84 | + #[test] |
| 85 | + fn beq_test() { |
| 86 | + helper_test(branch_op::BEQ, false, CpuFlags::ZERO); |
| 87 | + } |
| 88 | +} |
0 commit comments