nes-sim 0.1.4

A NES (Famicom) emulator core library written in pure Rust.
Documentation
use super::*;

#[test]
fn rel_returns_signed_target_and_advances_pc() {
    let mut cpu = CPU::new();
    let mut bus = TestBus::new();
    cpu.pc = 0x2000;
    bus.cpu_write(0x2000, 0xFE);

    let addr = cpu.resolve_operand(AddrMode::REL, &mut bus);

    assert_eq!(addr.map(|operand| operand.addr), Some(0x1FFF));
    assert_eq!(cpu.pc, 0x2001);
}

#[test]
fn izx_wraps_zero_page_pointer_before_reading_effective_address() {
    let mut cpu = CPU::new();
    let mut bus = TestBus::new();
    cpu.pc = 0x3000;
    cpu.x = 0x20;
    bus.cpu_write(0x3000, 0xF0);
    bus.cpu_write(0x0010, 0xCD);
    bus.cpu_write(0x0011, 0xAB);

    let addr = cpu.resolve_operand(AddrMode::IZX, &mut bus);

    assert_eq!(addr.map(|operand| operand.addr), Some(0xABCD));
    assert_eq!(cpu.pc, 0x3001);
}

#[test]
fn ind_emulates_6502_page_wrap_bug() {
    let mut cpu = CPU::new();
    let mut bus = TestBus::new();
    cpu.pc = 0x4000;
    bus.write_u16(0x4000, 0x12FF);
    bus.cpu_write(0x12FF, 0x78);
    bus.cpu_write(0x1200, 0x56);
    bus.cpu_write(0x1300, 0x99);

    let addr = cpu.resolve_operand(AddrMode::IND, &mut bus);

    assert_eq!(addr.map(|operand| operand.addr), Some(0x5678));
    assert_eq!(cpu.pc, 0x4002);
}

#[test]
fn page_crossed_returns_true_when_addresses_span_pages() {
    assert!(CPU::page_crossed(0x12FF, 0x1300));
    assert!(!CPU::page_crossed(0x1200, 0x12FF));
}