use picofe menu, move generic code out of gp2x/
[fceu.git] / input.c
diff --git a/input.c b/input.c
index be6b360..b625583 100644 (file)
--- a/input.c
+++ b/input.c
@@ -1,7 +1,7 @@
 /* FCE Ultra - NES/Famicom Emulator
  *
  * Copyright notice for this file:
- *  Copyright (C) 1998 BERO 
+ *  Copyright (C) 1998 BERO
  *  Copyright (C) 2002 Ben Parnell
  *
  * This program is free software; you can redistribute it and/or modify
@@ -18,7 +18,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-
+#include <string.h>
 #include "types.h"
 #include "x6502.h"
 
 #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[2]={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};
@@ -50,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;
@@ -73,7 +86,7 @@ static uint8 FP_FASTAPASS(1) ReadGPVS(int w)
 static uint8 FP_FASTAPASS(1) ReadGP(int w)
 {
                 uint8 ret;
-                //if(JoyMulti) 
+                //if(JoyMulti)
                //{
                  //ret = ((joy[w]>>(joy_readbit[w]))&1)|
                  //(((joy[w]>>(joy_readbit[w]+8))&1)<<1);
@@ -98,12 +111,13 @@ static DECLFR(JPRead)
 
        if(JPorts[A&1]->Read)
         ret|=JPorts[A&1]->Read(A&1);
-       
+
        if(FCExp)
         if(FCExp->Read)
          ret=FCExp->Read(A&1,ret);
 
        ret|=X.DB&0xC0;
+       dprintf("JPRead %i %02x", A&1, ret);
        return(ret);
 }
 
@@ -118,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
@@ -133,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)
@@ -188,7 +202,9 @@ void UpdateInput(void)
        #ifdef NETWORK
        if(netplay) NetplayUpdate(&joy[0],&joy[1]);
        #endif
-       FlushCommandQueue();
+       if (current < 0) FCEUMOV_AddJoy(joy);
+       else framecount++; // for debug
+       //FlushCommandQueue();
 }
 
 static DECLFR(VSUNIRead0)
@@ -214,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);
- if(FCExp) 
+   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)
@@ -248,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;
          }
 
@@ -290,9 +306,10 @@ static void SetInputStuffFC(void)
 // rewrite code to make this more sane?
 
 void InitializeInput(void)
-{ 
+{
        memset(joy_readbit,0,sizeof(joy_readbit));
        memset(joy,0,sizeof(joy));
+        LastStrobe=0;
 
         if(FCEUGameInfo.type==GIT_VSUNI)
         {
@@ -328,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 }
+};
+
+