joypad: action and direction not mutually exclusive
This commit is contained in:
parent
5b353364cd
commit
8e910cfec8
|
@ -2,15 +2,10 @@ use crate::util::{clear_bit, get_bit};
|
||||||
use gilrs::{Button, ConnectedGamepadsIterator};
|
use gilrs::{Button, ConnectedGamepadsIterator};
|
||||||
use minifb::Key;
|
use minifb::Key;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
||||||
enum JoypadBank {
|
|
||||||
Action,
|
|
||||||
Direction,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub struct Joypad {
|
pub struct Joypad {
|
||||||
bank_sel: JoypadBank,
|
sel_action: bool,
|
||||||
|
sel_direction: bool,
|
||||||
down: bool,
|
down: bool,
|
||||||
up: bool,
|
up: bool,
|
||||||
left: bool,
|
left: bool,
|
||||||
|
@ -24,48 +19,42 @@ pub struct Joypad {
|
||||||
impl Joypad {
|
impl Joypad {
|
||||||
pub fn as_register(&self) -> u8 {
|
pub fn as_register(&self) -> u8 {
|
||||||
let mut reg = 0xFF;
|
let mut reg = 0xFF;
|
||||||
match self.bank_sel {
|
if self.sel_action {
|
||||||
JoypadBank::Action => {
|
reg = clear_bit(reg, 5);
|
||||||
reg = clear_bit(reg, 5);
|
if self.start {
|
||||||
if self.start {
|
reg = clear_bit(reg, 3);
|
||||||
reg = clear_bit(reg, 3);
|
|
||||||
}
|
|
||||||
if self.select {
|
|
||||||
reg = clear_bit(reg, 2);
|
|
||||||
}
|
|
||||||
if self.b {
|
|
||||||
reg = clear_bit(reg, 1);
|
|
||||||
}
|
|
||||||
if self.a {
|
|
||||||
reg = clear_bit(reg, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
JoypadBank::Direction => {
|
if self.select {
|
||||||
reg = clear_bit(reg, 4);
|
reg = clear_bit(reg, 2);
|
||||||
if self.down {
|
}
|
||||||
reg = clear_bit(reg, 3);
|
if self.b {
|
||||||
}
|
reg = clear_bit(reg, 1);
|
||||||
if self.up {
|
}
|
||||||
reg = clear_bit(reg, 2);
|
if self.a {
|
||||||
}
|
reg = clear_bit(reg, 0);
|
||||||
if self.left {
|
}
|
||||||
reg = clear_bit(reg, 1);
|
}
|
||||||
}
|
if self.sel_direction {
|
||||||
if self.right {
|
reg = clear_bit(reg, 4);
|
||||||
reg = clear_bit(reg, 0);
|
if self.down {
|
||||||
}
|
reg = clear_bit(reg, 3);
|
||||||
|
}
|
||||||
|
if self.up {
|
||||||
|
reg = clear_bit(reg, 2);
|
||||||
|
}
|
||||||
|
if self.left {
|
||||||
|
reg = clear_bit(reg, 1);
|
||||||
|
}
|
||||||
|
if self.right {
|
||||||
|
reg = clear_bit(reg, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
reg
|
reg
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mmio_write(&mut self, data: u8) {
|
pub fn mmio_write(&mut self, data: u8) {
|
||||||
if !get_bit(data, 5) {
|
self.sel_action = !get_bit(data, 5);
|
||||||
self.bank_sel = JoypadBank::Action;
|
self.sel_direction = !get_bit(data, 4);
|
||||||
}
|
|
||||||
if !get_bit(data, 4) {
|
|
||||||
self.bank_sel = JoypadBank::Direction;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_pressed_keys(
|
pub fn update_pressed_keys(
|
||||||
|
@ -75,7 +64,8 @@ impl Joypad {
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let old = *self;
|
let old = *self;
|
||||||
*self = Joypad {
|
*self = Joypad {
|
||||||
bank_sel: self.bank_sel,
|
sel_action: self.sel_action,
|
||||||
|
sel_direction: self.sel_direction,
|
||||||
down: false,
|
down: false,
|
||||||
up: false,
|
up: false,
|
||||||
left: false,
|
left: false,
|
||||||
|
@ -110,7 +100,8 @@ impl Joypad {
|
||||||
impl Default for Joypad {
|
impl Default for Joypad {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
bank_sel: JoypadBank::Action,
|
sel_action: true,
|
||||||
|
sel_direction: false,
|
||||||
down: false,
|
down: false,
|
||||||
up: false,
|
up: false,
|
||||||
left: false,
|
left: false,
|
||||||
|
|
Loading…
Reference in a new issue