diff --git a/test-roms/6502_functional_test.bin b/test-roms/6502_functional_test.bin new file mode 100644 index 0000000..c9a35e1 Binary files /dev/null and b/test-roms/6502_functional_test.bin differ diff --git a/test-roms/SOURCES.md b/test-roms/SOURCES.md new file mode 100644 index 0000000..5d2c29a --- /dev/null +++ b/test-roms/SOURCES.md @@ -0,0 +1 @@ +`6502_functional_test.bin` from https://github.com/Klaus2m5/6502_65C02_functional_tests diff --git a/tests/functional-test.rs b/tests/functional-test.rs new file mode 100644 index 0000000..2fdc85e --- /dev/null +++ b/tests/functional-test.rs @@ -0,0 +1,45 @@ +extern crate mos6502; + +use std::fs::File; +use std::io::Read; + +use mos6502::address::Address; +use mos6502::cpu::CPU; + +const PC_START: u16 = 0x400; +// const MAX_CYCLES: usize = 100000000; + +#[test] +fn functional_test() { + let mut f = File::open("test-roms/6502_functional_test.bin").unwrap(); + let mut rom = Vec::::new(); + f.read_to_end(&mut rom).unwrap(); + let mut cpu = CPU::new(); + + cpu.memory.set_bytes(Address(PC_START), &rom); + + cpu.run(); + + /* + let mut last_pc = PC_START; + + loop { + cpu.step(); + // Prevent endless loop + if cpu.interconnect.elapsed_cycles() > MAX_CYCLES { + assert!(false, "Took too many cycles to complete"); + } + + if last_pc == cpu.registers.pc { + if cpu.registers.pc == 0x3367 { + // Success! + break; + } else { + assert!(false, "Trap detected"); + } + } + + last_pc = cpu.registers.pc; + } + */ +}