Use struct bitfields for pad buttons, matching several functions

This commit is contained in:
LagoLunatic
2023-11-26 17:43:39 -05:00
parent 9a858fd066
commit da7b41ba49
8 changed files with 114 additions and 99 deletions
+7 -1
View File
@@ -82,6 +82,8 @@ public:
u32 getButton() const { return mButton.mButton; }
u32 getTrigger() const { return mButton.mTrigger; }
u32 getRelease() const { return mButton.mRelease; }
u32 getRepeat() const { return mButton.mRepeat; }
f32 getMainStickX() const { return mMainStick.mPosX; }
f32 getMainStickY() const { return mMainStick.mPosY; }
@@ -124,7 +126,7 @@ public:
void stopMotor() { mRumble.stopMotor(mPortNum); }
void stopMotorHard() { mRumble.stopMotorHard(mPortNum); }
static PADStatus & getPortStatus(u32 port) { return mPadStatus[port]; }
static PADStatus & getPortStatus(EPadPort port) { return mPadStatus[port]; }
struct CButton {
CButton() { clear(); }
@@ -221,6 +223,10 @@ public:
mRumble.startPatternedRumble(param_2, rumble, param_4);
}
// TODO:
void isResetOccurred(int*) {}
void suppressPadReset(u32) {}
/* 0x18 */ CButton mButton;
/* 0x48 */ CStick mMainStick;
/* 0x58 */ CStick mSubStick;
@@ -3,6 +3,22 @@
#include "dolphin/types.h"
// made up name
struct controller_pad_buttons {
bool left : 1;
bool right : 1;
bool down : 1;
bool up : 1;
bool z : 1;
bool r : 1;
bool l : 1;
bool a : 1;
bool b : 1;
bool x : 1;
bool y : 1;
bool start : 1;
};
struct interface_of_controller_pad {
/* 0x00 */ f32 mMainStickPosX;
/* 0x04 */ f32 mMainStickPosY;
@@ -20,10 +36,8 @@ struct interface_of_controller_pad {
/* 0x24 */ f32 mAnalogB;
/* 0x28 */ f32 mTriggerLeft;
/* 0x2C */ f32 mTriggerRight;
/* 0x30 */ u8 mButtonHold0;
/* 0x31 */ u8 mButtonHold1;
/* 0x32 */ u8 mButtonTrig0;
/* 0x33 */ u8 mButtonTrig1;
/* 0x30 */ controller_pad_buttons mButtonHold;
/* 0x32 */ controller_pad_buttons mButtonTrig;
/* 0x34 */ s8 mGamepadErrorFlags;
/* 0x35 */ u8 mHoldLockL;
/* 0x36 */ u8 mTrigLockL;
+11 -2
View File
@@ -97,7 +97,16 @@ public:
struct daAgb_GbaFlg {
/* 0x0 */ u16 field_0x0;
/* 0x2 */ u8 field_0x2;
/* 0x2 */ struct {
u8 m7 : 1;
u8 m6 : 1;
u8 m5 : 1;
u8 m4 : 1;
u8 m3 : 1;
u8 m2 : 1;
u8 m1 : 1;
u8 m0 : 1;
} field_0x2;
/* 0x3 */ u8 field_0x3;
/* 0x4 */ u16 field_0x4;
/* 0x6 */ u16 field_0x6;
@@ -173,7 +182,7 @@ public:
/* 0x650 */ u32 field_0x650;
/* 0x654 */ int field_0x654;
/* 0x658 */ u16 field_0x658;
/* 0x65A */ u16 field_0x65a;
/* 0x65A */ u16 mPrevButtons;
/* 0x65C */ u16 field_0x65c;
/* 0x65E */ u16 field_0x65e;
/* 0x660 */ u16 mDenyMessage;
+1 -1
View File
@@ -314,7 +314,7 @@ public:
void getStickAngY(int);
void calcStickPos(s16, cXyz*);
BOOL flyCheck();
BOOL mirrorCancelCheck();
bool mirrorCancelCheck();
void setWingEmitter();
void setHane02Emitter();
void deleteHane02Emitter();
+24 -24
View File
@@ -7,31 +7,31 @@
extern JUTGamePad* g_mDoCPd_gamePad[4];
extern interface_of_controller_pad g_mDoCPd_cpadInfo[4];
#define CPad_CHECK_HOLD_A(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold0 & 1)
#define CPad_CHECK_HOLD_B(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold1 >> 7) & 1)
#define CPad_CHECK_HOLD_X(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold1 >> 6) & 1)
#define CPad_CHECK_HOLD_Y(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold1 >> 5) & 1)
#define CPad_CHECK_HOLD_Z(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 3) & 1)
#define CPad_CHECK_HOLD_START(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold1 >> 4) & 1)
#define CPad_CHECK_HOLD_L(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 1) & 1)
#define CPad_CHECK_HOLD_R(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 2) & 1)
#define CPad_CHECK_HOLD_UP(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 4) & 1)
#define CPad_CHECK_HOLD_DOWN(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 5) & 1)
#define CPad_CHECK_HOLD_RIGHT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 6) & 1)
#define CPad_CHECK_HOLD_LEFT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonHold0 >> 7) & 1)
#define CPad_CHECK_HOLD_A(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.a)
#define CPad_CHECK_HOLD_B(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.b)
#define CPad_CHECK_HOLD_X(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.x)
#define CPad_CHECK_HOLD_Y(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.y)
#define CPad_CHECK_HOLD_Z(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.z)
#define CPad_CHECK_HOLD_START(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.start)
#define CPad_CHECK_HOLD_L(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.l)
#define CPad_CHECK_HOLD_R(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.r)
#define CPad_CHECK_HOLD_UP(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.up)
#define CPad_CHECK_HOLD_DOWN(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.down)
#define CPad_CHECK_HOLD_RIGHT(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.right)
#define CPad_CHECK_HOLD_LEFT(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonHold.left)
#define CPad_CHECK_TRIG_A(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig0 & 1)
#define CPad_CHECK_TRIG_B(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig1 >> 7) & 1)
#define CPad_CHECK_TRIG_X(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig1 >> 6) & 1)
#define CPad_CHECK_TRIG_Y(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig1 >> 5) & 1)
#define CPad_CHECK_TRIG_Z(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 3) & 1)
#define CPad_CHECK_TRIG_START(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig1 >> 4) & 1)
#define CPad_CHECK_TRIG_L(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 1) & 1)
#define CPad_CHECK_TRIG_R(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 2) & 1)
#define CPad_CHECK_TRIG_UP(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 4) & 1)
#define CPad_CHECK_TRIG_DOWN(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 5) & 1)
#define CPad_CHECK_TRIG_RIGHT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 6) & 1)
#define CPad_CHECK_TRIG_LEFT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 7) & 1)
#define CPad_CHECK_TRIG_A(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.a)
#define CPad_CHECK_TRIG_B(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.b)
#define CPad_CHECK_TRIG_X(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.x)
#define CPad_CHECK_TRIG_Y(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.y)
#define CPad_CHECK_TRIG_Z(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.z)
#define CPad_CHECK_TRIG_START(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.start)
#define CPad_CHECK_TRIG_L(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.l)
#define CPad_CHECK_TRIG_R(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.r)
#define CPad_CHECK_TRIG_UP(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.up)
#define CPad_CHECK_TRIG_DOWN(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.down)
#define CPad_CHECK_TRIG_RIGHT(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.right)
#define CPad_CHECK_TRIG_LEFT(padNo) (g_mDoCPd_cpadInfo[padNo].mButtonTrig.left)
int mDoCPd_Create();
int mDoCPd_Read();
+26 -33
View File
@@ -557,58 +557,51 @@ bool daAgb_c::FlashCheck() {
return false;
}
#define MASK_INSERT_BUTTON(field, value, fieldshift, valueshift) \
temp = (bool)(((value) & (1 << valueshift))); \
(field) = ((temp << fieldshift) & (1 << fieldshift)) | ((field) & ~(1 << fieldshift))
/* 800D0734-800D0978 .text FlagsRecv__7daAgb_cFv */
void daAgb_c::FlagsRecv() {
// Nonmatching - regalloc and a couple rlwinms
interface_of_controller_pad* pad_p = &g_mDoCPd_cpadInfo[mDoGaC_getPortNo()];
u32 temp_r3 = BigLittleChange(mGbaFlg.field_0x0);
u32 temp_r0 = temp_r3 >> 0x10U;
BOOL temp;
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 4, 0x16);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 5, 0x17);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 7, 0x15);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 6, 0x14);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 0, 0x10);
MASK_INSERT_BUTTON(pad_p->mButtonHold1, temp_r3, 7, 0x11);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 2, 0x18);
MASK_INSERT_BUTTON(pad_p->mButtonHold0, temp_r3, 1, 0x19);
MASK_INSERT_BUTTON(pad_p->mButtonHold1, temp_r3, 4, 0x13);
temp = !!temp;
u16 buttons = temp_r3 >> 0x10U;
pad_p->mButtonHold.up = buttons & 0x0040;
pad_p->mButtonHold.down = buttons & 0x0080;
pad_p->mButtonHold.left = buttons & 0x0020;
pad_p->mButtonHold.right = buttons & 0x0010;
pad_p->mButtonHold.a = buttons & 0x0001;
pad_p->mButtonHold.b = buttons & 0x0002;
pad_p->mButtonHold.r = buttons & 0x0100;
pad_p->mButtonHold.l = buttons & 0x0200;
pad_p->mButtonHold.start = buttons & 0x0008;
u32 temp_r5 = temp_r0 & (temp_r0 ^ field_0x65a);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 4, 0x06);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 5, 0x07);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 7, 0x05);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 6, 0x04);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 0, 0x00);
MASK_INSERT_BUTTON(pad_p->mButtonTrig1, temp_r5, 7, 0x01);
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r5, 2, 0x08);
u16 temp_r6 = temp_r5 & 0xFFFF;
MASK_INSERT_BUTTON(pad_p->mButtonTrig0, temp_r6, 1, 0x09);
MASK_INSERT_BUTTON(pad_p->mButtonTrig1, temp_r6, 4, 0x03);
// Buttons just pressed this frame
u16 triggeredButtons = buttons & (buttons ^ mPrevButtons);
pad_p->mButtonTrig.up = triggeredButtons & 0x0040;
pad_p->mButtonTrig.down = triggeredButtons & 0x0080;
pad_p->mButtonTrig.left = triggeredButtons & 0x0020;
pad_p->mButtonTrig.right = triggeredButtons & 0x0010;
pad_p->mButtonTrig.a = triggeredButtons & 0x0001;
pad_p->mButtonTrig.b = triggeredButtons & 0x0002;
pad_p->mButtonTrig.r = triggeredButtons & 0x0100;
pad_p->mButtonTrig.l = triggeredButtons & 0x0200;
pad_p->mButtonTrig.start = triggeredButtons & 0x0008;
g_mDoCPd_cpadInfo[mDoGaC_getPortNo()].mGamepadErrorFlags = 0;
field_0x65a = temp_r0;
mPrevButtons = buttons;
field_0x673 = mGbaFlg.field_0x3 != 0;
field_0x630 = BigLittleChange(mGbaFlg.field_0x4) >> 0x10;
field_0x632 = BigLittleChange(mGbaFlg.field_0x6) >> 0x10;
field_0x67a = (mGbaFlg.field_0x2 >> 2);
field_0x67a = mGbaFlg.field_0x2.m2;
if (!dComIfGs_isEventBit(0x1708) && ((mGbaFlg.field_0x2 >> 3) & 1)) {
if (!dComIfGs_isEventBit(0x1708) && mGbaFlg.field_0x2.m3) {
dComIfGs_onEventBit(0x1708);
}
if (!dComIfGs_isEventBit(0x1A10) && ((mGbaFlg.field_0x2 >> 4) & 1)) {
if (!dComIfGs_isEventBit(0x1A10) && mGbaFlg.field_0x2.m4) {
dComIfGs_onEventBit(0x1A10);
}
if (!dComIfGs_isEventBit(0x1A08) && ((mGbaFlg.field_0x2 >> 5) & 1)) {
if (!dComIfGs_isEventBit(0x1A08) && mGbaFlg.field_0x2.m5) {
dComIfGs_onEventBit(0x1A08);
}
}
+2 -3
View File
@@ -779,9 +779,8 @@ BOOL daNpc_Md_c::flyCheck() {
}
/* 0000362C-00003648 .text mirrorCancelCheck__10daNpc_Md_cFv */
BOOL daNpc_Md_c::mirrorCancelCheck() {
/* Nonmatching */
return CPad_CHECK_TRIG_B(0);
bool daNpc_Md_c::mirrorCancelCheck() {
return CPad_CHECK_TRIG_B(0) != false;
}
/* 00003648-00003674 .text setWingEmitter__10daNpc_Md_cFv */
+25 -31
View File
@@ -28,39 +28,33 @@ inline void mDoCPd_TRIGGER_CONV(u8 analog, f32& param_1) {
}
}
#define MASK_INSERT_BUTTON(field, value, fieldshift, valueshift) \
temp = (bool)(((value) & (1 << valueshift))); \
(field) = ((temp << fieldshift) & (1 << fieldshift)) | ((field) & ~(1 << fieldshift))
/* 80007598-800078C0 .text mDoCPd_Convert__FP27interface_of_controller_padP10JUTGamePad */
static s32 mDoCPd_Convert(interface_of_controller_pad* pInterface, JUTGamePad* pPad) {
// the temp var stuff is hacky but seems required for matching codegen, including the !!temp at the end
BOOL temp;
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 4, 3);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 5, 2);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 7, 0);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 6, 1);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 3, 4);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 2, 5);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 1, 6);
MASK_INSERT_BUTTON(pInterface->mButtonHold0, pPad->mButton.mButton, 0, 8);
MASK_INSERT_BUTTON(pInterface->mButtonHold1, pPad->mButton.mButton, 7, 9);
MASK_INSERT_BUTTON(pInterface->mButtonHold1, pPad->mButton.mButton, 6, 10);
MASK_INSERT_BUTTON(pInterface->mButtonHold1, pPad->mButton.mButton, 5, 11);
MASK_INSERT_BUTTON(pInterface->mButtonHold1, pPad->mButton.mButton, 4, 12);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 4, 3);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 5, 2);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 7, 0);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 6, 1);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 3, 4);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 2, 5);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 1, 6);
MASK_INSERT_BUTTON(pInterface->mButtonTrig0, pPad->mButton.mTrigger, 0, 8);
MASK_INSERT_BUTTON(pInterface->mButtonTrig1, pPad->mButton.mTrigger, 7, 9);
MASK_INSERT_BUTTON(pInterface->mButtonTrig1, pPad->mButton.mTrigger, 6, 10);
MASK_INSERT_BUTTON(pInterface->mButtonTrig1, pPad->mButton.mTrigger, 5, 11);
MASK_INSERT_BUTTON(pInterface->mButtonTrig1, pPad->mButton.mTrigger, 4, 12);
temp = !!temp;
pInterface->mButtonHold.up = pPad->mButton.mButton & CButton::DPAD_UP;
pInterface->mButtonHold.down = pPad->mButton.mButton & CButton::DPAD_DOWN;
pInterface->mButtonHold.left = pPad->mButton.mButton & CButton::DPAD_LEFT;
pInterface->mButtonHold.right = pPad->mButton.mButton & CButton::DPAD_RIGHT;
pInterface->mButtonHold.z = pPad->mButton.mButton & CButton::Z;
pInterface->mButtonHold.r = pPad->mButton.mButton & CButton::R;
pInterface->mButtonHold.l = pPad->mButton.mButton & CButton::L;
pInterface->mButtonHold.a = pPad->mButton.mButton & CButton::A;
pInterface->mButtonHold.b = pPad->mButton.mButton & CButton::B;
pInterface->mButtonHold.x = pPad->mButton.mButton & CButton::X;
pInterface->mButtonHold.y = pPad->mButton.mButton & CButton::Y;
pInterface->mButtonHold.start = pPad->mButton.mButton & CButton::START;
pInterface->mButtonTrig.up = pPad->mButton.mTrigger & CButton::DPAD_UP;
pInterface->mButtonTrig.down = pPad->mButton.mTrigger & CButton::DPAD_DOWN;
pInterface->mButtonTrig.left = pPad->mButton.mTrigger & CButton::DPAD_LEFT;
pInterface->mButtonTrig.right = pPad->mButton.mTrigger & CButton::DPAD_RIGHT;
pInterface->mButtonTrig.z = pPad->mButton.mTrigger & CButton::Z;
pInterface->mButtonTrig.r = pPad->mButton.mTrigger & CButton::R;
pInterface->mButtonTrig.l = pPad->mButton.mTrigger & CButton::L;
pInterface->mButtonTrig.a = pPad->mButton.mTrigger & CButton::A;
pInterface->mButtonTrig.b = pPad->mButton.mTrigger & CButton::B;
pInterface->mButtonTrig.x = pPad->mButton.mTrigger & CButton::X;
pInterface->mButtonTrig.y = pPad->mButton.mTrigger & CButton::Y;
pInterface->mButtonTrig.start = pPad->mButton.mTrigger & CButton::START;
pInterface->mMainStickPosX = pPad->getMainStickX();
pInterface->mMainStickPosY = pPad->getMainStickY();