Mesen-X/Core/JissenMahjongController.h
Sour c3b1b3effc Input: Reading the controller while the strobe signal is high should always return the state of button A
Fixed an edge case that occurred when setting strobe bit after reading $4016 once and then reading $4016 again
2019-12-23 20:47:10 -05:00

98 lines
No EOL
2.8 KiB
C++

#pragma once
#include "stdafx.h"
#include "BaseControlDevice.h"
class JissenMahjongController : public BaseControlDevice
{
private:
uint8_t _row = 0;
uint32_t _stateBuffer = 0;
protected:
enum Buttons { A = 0, B, C, D, E, F, G, H, I, J, K, L, M, N, Select, Start, Kan, Pon, Chii, Riichi, Ron };
string GetKeyNames() override
{
return "ABCDEFGHIJKLMNSTkpcir";
}
void InternalSetStateFromInput() override
{
for(KeyMapping keyMapping : _keyMappings) {
for(int i = 0; i < 21; i++) {
SetPressedState(i, keyMapping.JissenMahjongButtons[i]);
}
}
}
void StreamState(bool saving) override
{
BaseControlDevice::StreamState(saving);
Stream(_row, _stateBuffer);
}
public:
JissenMahjongController(shared_ptr<Console> console, KeyMappingSet keyMappings) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort, keyMappings)
{
}
uint8_t ReadRAM(uint16_t addr) override
{
if(addr == 0x4017) {
StrobeProcessRead();
uint8_t value = (_stateBuffer & 0x01) << 1;
_stateBuffer >>= 1;
return value;
}
return 0;
}
void RefreshStateBuffer() override
{
switch(_row) {
default:
case 0:
_stateBuffer = 0;
break;
case 1:
_stateBuffer =
(IsPressed(JissenMahjongController::Buttons::N) ? 0x04 : 0) |
(IsPressed(JissenMahjongController::Buttons::M) ? 0x08 : 0) |
(IsPressed(JissenMahjongController::Buttons::L) ? 0x10 : 0) |
(IsPressed(JissenMahjongController::Buttons::K) ? 0x20 : 0) |
(IsPressed(JissenMahjongController::Buttons::J) ? 0x40 : 0) |
(IsPressed(JissenMahjongController::Buttons::I) ? 0x80 : 0);
break;
case 2:
_stateBuffer =
(IsPressed(JissenMahjongController::Buttons::H) ? 0x01 : 0) |
(IsPressed(JissenMahjongController::Buttons::G) ? 0x02 : 0) |
(IsPressed(JissenMahjongController::Buttons::F) ? 0x04 : 0) |
(IsPressed(JissenMahjongController::Buttons::E) ? 0x08 : 0) |
(IsPressed(JissenMahjongController::Buttons::D) ? 0x10 : 0) |
(IsPressed(JissenMahjongController::Buttons::C) ? 0x20 : 0) |
(IsPressed(JissenMahjongController::Buttons::B) ? 0x40 : 0) |
(IsPressed(JissenMahjongController::Buttons::A) ? 0x80 : 0);
break;
case 3:
_stateBuffer =
(IsPressed(JissenMahjongController::Buttons::Ron) ? 0x02 : 0) |
(IsPressed(JissenMahjongController::Buttons::Riichi) ? 0x04 : 0) |
(IsPressed(JissenMahjongController::Buttons::Chii) ? 0x08 : 0) |
(IsPressed(JissenMahjongController::Buttons::Pon) ? 0x10 : 0) |
(IsPressed(JissenMahjongController::Buttons::Kan) ? 0x20 : 0) |
(IsPressed(JissenMahjongController::Buttons::Start) ? 0x40 : 0) |
(IsPressed(JissenMahjongController::Buttons::Select) ? 0x80 : 0);
break;
}
}
void WriteRAM(uint16_t addr, uint8_t value) override
{
_row = (value & 0x6) >> 1;
StrobeProcessWrite(value);
}
};