use crate::{NES, hex_view::Memory}; macro_rules! rom_test { ($name:ident, $rom:literal, |$nes:ident| $eval:expr) => { #[test] fn $name() { let rom_file = concat!(env!("ROM_DIR"), "/", $rom); println!("{}: {}", stringify!($name), rom_file); let mut $nes = NES::load_nes_file(rom_file).expect("Failed to create nes object"); $nes.reset_and_run_with_timeout(1000000); println!("Final: {:?}", $nes); $eval } }; } rom_test!(basic_cpu, "basic-cpu.nes", |nes| { assert_eq!(nes.last_instruction, "0x8001 HLT :2 []"); // Off by one from Mesen, since Mesen doesn't count the clock cycle attempting to execute the 'invalid' opcode assert_eq!(nes.cycle, 11); // This is off by one from Mesen, because Mesen is left pointing at the 'invalid' opcode assert_eq!(nes.cpu.pc, 0x8002); assert_eq!(nes.cpu.sp, 0xFD); // assert_eq!(nes.cpu.a, 0x00); // assert_eq!(nes.cpu.x, 0x00); // assert_eq!(nes.cpu.y, 0x00); }); rom_test!(read_write, "read_write.nes", |nes| { assert_eq!(nes.last_instruction, "0x8011 HLT :2 []"); assert_eq!(nes.cycle, 31); assert_eq!(nes.cpu.pc, 0x8012); assert_eq!(nes.cpu.sp, 0xFD); assert_eq!(nes.cpu.a, 0xAA); assert_eq!(nes.cpu.x, 0xAA); assert_eq!(nes.cpu.y, 0xAA); assert_eq!(nes.cpu_mem().peek(0x0000).unwrap(), 0xAA); assert_eq!(nes.cpu_mem().peek(0x0001).unwrap(), 0xAA); assert_eq!(nes.cpu_mem().peek(0x0002).unwrap(), 0xAA); });