@@ -53,35 +53,36 @@ void VsControlManager::RemapControllerButtons()
5353 }
5454
5555 VsInputType inputType = EmulationSettings::GetVsInputType ();
56- if (inputType == VsInputType::TypeA) {
57- BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Select, controllers[0 ], StandardController::Buttons::Start);
58- BaseControlDevice::SwapButtons (controllers[1 ], StandardController::Buttons::Select, controllers[1 ], StandardController::Buttons::Start);
59- } else if (inputType == VsInputType::TypeB) {
60- std::swap (controllers[0 ], controllers[1 ]);
61- BaseControlDevice::SwapButtons (controllers[1 ], StandardController::Buttons::Select, controllers[0 ], StandardController::Buttons::Start);
62- BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Select, controllers[1 ], StandardController::Buttons::Start);
63- } else if (inputType == VsInputType::TypeC) {
64- std::swap (controllers[0 ], controllers[1 ]);
65-
66- if (controllers[0 ]->IsPressed (StandardController::Buttons::Start)) {
67- controllers[1 ]->SetBit (StandardController::Buttons::Select);
68- } else {
69- controllers[1 ]->ClearBit (StandardController::Buttons::Select);
70- }
71-
72- controllers[0 ]->ClearBit (StandardController::Buttons::Start);
73- controllers[0 ]->ClearBit (StandardController::Buttons::Select);
74- } else if (inputType == VsInputType::TypeD) {
75- std::swap (controllers[0 ], controllers[1 ]);
76- BaseControlDevice::SwapButtons (controllers[1 ], StandardController::Buttons::Select, controllers[0 ], StandardController::Buttons::Start);
77- BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Select, controllers[1 ], StandardController::Buttons::Start);
78- controllers[0 ]->InvertBit (StandardController::Buttons::Select);
79- controllers[1 ]->InvertBit (StandardController::Buttons::Select);
80- } else if (inputType == VsInputType::TypeE) {
56+ if (inputType == VsInputType::SwapControllers) {
57+ // Swap controllers 1 & 2
58+ ControlDeviceState port1State = controllers[0 ]->GetRawState ();
59+ ControlDeviceState port2State = controllers[1 ]->GetRawState ();
60+ controllers[0 ]->SetRawState (port2State);
61+ controllers[1 ]->SetRawState (port1State);
62+
63+ // But don't swap the start/select buttons
64+ BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Start, controllers[1 ], StandardController::Buttons::Start);
65+ BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Select, controllers[1 ], StandardController::Buttons::Select);
66+ } else if (inputType == VsInputType::SwapAB) {
67+ // Swap buttons P1 A & P2 B (Pinball (Japan))
8168 BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::B, controllers[1 ], StandardController::Buttons::A);
82- BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Select, controllers[0 ], StandardController::Buttons::Start);
83- BaseControlDevice::SwapButtons (controllers[1 ], StandardController::Buttons::Select, controllers[1 ], StandardController::Buttons::Start);
8469 }
70+
71+ // Swap Start/Select for all configurations (makes it more intuitive)
72+ BaseControlDevice::SwapButtons (controllers[0 ], StandardController::Buttons::Start, controllers[0 ], StandardController::Buttons::Select);
73+ BaseControlDevice::SwapButtons (controllers[1 ], StandardController::Buttons::Start, controllers[1 ], StandardController::Buttons::Select);
74+
75+ uint32_t crc = _console->GetMapperInfo ().Hash .PrgCrc32Hash ;
76+ if (crc == 0x99FB3B3B ) {
77+ // Bit 3 of the input status must always be on (Raid on Bungeling Bay protection)
78+ controllers[0 ]->InvertBit (StandardController::Buttons::Start);
79+ controllers[1 ]->InvertBit (StandardController::Buttons::Start);
80+ }
81+ }
82+
83+ uint8_t VsControlManager::GetOpenBusMask (uint8_t port)
84+ {
85+ return 0x00 ;
8586}
8687
8788uint8_t VsControlManager::ReadRAM (uint16_t addr)
@@ -93,7 +94,7 @@ uint8_t VsControlManager::ReadRAM(uint16_t addr)
9394 switch (addr) {
9495 case 0x4016 : {
9596 uint32_t dipSwitches = EmulationSettings::GetDipSwitches ();
96- value = ControlManager::ReadRAM (addr);
97+ value = ControlManager::ReadRAM (addr) & 0x65 ;
9798 value |= ((dipSwitches & 0x01 ) ? 0x08 : 0x00 );
9899 value |= ((dipSwitches & 0x02 ) ? 0x10 : 0x00 );
99100 value |= (_console->IsMaster () ? 0x00 : 0x80 );
@@ -145,10 +146,6 @@ void VsControlManager::WriteRAM(uint16_t addr, uint8_t value)
145146 bool previousState = _refreshState;
146147 _refreshState = (value & 0x01 ) == 0x01 ;
147148
148- if (previousState && !_refreshState) {
149- RemapControllerButtons ();
150- }
151-
152149 if (addr == 0x4016 ) {
153150 _prgChrSelectBit = (value >> 2 ) & 0x01 ;
154151
0 commit comments