1use crate::{ControllerState, FRAME_WIDTH};
2
3pub const VIDEO_FRAME_PITCH: usize = FRAME_WIDTH;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
6pub enum PixelFormat {
7 Indexed8,
8}
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq)]
11pub struct VideoFrame<'a> {
12 pub width: usize,
13 pub height: usize,
14 pub pitch: usize,
15 pub format: PixelFormat,
16 pub frame_number: u64,
17 pub pixels: &'a [u8],
18}
19
20#[derive(Clone, Copy, Debug, PartialEq)]
21pub struct AudioBatch<'a> {
22 pub channels: u8,
23 pub sample_rate: u32,
24 pub samples: &'a [f32],
25}
26
27impl<'a> Default for AudioBatch<'a> {
28 fn default() -> Self {
29 Self {
30 channels: 1,
31 sample_rate: 44_100,
32 samples: &[],
33 }
34 }
35}
36
37#[derive(Clone, Copy, Debug, PartialEq, Eq)]
38pub enum CoreCommand {
39 Reset,
40 SetControllerState { port: usize, state: ControllerState },
41 RunFrame,
42 StepCpuInstruction,
43}
44
45#[derive(Clone, Copy, Debug, PartialEq, Eq)]
46pub enum CoreEvent {
47 None,
48 ResetComplete,
49 ControllerStateUpdated { port: usize },
50 FrameReady { frame_number: u64 },
51 CpuInstructionComplete { instruction_counter: u64 },
52}
53
54#[derive(Clone, Copy, Debug, PartialEq, Eq)]
55pub struct CoreResponse {
56 pub event: CoreEvent,
57 pub master_clock: u64,
58}
59
60#[derive(Clone, Copy, Debug, PartialEq, Eq)]
61pub struct CpuDebugSnapshot {
62 pub a: u8,
63 pub x: u8,
64 pub y: u8,
65 pub sp: u8,
66 pub pc: u16,
67 pub status: u8,
68 pub clocks: u64,
69 pub cycles_remaining: u64,
70 pub instruction_counter: u64,
71 pub irq_pending: bool,
72 pub nmi_line: bool,
73}
74
75#[derive(Clone, Copy, Debug, PartialEq, Eq)]
76pub struct PpuDebugSnapshot {
77 pub frame: u64,
78 pub scanline: i16,
79 pub in_vblank: bool,
80 pub nmi_line: bool,
81 pub oam_addr: u8,
82}
83
84#[derive(Clone, Copy, Debug, PartialEq, Eq)]
85pub struct DebugSnapshot {
86 pub master_clock: u64,
87 pub cpu: CpuDebugSnapshot,
88 pub ppu: PpuDebugSnapshot,
89}