move controller logic to PIF

This commit is contained in:
CocoSimone
2023-02-19 14:54:26 +01:00
parent 50ec9a8a9e
commit e665f2d6e9
11 changed files with 154 additions and 151 deletions

View File

@@ -3,11 +3,12 @@
#include <core/registers/Registers.hpp>
#include <log.hpp>
#include <MupenMovie.hpp>
#include <SDL_keyboard.h>
namespace n64 {
static int channel = 0;
void ProcessPIFCommands(u8* pifRam, Controller& controller, Mem& mem) {
void PIF::ProcessPIFCommands(Mem& mem) {
u8 control = pifRam[63];
if(control & 1) {
@@ -46,6 +47,8 @@ void ProcessPIFCommands(u8* pifRam, Controller& controller, Mem& mem) {
case 1:
if(tas_movie_loaded()) {
controller = tas_next_inputs();
} else {
UpdateController();
}
res[0] = controller.byte1;
res[1] = controller.byte2;
@@ -70,7 +73,97 @@ void ProcessPIFCommands(u8* pifRam, Controller& controller, Mem& mem) {
}
}
void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
#define GET_BUTTON(gamepad, i) SDL_GameControllerGetButton(gamepad, i)
#define GET_AXIS(gamepad, axis) SDL_GameControllerGetAxis(gamepad, axis)
void PIF::UpdateController() {
const uint8_t* state = SDL_GetKeyboardState(nullptr);
s8 xaxis = 0, yaxis = 0;
if(gamepadConnected) {
bool A = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_A);
bool B = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_X);
bool Z = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) == 32767;
bool START = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_START);
bool DUP = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_UP);
bool DDOWN = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_DOWN);
bool DLEFT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_LEFT);
bool DRIGHT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
bool L = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
bool R = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
bool CUP = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) <= -128;
bool CDOWN = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) >= 127;
bool CLEFT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) <= -128;
bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127;
controller.a = A;
controller.b = B;
controller.z = Z;
controller.start = START;
controller.dp_up = DUP;
controller.dp_down = DDOWN;
controller.dp_left = DLEFT;
controller.dp_right = DRIGHT;
controller.joy_reset = L && R && START;
controller.l = L;
controller.r = R;
controller.c_up = CUP;
controller.c_down = CDOWN;
controller.c_left = CLEFT;
controller.c_right = CRIGHT;
xaxis = (s8) std::clamp((GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX) >> 8), -86, 86);
yaxis = (s8) std::clamp(-(GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTY) >> 8), -86, 86);
controller.joy_x = xaxis;
controller.joy_y = yaxis;
if (controller.joy_reset) {
controller.start = false;
controller.joy_x = 0;
controller.joy_y = 0;
}
} else {
controller.a = state[SDL_SCANCODE_X];
controller.b = state[SDL_SCANCODE_C];
controller.z = state[SDL_SCANCODE_Z];
controller.start = state[SDL_SCANCODE_RETURN];
controller.dp_up = state[SDL_SCANCODE_KP_8];
controller.dp_down = state[SDL_SCANCODE_KP_5];
controller.dp_left = state[SDL_SCANCODE_KP_4];
controller.dp_right = state[SDL_SCANCODE_KP_6];
controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S];
controller.l = state[SDL_SCANCODE_A];
controller.r = state[SDL_SCANCODE_S];
controller.c_up = state[SDL_SCANCODE_I];
controller.c_down = state[SDL_SCANCODE_J];
controller.c_left = state[SDL_SCANCODE_K];
controller.c_right = state[SDL_SCANCODE_L];
if (state[SDL_SCANCODE_LEFT]) {
xaxis = -86;
} else if (state[SDL_SCANCODE_RIGHT]) {
xaxis = 86;
}
if (state[SDL_SCANCODE_DOWN]) {
yaxis = -86;
} else if (state[SDL_SCANCODE_UP]) {
yaxis = 86;
}
controller.joy_x = xaxis;
controller.joy_y = yaxis;
if (controller.joy_reset) {
controller.start = false;
controller.joy_x = 0;
controller.joy_y = 0;
}
}
}
void PIF::DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
u32 cicType = cartInfo.cicType;
bool pal = cartInfo.isPAL;
mem.Write32(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);
@@ -336,7 +429,7 @@ void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
regs.SetPC32(0xA4000040);
}
void ExecutePIF(Mem& mem, Registers& regs, CartInfo cartInfo) {
void PIF::ExecutePIF(Mem& mem, Registers& regs, CartInfo cartInfo) {
u32 cicType = cartInfo.cicType;
bool pal = cartInfo.isPAL;
mem.Write32(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);