1use jgenesis_common::frontend::TimingMode; 2use jgenesis_proc_macros::deserialize_default_on_error; 3use nes_config::{NesAspectRatio, NesAudioResampler, NesPalette, Overscan}; 4use serde::{Deserialize, Serialize}; 5 6#[deserialize_default_on_error] 7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] 8#[serde(default)] 9pub struct NesAppConfig { 10 pub forced_timing_mode: Option<TimingMode>, 11 pub aspect_ratio: NesAspectRatio, 12 pub ntsc_crop_vertical_overscan: bool, 13 pub overscan: Overscan, 14 pub remove_sprite_limit: bool, 15 pub pal_black_border: bool, 16 pub silence_ultrasonic_triangle_output: bool, 17 pub audio_resampler: NesAudioResampler, 18 pub audio_60hz_hack: bool, 19 pub allow_opposing_joypad_directions: bool, 20 pub dma_dummy_joy_reads: bool, 21 pub palette: NesPalette, 22} 23 24impl NesAppConfig { 25 #[must_use] 26 pub fn overscan(&self) -> Overscan { 27 self.overscan 28 } 29} 30 31impl Default for NesAppConfig { 32 fn default() -> Self { 33 Self { 34 forced_timing_mode: None, 35 aspect_ratio: NesAspectRatio::default(), 36 ntsc_crop_vertical_overscan: true, 37 overscan: Overscan::default(), 38 remove_sprite_limit: false, 39 pal_black_border: false, 40 silence_ultrasonic_triangle_output: false, 41 audio_resampler: NesAudioResampler::default(), 42 audio_60hz_hack: false, 43 allow_opposing_joypad_directions: false, 44 dma_dummy_joy_reads: true, 45 palette: NesPalette::default(), 46 } 47 } 48}