input - Add first implementation for joypad class
handling the Joypad register
This commit is contained in:
parent
8d40d491b1
commit
431e7bb9a7
3 changed files with 105 additions and 0 deletions
1
Makeconf
1
Makeconf
|
@ -20,6 +20,7 @@ modules_libemu.a := memory/device.o \
|
||||||
cartridge/cartridge.o \
|
cartridge/cartridge.o \
|
||||||
lcd/lcd.o \
|
lcd/lcd.o \
|
||||||
lcd/palette.o \
|
lcd/palette.o \
|
||||||
|
input/joypad.o \
|
||||||
|
|
||||||
modules_vgbc := main.o libemu.a
|
modules_vgbc := main.o libemu.a
|
||||||
verb_vgbc := link
|
verb_vgbc := link
|
||||||
|
|
64
input/joypad.cpp
Normal file
64
input/joypad.cpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include <input/joypad.h>
|
||||||
|
|
||||||
|
Joypad::Joypad(Cpu& cpu)
|
||||||
|
: cpu(cpu), action_select(false),
|
||||||
|
direction_select(false),
|
||||||
|
keystates{false}
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Joypad::setKeyState(Key k, bool pressed)
|
||||||
|
{
|
||||||
|
bool prevState = keystates[k];
|
||||||
|
keystates[k] = pressed;
|
||||||
|
|
||||||
|
if(!pressed || prevState == pressed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(k)
|
||||||
|
{
|
||||||
|
case A:
|
||||||
|
case B:
|
||||||
|
case Select:
|
||||||
|
case Start:
|
||||||
|
if (action_select)
|
||||||
|
cpu.signalInterrupt(INT_Joypad);
|
||||||
|
break;
|
||||||
|
case Right:
|
||||||
|
case Left:
|
||||||
|
case Up:
|
||||||
|
case Down:
|
||||||
|
if (direction_select)
|
||||||
|
cpu.signalInterrupt(INT_Joypad);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Joypad::write8(u16 /*addr*/, u8 data)
|
||||||
|
{
|
||||||
|
action_select = !(data & P1ActionSelect);
|
||||||
|
direction_select = !(data & P1DirectionSelect);
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 Joypad::read8(u16 /*addr*/)
|
||||||
|
{
|
||||||
|
u8 val = 0x0F;
|
||||||
|
|
||||||
|
if(action_select)
|
||||||
|
val &=
|
||||||
|
(keystates[Start] ? 0 : P1Start) |
|
||||||
|
(keystates[Select] ? 0 : P1Select) |
|
||||||
|
(keystates[B] ? 0 : P1B) |
|
||||||
|
(keystates[A] ? 0 : P1A);
|
||||||
|
|
||||||
|
if(direction_select)
|
||||||
|
val &=
|
||||||
|
(keystates[Down] ? 0 : P1Down) |
|
||||||
|
(keystates[Up] ? 0 : P1Up) |
|
||||||
|
(keystates[Left] ? 0 : P1Left) |
|
||||||
|
(keystates[Right] ? 0 : P1Right);
|
||||||
|
|
||||||
|
val |= (action_select ? 0 : P1ActionSelect);
|
||||||
|
val |= (direction_select ? 0 : P1DirectionSelect);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
40
input/joypad.h
Normal file
40
input/joypad.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory/device.h>
|
||||||
|
#include <cpu/cpu.h>
|
||||||
|
|
||||||
|
class Joypad : public Mem_device {
|
||||||
|
public:
|
||||||
|
enum Key {
|
||||||
|
A,B,Select,Start,
|
||||||
|
Right,Left,Up,Down,
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
Cpu& cpu;
|
||||||
|
|
||||||
|
bool keystates[8];
|
||||||
|
bool action_select;
|
||||||
|
bool direction_select;
|
||||||
|
|
||||||
|
enum P1Reg {
|
||||||
|
P1ActionSelect = 0b00100000,
|
||||||
|
P1DirectionSelect = 0b00010000,
|
||||||
|
P1Down = 0b00001000,
|
||||||
|
P1Start = 0b00001000,
|
||||||
|
P1Up = 0b00000100,
|
||||||
|
P1Select = 0b00000100,
|
||||||
|
P1Left = 0b00000010,
|
||||||
|
P1B = 0b00000010,
|
||||||
|
P1Right = 0b00000001,
|
||||||
|
P1A = 0b00000001,
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
Joypad(Cpu& cpu);
|
||||||
|
|
||||||
|
void setKeyState(Key k, bool pressed);
|
||||||
|
|
||||||
|
virtual void write8(u16 addr, u8 data);
|
||||||
|
virtual u8 read8(u16 addr);
|
||||||
|
};
|
Loading…
Reference in a new issue