input handling
This commit is contained in:
parent
3725382752
commit
b363de3608
|
@ -248,12 +248,12 @@ impl CPU {
|
|||
}
|
||||
|
||||
fn enter_vblank(&mut self, lcdc: &LCDC) {
|
||||
self.memory.update_pressed_keys(self.window.get_keys());
|
||||
self.gpu.mode = DrawMode::VBlank;
|
||||
if lcdc.enable {
|
||||
self.render_window();
|
||||
self.memory.set(0xFF0F, set_bit(self.memory.get(0xFF0F), 0));
|
||||
}
|
||||
// println!("lcdc: {:#?}", lcdc);
|
||||
}
|
||||
|
||||
fn exit_vblank(&mut self) {
|
||||
|
|
|
@ -1,10 +1,84 @@
|
|||
use std::io::{stdout, Write};
|
||||
|
||||
use minifb::Key;
|
||||
|
||||
use crate::verbose_println;
|
||||
|
||||
use super::{clear_bit, get_bit};
|
||||
|
||||
pub(crate) type Address = u16;
|
||||
pub(crate) type ROM = Vec<u8>;
|
||||
|
||||
enum JoypadBank {
|
||||
Action,
|
||||
Direction,
|
||||
}
|
||||
|
||||
struct Joypad {
|
||||
bank_sel: JoypadBank,
|
||||
down: bool,
|
||||
up: bool,
|
||||
left: bool,
|
||||
right: bool,
|
||||
start: bool,
|
||||
select: bool,
|
||||
b: bool,
|
||||
a: bool,
|
||||
}
|
||||
|
||||
impl Joypad {
|
||||
fn as_register(&self) -> u8 {
|
||||
let mut reg = 0xFF;
|
||||
match self.bank_sel {
|
||||
JoypadBank::Action => {
|
||||
if self.start {
|
||||
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.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
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Joypad {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
bank_sel: JoypadBank::Action,
|
||||
down: false,
|
||||
up: false,
|
||||
left: false,
|
||||
right: false,
|
||||
start: false,
|
||||
select: false,
|
||||
b: false,
|
||||
a: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub struct Memory {
|
||||
pub(super) bootrom: ROM,
|
||||
|
@ -20,6 +94,7 @@ pub struct Memory {
|
|||
pub(super) ime_scheduled: u8,
|
||||
pub(super) io: [u8; 76],
|
||||
pub(super) user_mode: bool,
|
||||
joypad: Joypad,
|
||||
}
|
||||
|
||||
impl Memory {
|
||||
|
@ -38,6 +113,7 @@ impl Memory {
|
|||
ime_scheduled: 0x0,
|
||||
io: [0xFF; 76],
|
||||
user_mode: false,
|
||||
joypad: Joypad::default(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,7 +142,7 @@ impl Memory {
|
|||
return self.oam[(address - 0xFE00) as usize];
|
||||
}
|
||||
0xFEA0..0xFF00 => {
|
||||
return 0x0;
|
||||
return 0xFF;
|
||||
}
|
||||
0xFF00..0xFF4C => self.get_io(address),
|
||||
0xFF4C..0xFF80 => {
|
||||
|
@ -133,7 +209,7 @@ impl Memory {
|
|||
|
||||
fn get_io(&self, address: Address) -> u8 {
|
||||
if address == 0xFF00 {
|
||||
return 0xFF;
|
||||
return self.joypad.as_register();
|
||||
}
|
||||
return self.io[(address - 0xFF00) as usize];
|
||||
}
|
||||
|
@ -153,6 +229,12 @@ impl Memory {
|
|||
0xFF04 => self.io[addr_l] = 0,
|
||||
0xFF00 => {
|
||||
// joypad
|
||||
if !get_bit(data, 5) {
|
||||
self.joypad.bank_sel = JoypadBank::Action
|
||||
}
|
||||
if !get_bit(data, 4) {
|
||||
self.joypad.bank_sel = JoypadBank::Direction
|
||||
}
|
||||
}
|
||||
0xFF11 | 0xFF14 | 0xFF16 | 0xFF19 | 0xFF1E | 0xFF23 | 0xFF26 => {
|
||||
// sound
|
||||
|
@ -176,4 +258,15 @@ impl Memory {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn update_pressed_keys(&mut self, keys: Vec<Key>) {
|
||||
self.joypad.down = keys.contains(&Key::Down) || keys.contains(&Key::S);
|
||||
self.joypad.up = keys.contains(&Key::Up) || keys.contains(&Key::W);
|
||||
self.joypad.left = keys.contains(&Key::Left) || keys.contains(&Key::A);
|
||||
self.joypad.right = keys.contains(&Key::Right) || keys.contains(&Key::D);
|
||||
self.joypad.start = keys.contains(&Key::Equal);
|
||||
self.joypad.select = keys.contains(&Key::Minus);
|
||||
self.joypad.a = keys.contains(&Key::Apostrophe);
|
||||
self.joypad.b = keys.contains(&Key::Semicolon);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue