mirror of https://github.com/bsnes-emu/bsnes.git
71 lines
2.5 KiB
C++
71 lines
2.5 KiB
C++
|
SuperMultitap::SuperMultitap(bool port) : Controller(port) {
|
||
|
latched = 0;
|
||
|
counter1 = 0;
|
||
|
counter2 = 0;
|
||
|
}
|
||
|
|
||
|
auto SuperMultitap::data() -> uint2 {
|
||
|
if(latched) return 2; //device detection
|
||
|
uint counter, a, b;
|
||
|
|
||
|
if(iobit()) {
|
||
|
counter = counter1;
|
||
|
if(counter >= 16) return 3;
|
||
|
counter1++;
|
||
|
if(counter >= 12) return 0;
|
||
|
a = 0; //controller 2
|
||
|
b = 1; //controller 3
|
||
|
} else {
|
||
|
counter = counter2;
|
||
|
if(counter >= 16) return 3;
|
||
|
counter2++;
|
||
|
if(counter >= 12) return 0;
|
||
|
a = 2; //controller 4
|
||
|
b = 3; //controller 5
|
||
|
}
|
||
|
|
||
|
auto& A = gamepads[a];
|
||
|
auto& B = gamepads[b];
|
||
|
|
||
|
switch(counter) {
|
||
|
case 0: return A.b << 0 | B.b << 1;
|
||
|
case 1: return A.y << 0 | B.y << 1;
|
||
|
case 2: return A.select << 0 | B.select << 1;
|
||
|
case 3: return A.start << 0 | B.start << 1;
|
||
|
case 4: return (A.up & !A.down) << 0 | (B.up & !B.down) << 1;
|
||
|
case 5: return (A.down & !A.up) << 0 | (B.down & !B.up) << 1;
|
||
|
case 6: return (A.left & !A.right) << 0 | (B.left & !B.right) << 1;
|
||
|
case 7: return (A.right & !A.left) << 0 | (B.right & !B.left) << 1;
|
||
|
case 8: return A.a << 0 | B.a << 1;
|
||
|
case 9: return A.x << 0 | B.x << 1;
|
||
|
case 10: return A.l << 0 | B.l << 1;
|
||
|
case 11: return A.r << 0 | B.r << 1;
|
||
|
}
|
||
|
unreachable;
|
||
|
}
|
||
|
|
||
|
auto SuperMultitap::latch(bool data) -> void {
|
||
|
if(latched == data) return;
|
||
|
latched = data;
|
||
|
counter1 = 0;
|
||
|
counter2 = 0;
|
||
|
|
||
|
if(latched == 0) {
|
||
|
for(uint id : range(4)) {
|
||
|
auto& gamepad = gamepads[id];
|
||
|
gamepad.b = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + B);
|
||
|
gamepad.y = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Y);
|
||
|
gamepad.select = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Select);
|
||
|
gamepad.start = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Start);
|
||
|
gamepad.up = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Up);
|
||
|
gamepad.down = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Down);
|
||
|
gamepad.left = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Left);
|
||
|
gamepad.right = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + Right);
|
||
|
gamepad.a = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + A);
|
||
|
gamepad.x = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + X);
|
||
|
gamepad.l = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + L);
|
||
|
gamepad.r = interface->inputPoll(port, ID::Device::SuperMultitap, id * 12 + R);
|
||
|
}
|
||
|
}
|
||
|
}
|