nes-sim 0.1.1

A NES (Famicom) emulator core library written in pure Rust.
Documentation
use crate::{ControllerState, FRAME_WIDTH};

pub const VIDEO_FRAME_PITCH: usize = FRAME_WIDTH;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PixelFormat {
    Indexed8,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct VideoFrame<'a> {
    pub width: usize,
    pub height: usize,
    pub pitch: usize,
    pub format: PixelFormat,
    pub frame_number: u64,
    pub pixels: &'a [u8],
}

#[derive(Clone, Copy, Debug, PartialEq)]
pub struct AudioBatch<'a> {
    pub channels: u8,
    pub sample_rate: u32,
    pub samples: &'a [f32],
}

impl<'a> Default for AudioBatch<'a> {
    fn default() -> Self {
        Self {
            channels: 1,
            sample_rate: 44_100,
            samples: &[],
        }
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CoreCommand {
    Reset,
    SetControllerState { port: usize, state: ControllerState },
    RunFrame,
    StepCpuInstruction,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CoreEvent {
    None,
    ResetComplete,
    ControllerStateUpdated { port: usize },
    FrameReady { frame_number: u64 },
    CpuInstructionComplete { instruction_counter: u64 },
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct CoreResponse {
    pub event: CoreEvent,
    pub master_clock: u64,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct CpuDebugSnapshot {
    pub a: u8,
    pub x: u8,
    pub y: u8,
    pub sp: u8,
    pub pc: u16,
    pub status: u8,
    pub clocks: u64,
    pub cycles_remaining: u64,
    pub instruction_counter: u64,
    pub irq_pending: bool,
    pub nmi_line: bool,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PpuDebugSnapshot {
    pub frame: u64,
    pub scanline: i16,
    pub in_vblank: bool,
    pub nmi_line: bool,
    pub oam_addr: u8,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct DebugSnapshot {
    pub master_clock: u64,
    pub cpu: CpuDebugSnapshot,
    pub ppu: PpuDebugSnapshot,
}