pub struct Pad { down: bool, up: bool, left: bool, right: bool, start: bool, select: bool, b: bool, a: bool, selection: PadSelection, } #[derive(Clone, Copy, PartialEq)] pub enum PadSelection { Action, Direction, } pub enum PadKey { Up, Down, Left, Right, Start, Select, A, B, } impl Pad { pub fn new() -> Self { Self { down: false, up: false, left: false, right: false, start: false, select: false, b: false, a: false, selection: PadSelection::Action, } } pub fn read(&mut self, addr: u16) -> u8 { match addr & 0x00ff { 0x0000 => { let mut value; match self.selection { PadSelection::Action => { value = if self.a { 0x00 } else { 0x01 } | if self.b { 0x00 } else { 0x02 } | if self.select { 0x00 } else { 0x04 } | if self.start { 0x00 } else { 0x08 } } PadSelection::Direction => { value = if self.right { 0x00 } else { 0x01 } | if self.left { 0x00 } else { 0x02 } | if self.up { 0x00 } else { 0x04 } | if self.down { 0x00 } else { 0x08 } } } value |= if self.selection == PadSelection::Direction { 0x10 } else { 0x00 } | if self.selection == PadSelection::Action { 0x20 } else { 0x00 }; value } addr => panic!("Reading from unknown Pad location 0x{:04x}", addr), } } pub fn write(&mut self, addr: u16, value: u8) { match addr & 0x00ff { 0x0000 => { self.selection = if value & 0x10 == 0x00 { PadSelection::Direction } else { PadSelection::Action } } addr => panic!("Writing to unknown Pad location 0x{:04x}", addr), } } }