summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2026-10-02 18:24:08 -0500
committerGitHub <noreply@github.com>2026-10-02 18:24:08 -0500
commit8a40a9c01d01e768d37e6296b1bd1c836af1a264 (patch)
tree0f2ba07241599366eae8164a069f65b866110d23 /Source/Core
parenta475aba718746e7656e2e6b6e047dc98a4d05879 (diff)
parent85a074056175ad463688b300d2f31f86ebbaef0d (diff)
Merge pull request #14897 from jordan-woyak/gba-button-bits
GBAPadEmu: Make GBAPad::GetInput use actual GBA button values.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/GBAPadEmu.cpp20
-rw-r--r--Source/Core/Core/HW/GBAPadEmu.h15
-rw-r--r--Source/Core/Core/HW/SI/SI_DeviceGBAEmu.cpp25
3 files changed, 33 insertions, 27 deletions
diff --git a/Source/Core/Core/HW/GBAPadEmu.cpp b/Source/Core/Core/HW/GBAPadEmu.cpp
index fd68bc9a1d..2a84a5345b 100644
--- a/Source/Core/Core/HW/GBAPadEmu.cpp
+++ b/Source/Core/Core/HW/GBAPadEmu.cpp
@@ -10,12 +10,6 @@
#include "InputCommon/ControllerEmu/ControlGroup/Buttons.h"
#include "InputCommon/GCPadStatus.h"
-static const u16 dpad_bitmasks[] = {PAD_BUTTON_UP, PAD_BUTTON_DOWN, PAD_BUTTON_LEFT,
- PAD_BUTTON_RIGHT};
-
-static const u16 button_bitmasks[] = {PAD_BUTTON_B, PAD_BUTTON_A, PAD_TRIGGER_L,
- PAD_TRIGGER_R, PAD_TRIGGER_Z, PAD_BUTTON_START};
-
GBAPad::GBAPad(const unsigned int index) : m_reset_pending(false), m_index(index)
{
using Translatability = ControllerEmu::Translatability;
@@ -67,15 +61,25 @@ GCPadStatus GBAPad::GetInput()
const auto lock = GetStateLock();
GCPadStatus pad = {};
+ static constexpr u16 dpad_bitmasks[] = {
+ GBA_BUTTON_UP,
+ GBA_BUTTON_DOWN,
+ GBA_BUTTON_LEFT,
+ GBA_BUTTON_RIGHT,
+ };
+
+ static constexpr u16 button_bitmasks[] = {
+ GBA_BUTTON_B, GBA_BUTTON_A, GBA_BUTTON_L, GBA_BUTTON_R, GBA_BUTTON_SELECT, GBA_BUTTON_START,
+ };
+
// Buttons
m_buttons->GetState(&pad.button, button_bitmasks, m_input_override_function);
// DPad
m_dpad->GetState(&pad.button, dpad_bitmasks, m_input_override_function);
- // Use X button as a reset signal
if (m_reset_pending)
- pad.button |= PAD_BUTTON_X;
+ pad.button |= PAD_STATUS_RESET_SIGNAL;
m_reset_pending = false;
return pad;
diff --git a/Source/Core/Core/HW/GBAPadEmu.h b/Source/Core/Core/HW/GBAPadEmu.h
index c9c38f1e5a..9fc7710fc2 100644
--- a/Source/Core/Core/HW/GBAPadEmu.h
+++ b/Source/Core/Core/HW/GBAPadEmu.h
@@ -23,6 +23,21 @@ enum class GBAPadGroup
class GBAPad : public ControllerEmu::EmulatedController
{
public:
+ static constexpr u16 GBA_BUTTON_A = 1u << 0;
+ static constexpr u16 GBA_BUTTON_B = 1u << 1;
+ static constexpr u16 GBA_BUTTON_SELECT = 1u << 2;
+ static constexpr u16 GBA_BUTTON_START = 1u << 3;
+ static constexpr u16 GBA_BUTTON_RIGHT = 1u << 4;
+ static constexpr u16 GBA_BUTTON_LEFT = 1u << 5;
+ static constexpr u16 GBA_BUTTON_UP = 1u << 6;
+ static constexpr u16 GBA_BUTTON_DOWN = 1u << 7;
+ static constexpr u16 GBA_BUTTON_R = 1u << 8;
+ static constexpr u16 GBA_BUTTON_L = 1u << 9;
+
+ static constexpr u16 GBA_ALL_BUTTONS = (1u << 10) - 1;
+
+ static constexpr u16 PAD_STATUS_RESET_SIGNAL = 1u << 10;
+
explicit GBAPad(unsigned int index);
GCPadStatus GetInput();
void SetReset(bool reset);
diff --git a/Source/Core/Core/HW/SI/SI_DeviceGBAEmu.cpp b/Source/Core/Core/HW/SI/SI_DeviceGBAEmu.cpp
index 36ccc15bc0..a7c342e1b4 100644
--- a/Source/Core/Core/HW/SI/SI_DeviceGBAEmu.cpp
+++ b/Source/Core/Core/HW/SI/SI_DeviceGBAEmu.cpp
@@ -14,6 +14,7 @@
#include "Core/CoreTiming.h"
#include "Core/HW/GBACore.h"
#include "Core/HW/GBAPad.h"
+#include "Core/HW/GBAPadEmu.h"
#include "Core/HW/SI/SI.h"
#include "Core/HW/SI/SI_DeviceGCController.h"
#include "Core/HW/SystemTimers.h"
@@ -128,25 +129,11 @@ DataResponse CSIDevice_GBAEmu::GetData(u32& hi, u32& low)
SerialInterface::CSIDevice_GCController::HandleMoviePadStatus(m_system.GetMovie(),
m_device_number, &pad_status);
- static constexpr std::array<PadButton, 10> buttons_map = {
- PadButton::PAD_BUTTON_A, // A
- PadButton::PAD_BUTTON_B, // B
- PadButton::PAD_TRIGGER_Z, // Select
- PadButton::PAD_BUTTON_START, // Start
- PadButton::PAD_BUTTON_RIGHT, // Right
- PadButton::PAD_BUTTON_LEFT, // Left
- PadButton::PAD_BUTTON_UP, // Up
- PadButton::PAD_BUTTON_DOWN, // Down
- PadButton::PAD_TRIGGER_R, // R
- PadButton::PAD_TRIGGER_L, // L
- };
-
- m_keys = 0;
- for (size_t i = 0; i < buttons_map.size(); ++i)
- m_keys |= static_cast<u16>(static_cast<bool>((pad_status.button & buttons_map[i]))) << i;
-
- // Use X button as a reset signal for NetPlay/Movies
- if (pad_status.button & PadButton::PAD_BUTTON_X)
+ // Note: The misused GCPadStatus contains GBA button values.
+ m_keys = pad_status.button & GBAPad::GBA_ALL_BUTTONS;
+
+ // A reset signal for NetPlay/Movies
+ if (pad_status.button & GBAPad::PAD_STATUS_RESET_SIGNAL)
m_core->Reset();
return DataResponse::NoData;