// (c) 2023 John A. Breaux // This code is licensed under MIT license (see LICENSE for details) //! Selects the memory behavior of the [super::CPU] //! //! Since [Quirks] implements [`From`], //! this can be used to select the appropriate quirk-set use super::Quirks; use crate::error::Error; use std::str::FromStr; /// Selects the memory behavior of the interpreter #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Mode { /// VIP emulation mode #[default] Chip8, /// Super Chip emulation mode SChip, /// XO-Chip emulation mode XOChip, } impl FromStr for Mode { type Err = Error; fn from_str(s: &str) -> std::result::Result { match s.to_lowercase().as_str() { "chip" | "chip8" | "chip-8" => Ok(Mode::Chip8), "s" | "schip" | "superchip" | "super chip" => Ok(Mode::SChip), "xo" | "xochip" | "xo-chip" => Ok(Mode::XOChip), _ => Err(Error::InvalidMode { mode: s.into() }), } } } impl AsRef for Mode { fn as_ref(&self) -> &str { match self { Mode::Chip8 => "Chip-8", Mode::SChip => "Super Chip", Mode::XOChip => "XO-Chip", } } } impl ToString for Mode { fn to_string(&self) -> String { self.as_ref().into() } } impl From for Mode { fn from(value: usize) -> Self { match value { 0 => Self::Chip8, 1 => Self::SChip, 2 => Self::XOChip, _ => Self::Chip8, } } } impl From for Quirks { fn from(value: Mode) -> Self { match value { Mode::Chip8 => false.into(), Mode::SChip => true.into(), Mode::XOChip => Self { bin_ops: true, shift: false, draw_wait: true, screen_wrap: true, dma_inc: false, stupid_jumps: false, }, } } }