Files
rnes/src/main.rs
T
2026-08-09 19:46:07 -05:00

73 lines
2.0 KiB
Rust

mod cartridge;
mod bus;
mod cpu;
mod mapper;
mod palette;
mod render;
mod ppu;
use crate::bus::{Bus, NesBus};
use crate::cartridge::Cartridge;
use crate::cpu::Cpu;
use crate::render::{PpmRenderer, Renderer};
fn main() {
let args: Vec<String> = std::env::args().collect();
match args.len() {
1 => run_nestest(),
3 if args[1] == "blargg" => run_blargg(&args[2]),
2 => run_cart(&args[1]),
_ => eprintln!("usage: rnes [<rom> | blargg <rom>]"),
}
}
fn run_cart(path: &str) {
let cart = Cartridge::from_file(path).unwrap();
let mut bus = NesBus::new(cart);
let mut cpu = Cpu::new();
cpu.reset(&mut bus);
let mut renderer = PpmRenderer::new();
let frames: u32 = 60;
for _ in 0..frames {
while !bus.frame_done() {
let cycles = cpu.step(&mut bus);
bus.tick_ppu(cycles as u64);
}
if bus.take_nmi() { cpu.set_nmi(); }
renderer.present(bus.framebuffer(), 256, 240);
bus.begin_frame();
}
}
fn run_blargg(path: &str) {
let cart = Cartridge::from_file(path).unwrap();
let mut bus = NesBus::new(cart);
let mut cpu = Cpu::new();
cpu.reset(&mut bus); // boots from $FFFC-$FFFD via MMC1 PRG banking
let cycle_cap: u64 = 5_000_000; // blargg tests complete well under this; tune if needed
while cpu.cycles < cycle_cap {
cpu.step(&mut bus);
}
let r0 = bus.read(0x6000);
let r1 = bus.read(0x6001);
let r2 = bus.read(0x6002);
let r3 = bus.read(0x6003);
println!("result: $6000={:02X} $6001={:02X} $6002={:02X} $6003={:02X}", r0, r1, r2, r3);
if r0 == 0 { println!("PASS"); } else { println!("FAIL (error {:#04X})", r0); }
}
fn run_nestest() {
let cart: Cartridge = Cartridge::from_file("roms/test/cpu/nestest/nestest.nes").unwrap();
let mut bus: NesBus = NesBus::new(cart);
let mut cpu = Cpu::new();
cpu.set_test_start(0xC000, 7);
loop {
println!("{}", cpu.trace(&mut bus));
cpu.step(&mut bus);
}
}