mirror of
https://github.com/mre/mos6502.git
synced 2024-11-25 02:33:26 +00:00
fix the tests back up
This commit is contained in:
parent
12c901e8aa
commit
0708a1084c
@ -21,6 +21,7 @@ Source: [Wikipedia](https://en.wikipedia.org/wiki/MOS_Technology_6502)
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
use mos6502::memory::Bus;
|
use mos6502::memory::Bus;
|
||||||
|
use mos6502::memory::Memory;
|
||||||
use mos6502::cpu;
|
use mos6502::cpu;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -50,7 +51,7 @@ fn main() {
|
|||||||
0x4c, 0x10, 0x00, // Jump to .algo
|
0x4c, 0x10, 0x00, // Jump to .algo
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut cpu = cpu::CPU::new();
|
let mut cpu = cpu::CPU::new(Memory::new());
|
||||||
|
|
||||||
cpu.memory.set_bytes(0x00, &zero_page_data);
|
cpu.memory.set_bytes(0x00, &zero_page_data);
|
||||||
cpu.memory.set_bytes(0x10, &program);
|
cpu.memory.set_bytes(0x10, &program);
|
||||||
|
@ -2,6 +2,7 @@ extern crate mos6502;
|
|||||||
|
|
||||||
use mos6502::cpu;
|
use mos6502::cpu;
|
||||||
use mos6502::memory::Bus;
|
use mos6502::memory::Bus;
|
||||||
|
use mos6502::memory::Memory;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Enter two numbers (< 128) to know their GCD:");
|
println!("Enter two numbers (< 128) to know their GCD:");
|
||||||
@ -34,7 +35,7 @@ fn main() {
|
|||||||
0x4c, 0x10, 0x00, // Jump to .algo
|
0x4c, 0x10, 0x00, // Jump to .algo
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut cpu = cpu::CPU::new();
|
let mut cpu = cpu::CPU::new(Memory::new());
|
||||||
|
|
||||||
cpu.memory.set_bytes(0x00, &zero_page_data);
|
cpu.memory.set_bytes(0x00, &zero_page_data);
|
||||||
cpu.memory.set_bytes(0x10, &program);
|
cpu.memory.set_bytes(0x10, &program);
|
||||||
|
@ -30,10 +30,11 @@ extern crate mos6502;
|
|||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
use mos6502::cpu;
|
use mos6502::cpu;
|
||||||
use mos6502::memory::Bus;
|
use mos6502::memory::Bus;
|
||||||
|
use mos6502::memory::Memory;
|
||||||
|
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut cpu = cpu::CPU::new();
|
let mut cpu = cpu::CPU::new(Memory::new());
|
||||||
|
|
||||||
// "Load" a program
|
// "Load" a program
|
||||||
|
|
||||||
|
69
src/cpu.rs
69
src/cpu.rs
@ -949,7 +949,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn dont_panic_for_overflow() {
|
fn dont_panic_for_overflow() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.add_with_carry(-128);
|
cpu.add_with_carry(-128);
|
||||||
assert_eq!(cpu.registers.accumulator, -128);
|
assert_eq!(cpu.registers.accumulator, -128);
|
||||||
cpu.add_with_carry(-128);
|
cpu.add_with_carry(-128);
|
||||||
@ -963,7 +963,7 @@ mod tests {
|
|||||||
|
|
||||||
#[cfg_attr(feature = "decimal_mode", test)]
|
#[cfg_attr(feature = "decimal_mode", test)]
|
||||||
fn decimal_add_test() {
|
fn decimal_add_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers.status.or(Status::PS_DECIMAL_MODE);
|
cpu.registers.status.or(Status::PS_DECIMAL_MODE);
|
||||||
|
|
||||||
cpu.add_with_carry(0x09);
|
cpu.add_with_carry(0x09);
|
||||||
@ -990,7 +990,7 @@ mod tests {
|
|||||||
|
|
||||||
#[cfg_attr(feature = "decimal_mode", test)]
|
#[cfg_attr(feature = "decimal_mode", test)]
|
||||||
fn decimal_subtract_test() {
|
fn decimal_subtract_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers
|
cpu.registers
|
||||||
.status
|
.status
|
||||||
.or(Status::PS_DECIMAL_MODE | Status::PS_CARRY);
|
.or(Status::PS_DECIMAL_MODE | Status::PS_CARRY);
|
||||||
@ -1012,7 +1012,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add_with_carry_test() {
|
fn add_with_carry_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.add_with_carry(1);
|
cpu.add_with_carry(1);
|
||||||
assert_eq!(cpu.registers.accumulator, 1);
|
assert_eq!(cpu.registers.accumulator, 1);
|
||||||
@ -1035,7 +1035,7 @@ mod tests {
|
|||||||
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
assert!(!cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||||
assert!(!cpu.registers.status.contains(Status::PS_OVERFLOW));
|
assert!(!cpu.registers.status.contains(Status::PS_OVERFLOW));
|
||||||
|
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.add_with_carry(127);
|
cpu.add_with_carry(127);
|
||||||
assert_eq!(cpu.registers.accumulator, 127);
|
assert_eq!(cpu.registers.accumulator, 127);
|
||||||
@ -1066,7 +1066,7 @@ mod tests {
|
|||||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||||
assert!(!cpu.registers.status.contains(Status::PS_OVERFLOW));
|
assert!(!cpu.registers.status.contains(Status::PS_OVERFLOW));
|
||||||
|
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.add_with_carry(127);
|
cpu.add_with_carry(127);
|
||||||
assert_eq!(cpu.registers.accumulator, 127);
|
assert_eq!(cpu.registers.accumulator, 127);
|
||||||
@ -1082,7 +1082,7 @@ mod tests {
|
|||||||
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
assert!(cpu.registers.status.contains(Status::PS_NEGATIVE));
|
||||||
assert!(cpu.registers.status.contains(Status::PS_OVERFLOW));
|
assert!(cpu.registers.status.contains(Status::PS_OVERFLOW));
|
||||||
|
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers.status.or(Status::PS_CARRY);
|
cpu.registers.status.or(Status::PS_CARRY);
|
||||||
cpu.add_with_carry(-1);
|
cpu.add_with_carry(-1);
|
||||||
assert_eq!(cpu.registers.accumulator, 0);
|
assert_eq!(cpu.registers.accumulator, 0);
|
||||||
@ -1091,7 +1091,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn and_test() {
|
fn and_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.registers.accumulator = 0;
|
cpu.registers.accumulator = 0;
|
||||||
cpu.and(-1);
|
cpu.and(-1);
|
||||||
@ -1120,7 +1120,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn subtract_with_carry_test() {
|
fn subtract_with_carry_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
||||||
cpu.registers.accumulator = 0;
|
cpu.registers.accumulator = 0;
|
||||||
@ -1180,7 +1180,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn decrement_memory_test() {
|
fn decrement_memory_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
let addr: u16 = 0xA1B2;
|
let addr: u16 = 0xA1B2;
|
||||||
|
|
||||||
cpu.memory.set_byte(addr, 5);
|
cpu.memory.set_byte(addr, 5);
|
||||||
@ -1217,7 +1217,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn decrement_x_test() {
|
fn decrement_x_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers.index_x = 0x80;
|
cpu.registers.index_x = 0x80;
|
||||||
cpu.execute_instruction((Instruction::DEX, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::DEX, OpInput::UseImplied));
|
||||||
assert_eq!(cpu.registers.index_x, 127);
|
assert_eq!(cpu.registers.index_x, 127);
|
||||||
@ -1227,7 +1227,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn decrement_y_test() {
|
fn decrement_y_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers.index_y = 0x80;
|
cpu.registers.index_y = 0x80;
|
||||||
cpu.execute_instruction((Instruction::DEY, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::DEY, OpInput::UseImplied));
|
||||||
assert_eq!(cpu.registers.index_y, 127);
|
assert_eq!(cpu.registers.index_y, 127);
|
||||||
@ -1239,7 +1239,7 @@ mod tests {
|
|||||||
fn logical_shift_right_test() {
|
fn logical_shift_right_test() {
|
||||||
// Testing UseImplied version (which targets the accumulator) only, for now
|
// Testing UseImplied version (which targets the accumulator) only, for now
|
||||||
|
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(0)));
|
cpu.execute_instruction((Instruction::LDA, OpInput::UseImmediate(0)));
|
||||||
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::LSR, OpInput::UseImplied));
|
||||||
assert_eq!(cpu.registers.accumulator, 0);
|
assert_eq!(cpu.registers.accumulator, 0);
|
||||||
@ -1275,7 +1275,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn dec_x_test() {
|
fn dec_x_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.execute_instruction((Instruction::DEX, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::DEX, OpInput::UseImplied));
|
||||||
assert_eq!(cpu.registers.index_x, 0xff);
|
assert_eq!(cpu.registers.index_x, 0xff);
|
||||||
@ -1320,7 +1320,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn jump_test() {
|
fn jump_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
let addr: u16 = 0xA1B1;
|
let addr: u16 = 0xA1B1;
|
||||||
|
|
||||||
cpu.jump(addr);
|
cpu.jump(addr);
|
||||||
@ -1329,7 +1329,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_carry_clear_test() {
|
fn branch_if_carry_clear_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::SEC, OpInput::UseImplied));
|
||||||
cpu.branch_if_carry_clear(0xABCD);
|
cpu.branch_if_carry_clear(0xABCD);
|
||||||
@ -1342,7 +1342,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_carry_set_test() {
|
fn branch_if_carry_set_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.execute_instruction((Instruction::CLC, OpInput::UseImplied));
|
cpu.execute_instruction((Instruction::CLC, OpInput::UseImplied));
|
||||||
cpu.branch_if_carry_set(0xABCD);
|
cpu.branch_if_carry_set(0xABCD);
|
||||||
@ -1355,7 +1355,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_equal_test() {
|
fn branch_if_equal_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.branch_if_equal(0xABCD);
|
cpu.branch_if_equal(0xABCD);
|
||||||
assert_eq!(cpu.registers.program_counter, (0));
|
assert_eq!(cpu.registers.program_counter, (0));
|
||||||
@ -1368,7 +1368,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn branch_if_minus_test() {
|
fn branch_if_minus_test() {
|
||||||
{
|
{
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
let registers_before = cpu.registers;
|
let registers_before = cpu.registers;
|
||||||
|
|
||||||
cpu.branch_if_minus(0xABCD);
|
cpu.branch_if_minus(0xABCD);
|
||||||
@ -1377,7 +1377,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.registers.status.or(Status::PS_NEGATIVE);
|
cpu.registers.status.or(Status::PS_NEGATIVE);
|
||||||
let registers_before = cpu.registers;
|
let registers_before = cpu.registers;
|
||||||
@ -1390,7 +1390,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_positive_test() {
|
fn branch_if_positive_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.registers.status.insert(Status::PS_NEGATIVE);
|
cpu.registers.status.insert(Status::PS_NEGATIVE);
|
||||||
cpu.branch_if_positive(0xABCD);
|
cpu.branch_if_positive(0xABCD);
|
||||||
@ -1403,7 +1403,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_overflow_clear_test() {
|
fn branch_if_overflow_clear_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
||||||
cpu.branch_if_overflow_clear(0xABCD);
|
cpu.branch_if_overflow_clear(0xABCD);
|
||||||
@ -1416,7 +1416,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_across_end_of_address_space() {
|
fn branch_across_end_of_address_space() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
cpu.registers.program_counter = 0xffff;
|
cpu.registers.program_counter = 0xffff;
|
||||||
|
|
||||||
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
cpu.registers.status.insert(Status::PS_OVERFLOW);
|
||||||
@ -1426,7 +1426,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn branch_if_overflow_set_test() {
|
fn branch_if_overflow_set_test() {
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.branch_if_overflow_set(0xABCD);
|
cpu.branch_if_overflow_set(0xABCD);
|
||||||
assert_eq!(cpu.registers.program_counter, (0));
|
assert_eq!(cpu.registers.program_counter, (0));
|
||||||
@ -1437,11 +1437,11 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
fn compare_test_helper<F, M>(compare: &mut F, load_instruction: Instruction)
|
fn compare_test_helper<F>(compare: &mut F, load_instruction: Instruction)
|
||||||
where
|
where
|
||||||
F: FnMut(&mut CPU<M>, u8),
|
F: FnMut(&mut CPU<crate::memory::Memory>, u8),
|
||||||
{
|
{
|
||||||
let mut cpu = CPU::new();
|
let mut cpu = CPU::new(crate::memory::Memory::new());
|
||||||
|
|
||||||
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(127)));
|
cpu.execute_instruction((load_instruction, OpInput::UseImmediate(127)));
|
||||||
|
|
||||||
@ -1489,7 +1489,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn compare_with_a_register_test() {
|
fn compare_with_a_register_test() {
|
||||||
compare_test_helper(
|
compare_test_helper(
|
||||||
&mut |cpu: &mut CPU, val: u8| {
|
&mut |cpu: &mut CPU<crate::memory::Memory>, val: u8| {
|
||||||
cpu.compare_with_a_register(val);
|
cpu.compare_with_a_register(val);
|
||||||
},
|
},
|
||||||
Instruction::LDA,
|
Instruction::LDA,
|
||||||
@ -1499,7 +1499,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn compare_with_x_register_test() {
|
fn compare_with_x_register_test() {
|
||||||
compare_test_helper(
|
compare_test_helper(
|
||||||
&mut |cpu: &mut CPU, val: u8| {
|
&mut |cpu: &mut CPU<crate::memory::Memory>, val: u8| {
|
||||||
cpu.compare_with_x_register(val);
|
cpu.compare_with_x_register(val);
|
||||||
},
|
},
|
||||||
Instruction::LDX,
|
Instruction::LDX,
|
||||||
@ -1509,7 +1509,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn compare_with_y_register_test() {
|
fn compare_with_y_register_test() {
|
||||||
compare_test_helper(
|
compare_test_helper(
|
||||||
&mut |cpu: &mut CPU, val: u8| {
|
&mut |cpu: &mut CPU<crate::memory::Memory>, val: u8| {
|
||||||
cpu.compare_with_y_register(val);
|
cpu.compare_with_y_register(val);
|
||||||
},
|
},
|
||||||
Instruction::LDY,
|
Instruction::LDY,
|
||||||
@ -1518,7 +1518,8 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn exclusive_or_test() {
|
fn exclusive_or_test() {
|
||||||
let mut cpu = CPU::new();
|
use crate::memory::Memory;
|
||||||
|
let mut cpu = CPU::new(Memory::new());
|
||||||
|
|
||||||
for a_before in range_inclusive(0u8, 255u8) {
|
for a_before in range_inclusive(0u8, 255u8) {
|
||||||
for val in range_inclusive(0u8, 255u8) {
|
for val in range_inclusive(0u8, 255u8) {
|
||||||
@ -1546,7 +1547,8 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn inclusive_or_test() {
|
fn inclusive_or_test() {
|
||||||
let mut cpu = CPU::new();
|
use crate::memory::Memory;
|
||||||
|
let mut cpu = CPU::new(Memory::new());
|
||||||
|
|
||||||
for a_before in range_inclusive(0u8, 255u8) {
|
for a_before in range_inclusive(0u8, 255u8) {
|
||||||
for val in range_inclusive(0u8, 255u8) {
|
for val in range_inclusive(0u8, 255u8) {
|
||||||
@ -1574,7 +1576,8 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn stack_underflow() {
|
fn stack_underflow() {
|
||||||
let mut cpu = CPU::new();
|
use crate::memory::Memory;
|
||||||
|
let mut cpu = CPU::new(Memory::new());
|
||||||
let _val: u8 = cpu.pull_from_stack();
|
let _val: u8 = cpu.pull_from_stack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user