mirror of
https://github.com/libretro/Mesen.git
synced 2024-12-13 11:57:09 +00:00
80 lines
1.9 KiB
C++
80 lines
1.9 KiB
C++
#pragma once
|
|
#include "stdafx.h"
|
|
#include "BaseControlDevice.h"
|
|
|
|
class PowerPad : public BaseControlDevice
|
|
{
|
|
private:
|
|
uint8_t _stateBufferL;
|
|
uint8_t _stateBufferH;
|
|
bool _useSideA = false;
|
|
|
|
protected:
|
|
string GetKeyNames() override
|
|
{
|
|
return "123456789ABC";
|
|
}
|
|
|
|
void InternalSetStateFromInput() override
|
|
{
|
|
for(KeyMapping keyMapping : _keyMappings) {
|
|
for(int i = 0; i < 3; i++) {
|
|
for(int j = 0; j < 4; j++) {
|
|
if(_useSideA) {
|
|
//Invert the order of each row
|
|
SetPressedState(i*4+j, keyMapping.PowerPadButtons[i*4+(3-j)]);
|
|
} else {
|
|
SetPressedState(i*4+j, keyMapping.PowerPadButtons[i*4+j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void RefreshStateBuffer() override
|
|
{
|
|
uint8_t pressedKeys[12] = {};
|
|
for(int i = 0; i < 12; i++) {
|
|
pressedKeys[i] |= IsPressed(i) ? 1 : 0;
|
|
}
|
|
|
|
//"Serial data from buttons 2, 1, 5, 9, 6, 10, 11, 7"
|
|
_stateBufferL = pressedKeys[1] | (pressedKeys[0] << 1) | (pressedKeys[4] << 2) | (pressedKeys[8] << 3) | (pressedKeys[5] << 4) | (pressedKeys[9] << 5) | (pressedKeys[10] << 6) | (pressedKeys[6] << 7);
|
|
|
|
//"Serial data from buttons 4, 3, 12, 8 (following 4 bits read as H=1)"
|
|
_stateBufferH = pressedKeys[3] | (pressedKeys[2] << 1) | (pressedKeys[11] << 2) | (pressedKeys[7] << 3) | 0xF0;
|
|
}
|
|
|
|
void StreamState(bool saving) override
|
|
{
|
|
BaseControlDevice::StreamState(saving);
|
|
Stream(_stateBufferL, _stateBufferH);
|
|
}
|
|
|
|
public:
|
|
PowerPad(uint8_t port, KeyMappingSet keyMappings) : BaseControlDevice(port, keyMappings)
|
|
{
|
|
_useSideA = keyMappings.PowerpadUseSideA;
|
|
}
|
|
|
|
uint8_t ReadRAM(uint16_t addr) override
|
|
{
|
|
uint8_t output = 0;
|
|
if(IsCurrentPort(addr)) {
|
|
output = ((_stateBufferH & 0x01) << 4) | ((_stateBufferL & 0x01) << 3);
|
|
_stateBufferL >>= 1;
|
|
_stateBufferH >>= 1;
|
|
|
|
_stateBufferL |= 0x80;
|
|
_stateBufferH |= 0x80;
|
|
|
|
StrobeProcessRead();
|
|
}
|
|
return output;
|
|
}
|
|
|
|
void WriteRAM(uint16_t addr, uint8_t value) override
|
|
{
|
|
StrobeProcessWrite(value);
|
|
}
|
|
}; |