#[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
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.p1: ButtonsPlayer 1 ($4016) button state.
p2: ButtonsPlayer 2 ($4017) button state.
p3: ButtonsPlayer 3 (Four Score, multiplexed on $4016) button state.
p4: ButtonsPlayer 4 (Four Score, multiplexed on $4017) button state.
expansion: u8Reserved expansion-port byte (currently always 0).
Implementations§
Source§impl FrameInput
impl FrameInput
Sourcepub const fn new(p1: Buttons, p2: Buttons) -> Self
pub const fn new(p1: Buttons, p2: Buttons) -> Self
Build a two-controller frame (players 3/4 released, no expansion byte).
Sourcepub const fn four_players(
p1: Buttons,
p2: Buttons,
p3: Buttons,
p4: Buttons,
) -> Self
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).
Sourcepub const fn port(&self, port: usize) -> Buttons
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.
Sourcepub const fn port_mut(&mut self, port: usize) -> &mut Buttons
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.
Trait Implementations§
Source§impl Clone for FrameInput
impl Clone for FrameInput
Source§fn clone(&self) -> FrameInput
fn clone(&self) -> FrameInput
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more