From 094d1bb8271206e47a9e9166d524b21161390f2b Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 30 Mar 2016 21:40:59 +0000 Subject: [PATCH] add support for snes pad to windows port --- trunk/src/drivers/win/input.cpp | 102 +++++++++++++---- trunk/src/drivers/win/res.rc | 188 ++++++++++++++++++------------- trunk/src/drivers/win/resource.h | 3 +- trunk/src/git.h | 6 +- trunk/src/input.cpp | 59 ++++++++++ 5 files changed, 253 insertions(+), 105 deletions(-) diff --git a/trunk/src/drivers/win/input.cpp b/trunk/src/drivers/win/input.cpp index deb2bd78..9f78581c 100644 --- a/trunk/src/drivers/win/input.cpp +++ b/trunk/src/drivers/win/input.cpp @@ -104,6 +104,7 @@ static void UpdateMahjong(void); static void UpdateFTrainer(void); static void UpdateTopRider(void); +static uint32 snespad_return[4]; static uint32 JSreturn=0; int NoWaiting=0; bool turbo = false; @@ -126,7 +127,7 @@ int allowUDLR=0; #define GPZ() {MKZ(), MKZ(), MKZ(), MKZ()} -ButtConfig GamePadConfig[4][10]={ +ButtConfig GamePadConfig[4][12]={ //Gamepad 1 { MK(F), MK(D), MK(S), MK(ENTER), MK(BL_CURSORUP), @@ -241,27 +242,37 @@ int DTestButton(ButtConfig *bc) return(0); } -void UpdateGamepad() +void UpdateGamepad(bool snes) { if(FCEUMOV_Mode(MOVIEMODE_PLAY)) return; - uint32 JS=0; - int x; - int wg; + int JS=0; if(FCEUMOV_Mode(MOVIEMODE_RECORD)) AutoFire(); - for(wg=0;wg<4;wg++) + for(int wg=0;wg<4;wg++) { - for(x=0;x<8;x++) - if(DTestButton(&GamePadConfig[wg][x])) - JS|=(1<= SI_NONE && esi <= SI_COUNT) diff --git a/trunk/src/input.cpp b/trunk/src/input.cpp index 0ba35410..a2152d9d 100644 --- a/trunk/src/input.cpp +++ b/trunk/src/input.cpp @@ -88,6 +88,7 @@ extern bool movieSubtitles; static uint8 joy_readbit[2]; uint8 joy[4]={0,0,0,0}; //HACK - should be static but movie needs it +uint16 snesjoy[4]={0,0,0,0}; //HACK - should be static but movie needs it static uint8 LastStrobe; uint8 RawReg4016 = 0; // Joystick strobe (W) @@ -314,9 +315,64 @@ static void StrobeGP(int w) //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +//SNES pad + +static void UpdateSNES(int w, void *data, int arg) +{ + //LUA NOT SUPPORTED YET + if(w==0) + { + snesjoy[0]= ((uint32 *)joyports[0].ptr)[0]; + snesjoy[2]= ((uint32 *)joyports[0].ptr)[2]; + } + else + { + snesjoy[1] = ((uint32 *)joyports[0].ptr)[1]; + snesjoy[3] = ((uint32 *)joyports[0].ptr)[3]; + } + +} + +static void LogSNES(int w, MovieRecord* mr) +{ + //not supported for SNES pad right noe +} + +static void LoadSNES(int w, MovieRecord* mr) +{ + //not supported for SNES pad right now +} + + +static uint8 ReadSNES(int w) +{ + //no fourscore support on snes (not clear how it would work) + + uint8 ret; + + if(joy_readbit[w]>=16) + ret = 1; + else + { + ret = ((snesjoy[w]>>(joy_readbit[w]))&1); + } + if(!fceuindbg) + joy_readbit[w]++; + return ret; +} + +static void StrobeSNES(int w) +{ + joy_readbit[w]=0; +} + +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + static INPUTC GPC={ReadGP,0,StrobeGP,UpdateGP,0,0,LogGP,LoadGP}; static INPUTC GPCVS={ReadGPVS,0,StrobeGP,UpdateGP,0,0,LogGP,LoadGP}; +static INPUTC GPSNES={ReadSNES,0,StrobeSNES,UpdateSNES,0,0,LogSNES,LoadSNES}; void FCEU_DrawInput(uint8 *buf) { @@ -399,6 +455,9 @@ static void SetInputStuff(int port) joyports[port].driver= &GPC; } break; + case SI_SNES: + joyports[port].driver= &GPSNES; + break; case SI_ARKANOID: joyports[port].driver=FCEU_InitArkanoid(port); break;