Skip to main content

FrameInput

Struct FrameInput 

Source
#[non_exhaustive]
pub struct FrameInput { pub p1: Buttons, pub p2: Buttons, pub p3: Buttons, pub p4: Buttons, pub expansion: u8, }
Expand description

Per-frame controller input: four controller ports plus an expansion byte.

Each port is a Buttons value. Bit layout matches FCEUX .fm2 (bit0=A .. bit7=Right), which is exactly Buttons::bits.

§Players 3 and 4 (v2.9.8)

p3 / p4 are the Four Score’s players, polled through $4016 / $4017 only while the adapter is plugged in (which the movie’s HardwareOptions::four_score records). Until v2.9.8 the struct held two ports, so a four-player recording captured half of what drove it and the .fm2 importer dropped pads 3 and 4.

§Why #[non_exhaustive]

Adding p3 / p4 broke every caller that built the struct by literal, which is why the change waited for a breaking release. The next field is foreseeable – an expansion-port device byte, a soft-reset command – and .rnm already stores its per-frame width so the FORMAT side of such a field is additive; #[non_exhaustive] makes the API side additive too. Outside this crate a frame is built with Self::new, Self::four_players or Default and then edited through its public fields, all of which keep compiling when a field is added.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§p1: Buttons

Player 1 ($4016) button state.

§p2: Buttons

Player 2 ($4017) button state.

§p3: Buttons

Player 3 (Four Score, multiplexed on $4016) button state.

§p4: Buttons

Player 4 (Four Score, multiplexed on $4017) button state.

§expansion: u8

Reserved expansion-port byte (currently always 0).

Implementations§

Source§

impl FrameInput

Source

pub const fn new(p1: Buttons, p2: Buttons) -> Self

Build a two-controller frame (players 3/4 released, no expansion byte).

Source

pub const fn four_players( p1: Buttons, p2: Buttons, p3: Buttons, p4: Buttons, ) -> Self

v2.9.8 — build a four-controller frame (no expansion byte).

Source

pub const fn port(&self, port: usize) -> Buttons

v2.9.8 — the buttons on controller port (0-3 = players 1-4).

§Panics

Panics if port is not in 0..=3, matching Nes::set_buttons.

Source

pub const fn port_mut(&mut self, port: usize) -> &mut Buttons

v2.9.8 — mutable access to controller port (0-3 = players 1-4).

§Panics

Panics if port is not in 0..=3.

Source

pub const fn apply_to(&self, nes: &mut Nes)

v2.9.8 — drive all four controller ports of nes from this frame.

Ports 2 and 3 are only polled while the Four Score is plugged in, so setting them on a two-pad machine changes nothing it reads.

Source

pub const fn held_on(nes: &Nes) -> Self

v2.9.8 — the input currently held on all four ports of nes.

Trait Implementations§

Source§

impl Clone for FrameInput

Source§

fn clone(&self) -> FrameInput

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for FrameInput

Source§

impl Debug for FrameInput

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FrameInput

Source§

fn default() -> FrameInput

Returns the “default value” for a type. Read more
Source§

impl Eq for FrameInput

Source§

impl PartialEq for FrameInput

Source§

fn eq(&self, other: &FrameInput) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for FrameInput

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.