X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=input.c;h=b6255836e9b880d9f9f587ee1ae6c4e4c1d81ed2;hp=40c0ff8bb95039aea929f16b761f0ecf297b5ea7;hb=4a2a617ac879a95babe3b8a822188b71e9769ba4;hpb=81bd66a11186efb420eb8d6fd5766f0ef26d5919 diff --git a/input.c b/input.c index 40c0ff8..b625583 100644 --- a/input.c +++ b/input.c @@ -28,19 +28,23 @@ #include "svga.h" #include "input.h" +#include "state.h" #include "movie.h" +#include "fds.h" +#include "vsuni.h" +#include "dprintf.h" + extern INPUTC *FCEU_InitZapper(int w); -extern INPUTC *FCEU_InitPowerpad(int w); +extern INPUTC *FCEU_InitPowerpadA(int w); extern INPUTC *FCEU_InitArkanoid(int w); extern INPUTCFC *FCEU_InitArkanoidFC(void); extern INPUTCFC *FCEU_InitSpaceShadow(void); extern INPUTCFC *FCEU_InitFKB(void); static uint8 joy_readbit[2]; -static uint16 joy[4]={0,0,0,0}; - -extern int coinon; +static uint8 joy[4]={0,0,0,0}; +static uint8 LastStrobe; static int FSDisable=0; /* Set to 1 if NES-style four-player adapter is disabled. */ static int JPAttrib[2]={0,0}; @@ -51,12 +55,20 @@ static int JPAttribFC=0; static int JPTypeFC=0; static void *InputDataPtrFC; -void (*InputScanlineHook)(uint8 *buf, int line); +void (*InputScanlineHook)(uint8 *bg, uint8 *spr, uint32 linets, int final); static INPUTC DummyJPort={0,0,0,0,0}; static INPUTC *JPorts[2]={&DummyJPort,&DummyJPort}; static INPUTCFC *FCExp=0; +/* This function is a quick hack to get the NSF player to use emulated gamepad + input. +*/ +uint8 FCEU_GetJoyJoy(void) +{ + return(joy[0]|joy[1]|joy[2]|joy[3]); +} + static uint8 FP_FASTAPASS(1) ReadGPVS(int w) { uint8 ret=0; @@ -105,6 +117,7 @@ static DECLFR(JPRead) ret=FCExp->Read(A&1,ret); ret|=X.DB&0xC0; + dprintf("JPRead %i %02x", A&1, ret); return(ret); } @@ -119,7 +132,7 @@ static DECLFW(B4016) if(JPorts[1]->Write) JPorts[1]->Write(V&1); - if((PSG[0x16]&1) && (!(V&1))) + if((LastStrobe&1) && (!(V&1))) { /* This strobe code is just for convenience. If it were with the code in input / *.c, it would more accurately represent @@ -134,7 +147,7 @@ static DECLFW(B4016) if(FCExp->Strobe) FCExp->Strobe(); } - PSG[0x16]=V; + LastStrobe=V&1; } static void FP_FASTAPASS(1) StrobeGP(int w) @@ -190,7 +203,8 @@ void UpdateInput(void) if(netplay) NetplayUpdate(&joy[0],&joy[1]); #endif if (current < 0) FCEUMOV_AddJoy(joy); - FlushCommandQueue(); + else framecount++; // for debug + //FlushCommandQueue(); } static DECLFR(VSUNIRead0) @@ -216,16 +230,16 @@ static DECLFR(VSUNIRead1) return ret; } -static void SLHLHook(uint8 *buf, int line) +static void SLHLHook(uint8 *bg, uint8 *spr, uint32 linets, int final) { int x; for(x=0;x<2;x++) if(JPorts[x]->SLHook) - JPorts[x]->SLHook(x,buf,line); + JPorts[x]->SLHook(x,bg,spr,linets,final); if(FCExp) if(FCExp->SLHook) - FCExp->SLHook(buf,line); + FCExp->SLHook(bg,spr,linets,final); } static void CheckSLHook(void) @@ -250,7 +264,7 @@ static void FASTAPASS(1) SetInputStuff(int x) break; case SI_ARKANOID:JPorts[x]=FCEU_InitArkanoid(x);break; case SI_ZAPPER:JPorts[x]=FCEU_InitZapper(x);break; - case SI_POWERPAD:JPorts[x]=FCEU_InitPowerpad(x);break; + case SI_POWERPADA:JPorts[x]=FCEU_InitPowerpadA(x);break; case SI_NONE:JPorts[x]=&DummyJPort;break; } @@ -295,6 +309,7 @@ void InitializeInput(void) { memset(joy_readbit,0,sizeof(joy_readbit)); memset(joy,0,sizeof(joy)); + LastStrobe=0; if(FCEUGameInfo.type==GIT_VSUNI) { @@ -330,3 +345,86 @@ void FCEUI_SetInputFC(int type, void *ptr, int attrib) InputDataPtrFC=ptr; SetInputStuffFC(); } + +void FCEU_DoSimpleCommand(int cmd) +{ + printf("FCEU_DoSimpleCommand: %i\n", cmd); + switch(cmd) + { + case FCEUNPCMD_FDSINSERT: FCEU_FDSInsert();break; + case FCEUNPCMD_FDSSELECT: FCEU_FDSSelect();break; +// case FCEUNPCMD_FDSEJECT: FCEU_FDSEject();break; + case FCEUNPCMD_VSUNICOIN: FCEU_VSUniCoin(); break; + case FCEUNPCMD_VSUNIDIP0 ... (FCEUNPCMD_VSUNIDIP0 + 7): FCEU_VSUniToggleDIP(cmd - FCEUNPCMD_VSUNIDIP0);break; + case FCEUNPCMD_POWER: PowerNES();break; + case FCEUNPCMD_RESET: ResetNES();break; + default: printf("FCEU_DoSimpleCommand: can't handle cmd %i\n", cmd); break; + } +} + +void FCEU_QSimpleCommand(int cmd) +{ +// if(FCEUnetplay) +// FCEUNET_SendCommand(cmd, 0); +// else + { + // totally wrong: +// if(!FCEUMOV_IsPlaying()) +// FCEU_DoSimpleCommand(cmd); +// else +// FCEUMOV_AddCommand(cmd); + + FCEU_DoSimpleCommand(cmd); +// if(FCEUMOV_IsRecording()) +// FCEUMOV_AddCommand(cmd); + } +} + +void FCEUI_FDSSelect(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_FDSSELECT); +} + +int FCEUI_FDSInsert(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_FDSINSERT); + return(1); +} + +/* +int FCEUI_FDSEject(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_FDSEJECT); + return(1); +} +*/ +void FCEUI_VSUniToggleDIP(int w) +{ + FCEU_QSimpleCommand(FCEUNPCMD_VSUNIDIP0 + w); +} + +void FCEUI_VSUniCoin(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_VSUNICOIN); +} + +void FCEUI_ResetNES(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_RESET); +} + +void FCEUI_PowerNES(void) +{ + FCEU_QSimpleCommand(FCEUNPCMD_POWER); +} + + + +SFORMAT FCEUCTRL_STATEINFO[]={ + { joy_readbit, 2, "JYRB"}, + { joy, 4, "JOYS"}, + { &LastStrobe, 1, "LSTS"}, + { 0 } +}; + +