98 lines
2.7 KiB
C
98 lines
2.7 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(KeyMappingSet keyMappings) : BaseControlDevice(BaseControlDevice::ExpDevicePort, keyMappings)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
uint8_t ReadRAM(uint16_t addr) override
|
||
|
{
|
||
|
if(addr == 0x4017) {
|
||
|
uint8_t value = (_stateBuffer & 0x01) << 1;
|
||
|
_stateBuffer >>= 1;
|
||
|
StrobeProcessRead();
|
||
|
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);
|
||
|
}
|
||
|
};
|