some work on infrastructure for recording any kind of input. but now movies are broken. once i teach the movies how to only output the three columns that are currently defined, zappers will work.

This commit is contained in:
zeromus 2008-06-08 10:22:33 +00:00
parent 7676eff5cb
commit f90336a6a5
22 changed files with 1298 additions and 1261 deletions

View File

@ -15,44 +15,41 @@ std::fstream* FCEUD_UTF8_fstream(const char *n, const char *m);
//mbg 7/23/06
const char *FCEUD_GetCompilerString();
/* This makes me feel dirty for some reason. */
//This makes me feel dirty for some reason.
void FCEU_printf(char *format, ...);
#define FCEUI_printf FCEU_printf
/* Video interface */
//Video interface
void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b);
void FCEUD_GetPalette(uint8 i,uint8 *r, uint8 *g, uint8 *b);
/* Displays an error. Can block or not. */
//Displays an error. Can block or not.
void FCEUD_PrintError(const char *s);
void FCEUD_Message(const char *s);
/* Network interface */
//Network interface
/* Call only when a game is loaded. */
//Call only when a game is loaded.
int FCEUI_NetplayStart(int nlocal, int divisor);
/* Call when network play needs to stop. */
// Call when network play needs to stop.
void FCEUI_NetplayStop(void);
/* Note: YOU MUST NOT CALL ANY FCEUI_* FUNCTIONS WHILE IN FCEUD_SendData() or
FCEUD_RecvData().
*/
//Note: YOU MUST NOT CALL ANY FCEUI_* FUNCTIONS WHILE IN FCEUD_SendData() or FCEUD_RecvData().
/* Return 0 on failure, 1 on success. */
//Return 0 on failure, 1 on success.
int FCEUD_SendData(void *data, uint32 len);
int FCEUD_RecvData(void *data, uint32 len);
/* Display text received over the network. */
//Display text received over the network.
void FCEUD_NetplayText(uint8 *text);
/* Encode and send text over the network. */
//Encode and send text over the network.
void FCEUI_NetplayText(uint8 *text);
/* Called when a fatal error occurred and network play can't continue. This function
should call FCEUI_NetplayStop() after it has deinitialized the network on the driver
side.
*/
//Called when a fatal error occurred and network play can't continue. This function
//should call FCEUI_NetplayStop() after it has deinitialized the network on the driver
//side.
void FCEUD_NetworkClose(void);
bool FCEUI_BeginWaveRecord(const char *fn);
@ -68,82 +65,45 @@ void FCEUI_NTSCINC(void);
void FCEUI_GetNTSCTH(int *tint, int *hue);
void FCEUI_SetNTSCTH(int n, int tint, int hue);
//input device types for the standard joystick port
enum ESI
{
SI_NONE = 0,
SI_GAMEPAD = 1,
SI_ZAPPER = 2,
SI_POWERPADA = 3,
SI_POWERPADB = 4,
SI_ARKANOID = 5,
SI_MOUSE = 6 //mbg merge 7/17/06 added
};
//input device types for the expansion port
enum ESIFC
{
SIFC_NONE = 0,
SIFC_ARKANOID = 1,
SIFC_SHADOW = 2,
SIFC_4PLAYER = 3,
SIFC_FKB = 4,
SIFC_SUBORKB = 5,
SIFC_HYPERSHOT = 6,
SIFC_MAHJONG = 7,
SIFC_QUIZKING = 8,
SIFC_FTRAINERA = 9,
SIFC_FTRAINERB = 10,
SIFC_OEKAKIDS = 11,
SIFC_BWORLD = 12,
SIFC_TOPRIDER = 13,
};
void FCEUI_SetInput(int port, ESI type, void *ptr, int attrib);
void FCEUI_SetInputFC(ESIFC type, void *ptr, int attrib);
void FCEUI_DisableFourScore(bool disabled);
void FCEUI_UseInputPreset(int preset);
#define SIS_NONE 0
#define SIS_DATACH 1
#define SIS_NWC 2
#define SIS_VSUNISYSTEM 3
#define SIS_NSF 4
//New interface functions
/* New interface functions */
/* 0 to order screen snapshots numerically(0.png), 1 to order them file base-numerically(smb3-0.png). */
//0 to order screen snapshots numerically(0.png), 1 to order them file base-numerically(smb3-0.png).
void FCEUI_SetSnapName(int a);
/* 0 to keep 8-sprites limitation, 1 to remove it */
//0 to keep 8-sprites limitation, 1 to remove it
void FCEUI_DisableSpriteLimitation(int a);
/* -1 = no change, 0 = show, 1 = hide, 2 = internal toggle */
//-1 = no change, 0 = show, 1 = hide, 2 = internal toggle
void FCEUI_SetRenderDisable(int sprites, int bg);
/* name=path and file to load. returns 0 on failure, 1 on success */
//name=path and file to load. returns 0 on failure, 1 on success
FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode);
/* allocates memory. 0 on failure, 1 on success. */
int FCEUI_Initialize(void);
//general purpose emulator initialization. returns true if successful
bool FCEUI_Initialize();
/* Emulates a frame. */
//Emulates a frame.
void FCEUI_Emulate(uint8 **, int32 **, int32 *, int);
/* Closes currently loaded game */
//Closes currently loaded game
void FCEUI_CloseGame(void);
/* Deallocates all allocated memory. Call after FCEUI_Emulate() returns. */
//Deallocates all allocated memory. Call after FCEUI_Emulate() returns.
void FCEUI_Kill(void);
/* Enable/Disable game genie. a=0 disable, a=1 enable */
void FCEUI_SetGameGenie(int a);
//Enable/Disable game genie. a=true->enabled
void FCEUI_SetGameGenie(bool a);
/* Set video system a=0 NTSC, a=1 PAL */
//Set video system a=0 NTSC, a=1 PAL
void FCEUI_SetVidSystem(int a);
/* Convenience function; returns currently emulated video system(0=NTSC, 1=PAL). */
//Convenience function; returns currently emulated video system(0=NTSC, 1=PAL).
int FCEUI_GetCurrentVidSystem(int *slstart, int *slend);
#ifdef FRAMESKIP
@ -154,23 +114,19 @@ int FCEUI_GetCurrentVidSystem(int *slstart, int *slend);
void FCEUI_FrameSkip(int x);
#endif
/* First and last scanlines to render, for ntsc and pal emulation. */
//First and last scanlines to render, for ntsc and pal emulation.
void FCEUI_SetRenderedLines(int ntscf, int ntscl, int palf, int pall);
/* Sets the base directory(save states, snapshots, etc. are saved in directories
below this directory. */
//Sets the base directory(save states, snapshots, etc. are saved in directories below this directory.
void FCEUI_SetBaseDirectory(const char *dir);
/* Tells FCE Ultra to copy the palette data pointed to by pal and use it.
Data pointed to by pal needs to be 64*3 bytes in length.
*/
//Tells FCE Ultra to copy the palette data pointed to by pal and use it.
//Data pointed to by pal needs to be 64*3 bytes in length.
void FCEUI_SetPaletteArray(uint8 *pal);
/* Sets up sound code to render sound at the specified rate, in samples
per second. Only sample rates of 44100, 48000, and 96000 are currently
supported.
If "Rate" equals 0, sound is disabled.
*/
//Sets up sound code to render sound at the specified rate, in samples
//per second. Only sample rates of 44100, 48000, and 96000 are currently supported.
//If "Rate" equals 0, sound is disabled.
void FCEUI_Sound(int Rate);
void FCEUI_SetSoundVolume(uint32 volume);
void FCEUI_SetSoundQuality(int quality);
@ -180,7 +136,7 @@ void FCEUD_SoundVolumeAdjust(int);
int FCEUI_SelectState(int, int);
/* "fname" overrides the default save state filename code if non-NULL. */
//"fname" overrides the default save state filename code if non-NULL.
void FCEUI_SaveState(char *fname);
void FCEUI_LoadState(char *fname);
@ -305,7 +261,7 @@ void FCEUI_FDSSelect(void);
int FCEUI_DatachSet(const uint8 *rcode);
///returns a flag indicating whether emulation is paused
int FCEUI_EmulationPaused(void);
int FCEUI_EmulationPaused();
///returns a flag indicating whether a one frame step has been requested
int FCEUI_EmulationFrameStepped();
///clears the framestepped flag. use it after youve stepped your one frame
@ -313,7 +269,10 @@ void FCEUI_ClearEmulationFrameStepped();
///sets the EmulationPaused flags
void FCEUI_SetEmulationPaused(int val);
///toggles the paused bit (bit0) for EmulationPaused. caused FCEUD_DebugUpdate() to fire if the emulation pauses
void FCEUI_ToggleEmulationPause(void);
void FCEUI_ToggleEmulationPause();
//indicates whether input aids should be drawn (such as crosshairs, etc; usually in fullscreen mode)
bool FCEUD_ShouldDrawInputAids();
///called when the emulator closes a game
void FCEUD_OnCloseGame(void);
@ -389,4 +348,4 @@ extern "C"
#endif
FILE *FCEUI_UTF8fopen_C(const char *n, const char *m);
#endif /* __DRIVER_H_ */
#endif //__DRIVER_H_

View File

@ -118,7 +118,7 @@ static CFGSTRUCT fceuconfig[] = {
NAC("eoptions",eoptions),
NACA("cpalette",cpalette),
NACA("InputType",UsrInputType),
NACA("InputType",InputType),
NAC("vmcx",vmodes[0].x),
NAC("vmcy",vmodes[0].y),

View File

@ -1,4 +1,4 @@
void SaveConfig(const char *filename);
void LoadConfig(const char *filename);
extern int UsrInputType[3];
extern int InputType[3];

File diff suppressed because it is too large Load Diff

View File

@ -26,7 +26,7 @@ int GetAutoFireDesynch();
extern LPDIRECTINPUT7 lpDI;
extern int InputType[3];
extern int UsrInputType[3];
//extern int UsrInputType[3];
extern int cidisabled;
#ifndef _aosdfjk02fmasf
#define _aosdfjk02fmasf
@ -58,7 +58,7 @@ void ParseGIInput(FCEUGI *GameInfo);
#define FCFGD_HYPERSHOT 3
#define FCFGD_QUIZKING 4
void InitOtherInput(void);
void InitInputPorts(void);
void SetEmulationSpeed(int type);
int FCEUD_TestCommandState(int c);
void FCEUD_UpdateInput();

View File

@ -613,13 +613,12 @@ int main(int argc,char *argv[])
// Parse the commandline arguments
t = ParseArgies(argc, argv);
/* Bleh, need to find a better place for this. */
//Bleh, need to find a better place for this.
{
pal_emulation = !!pal_emulation;
FCEUI_SetVidSystem(pal_emulation);
genie = !!genie;
FCEUI_SetGameGenie(genie);
FCEUI_SetGameGenie(genie!=0);
fullscreen = !!fullscreen;
soundo = !!soundo;

View File

@ -26,6 +26,7 @@ extern int maxconbskip;
extern int ffbskip;
static int fullscreen = 0;
// Flag that indicates whether Game Genie is enabled or not.
extern int genie;

View File

@ -35,7 +35,7 @@ static int bpp;
static int vflags;
static int veflags;
int disvaccel = 0; /* Disable video hardware acceleration. */
int disvaccel = 0; //Disable video hardware acceleration.
int fssync=0;
int winsync=0;
@ -257,7 +257,7 @@ int SetVideoMode(int fs)
return 1;
}
/* Beginning */
//Beginning
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
@ -280,10 +280,9 @@ int SetVideoMode(int fs)
ddsdback.dwWidth=256 * specmul;
ddsdback.dwHeight=FSettings.TotalScanlines() * specmul;
/*
If the blit hardware can't stretch, assume it's cheap(and slow)
and create the buffer in system memory.
*/
//If the blit hardware can't stretch, assume it's cheap(and slow)
//and create the buffer in system memory.
if(!(caps.dwCaps&DDCAPS_BLTSTRETCH))
ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY;
@ -329,7 +328,7 @@ int SetVideoMode(int fs)
windowedfailed=0;
SetMainWindowStuff();
}
else /* Following is full-screen */
else //Following is full-screen
{
if(vmod == 0)
{
@ -421,11 +420,16 @@ int SetVideoMode(int fs)
ShowCursorAbs(0);
}
InputScreenChanged(fs);
fullscreen=fs;
return 1;
}
//draw input aids if we are fullscreen
bool FCEUD_ShouldDrawInputAids()
{
return fullscreen!=0;
}
static void BlitScreenWindow(uint8 *XBuf);
static void BlitScreenFull(uint8 *XBuf);
//static uint8 *XBSave;
@ -1105,9 +1109,7 @@ void DoVideoConfigFix(void)
UpdateRendBounds();
}
/**
* Shows the Video configuration dialog.
**/
//Shows the Video configuration dialog.
void ConfigVideo(void)
{
DialogBox(fceu_hInstance, "VIDEOCONFIG", hAppWnd, VideoConCallB);

View File

@ -889,7 +889,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
// Game Genie menu was selected
genie ^= 1;
FCEUI_SetGameGenie(genie);
FCEUI_SetGameGenie(genie!=0);
UpdateCheckedMenuItems();
break;

View File

@ -342,9 +342,9 @@ FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode)
GameInfo->name=0;
GameInfo->type=GIT_CART;
GameInfo->vidsys=GIV_USER;
GameInfo->input[0]=GameInfo->input[1]=-1;
GameInfo->inputfc=-1;
GameInfo->cspecial=0;
GameInfo->input[0]=GameInfo->input[1]=SI_UNSET;
GameInfo->inputfc=SIFC_UNSET;
GameInfo->cspecial=SIS_NONE;
//try to load each different format
if(iNESLoad(name,fp,OverwriteVidMode))
@ -392,16 +392,14 @@ FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode)
}
/**
* Return: Flag that indicates whether the function was succesful or not.
**/
int FCEUI_Initialize(void)
//Return: Flag that indicates whether the function was succesful or not.
bool FCEUI_Initialize()
{
srand(time(0));
if(!FCEU_InitVirtualVideo())
{
return 0;
return false;
}
AllocBuffers();
@ -422,7 +420,7 @@ int FCEUI_Initialize(void)
X6502_Init();
return 1;
return true;
}
void FCEUI_Kill(void)
@ -750,12 +748,10 @@ int FCEUI_GetCurrentVidSystem(int *slstart, int *slend)
return(PAL);
}
/**
* Enable or disable Game Genie option.
**/
void FCEUI_SetGameGenie(int a)
//Enable or disable Game Genie option.
void FCEUI_SetGameGenie(bool a)
{
FSettings.GameGenie = a ? 1 : 0;
FSettings.GameGenie = a;
}
void FCEUI_SetSnapName(int a)

View File

@ -71,7 +71,7 @@ typedef struct {
int PAL;
int NetworkPlay;
int SoundVolume;
int GameGenie;
bool GameGenie;
//the currently selected first and last rendered scanlines.
int FirstSLine;

View File

@ -1,31 +1,78 @@
#ifndef __FCEU_GIT
#define __FCEU_GIT
/* Mmm...git. Almost as funny as "gimp". */
#define GIT_CART 0 /* Cart. */
#define GIT_VSUNI 1 /* VS Unisystem. */
#define GIT_FDS 2 /* Famicom Disk System. */
#define GIT_NSF 3 /* NES Sound Format. */
#define GIV_NTSC 0 /* NTSC emulation. */
#define GIV_PAL 1 /* PAL emulation. */
#define GIV_USER 2 /* What was set by FCEUI_SetVidSys(). */
enum EGIT
{
GIT_CART = 0, //Cart
GIT_VSUNI = 1, //VS Unisystem
GIT_FDS = 2, // Famicom Disk System
GIT_NSF = 3, //NES Sound Format
};
enum EGIV
{
GIV_NTSC = 0, //NTSC emulation.
GIV_PAL = 1, //PAL emulation.
GIV_USER = 2, //What was set by FCEUI_SetVidSys().
};
enum ESIS
{
SIS_NONE = 0,
SIS_DATACH = 1,
SIS_NWC = 2,
SIS_VSUNISYSTEM = 3,
SIS_NSF = 4,
};
//input device types for the standard joystick port
enum ESI
{
SI_UNSET = -1,
SI_NONE = 0,
SI_GAMEPAD = 1,
SI_ZAPPER = 2,
SI_POWERPADA = 3,
SI_POWERPADB = 4,
SI_ARKANOID = 5,
SI_MOUSE = 6 //mbg merge 7/17/06 added
};
//input device types for the expansion port
enum ESIFC
{
SIFC_UNSET = -1,
SIFC_NONE = 0,
SIFC_ARKANOID = 1,
SIFC_SHADOW = 2,
SIFC_4PLAYER = 3,
SIFC_FKB = 4,
SIFC_SUBORKB = 5,
SIFC_HYPERSHOT = 6,
SIFC_MAHJONG = 7,
SIFC_QUIZKING = 8,
SIFC_FTRAINERA = 9,
SIFC_FTRAINERB = 10,
SIFC_OEKAKIDS = 11,
SIFC_BWORLD = 12,
SIFC_TOPRIDER = 13,
};
#include "utils/md5.h"
typedef struct {
uint8 *name; /* Game name, UTF8 encoding */
uint8 *name; //Game name, UTF8 encoding
int type; /* GIT_* */
int vidsys; /* Current emulated video system; GIV_* */
int input[2]; /* Desired input for emulated input ports 1 and 2; -1
for unknown desired input. */
int inputfc; /* Desired Famicom expansion port device. -1 for unknown
desired input. */
int cspecial; /* Special cart expansion: DIP switches, barcode
reader, etc.
*/
EGIT type;
EGIV vidsys; //Current emulated video system;
ESI input[2]; //Desired input for emulated input ports 1 and 2; -1 for unknown desired input.
ESIFC inputfc; //Desired Famicom expansion port device. -1 for unknown desired input.
ESIS cspecial; //Special cart expansion: DIP switches, barcode reader, etc.
MD5DATA MD5;
int soundrate; /* For Ogg Vorbis expansion sound wacky support. 0 for default. */
int soundchan; /* Number of sound channels. */
//mbg 6/8/08 - ???
int soundrate; //For Ogg Vorbis expansion sound wacky support. 0 for default.
int soundchan; //Number of sound channels.
} FCEUGI;
#endif

View File

@ -169,104 +169,103 @@ struct CRCMATCH {
struct INPSEL {
uint32 crc32;
int input1;
int input2;
int inputfc;
ESI input1;
ESI input2;
ESIFC inputfc;
};
/* This is mostly for my personal use. So HA. */
static void SetInput(void)
{
static struct INPSEL moo[]=
static struct INPSEL moo[]=
{
{0x3a1694f9,SI_GAMEPAD,SI_GAMEPAD,SIFC_4PLAYER}, /* Nekketsu Kakutou Densetsu */
{0x3a1694f9,SI_GAMEPAD,SI_GAMEPAD,SIFC_4PLAYER}, // Nekketsu Kakutou Densetsu
{0xc3c0811d,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, /* The two "Oeka Kids" games */
{0x9d048ea4,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, /* */
{0xc3c0811d,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, // The two "Oeka Kids" games
{0x9d048ea4,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, //
{0xaf4010ea,SI_GAMEPAD,SI_POWERPADB,-1}, /* World Class Track Meet */
{0xd74b2719,SI_GAMEPAD,SI_POWERPADB,-1}, /* Super Team Games */
{0x61d86167,SI_GAMEPAD,SI_POWERPADB,-1}, /* Street Cop */
{0x6435c095,SI_GAMEPAD,SI_POWERPADB,-1}, /* Short Order/Eggsplode */
{0xaf4010ea,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // World Class Track Meet
{0xd74b2719,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Super Team Games
{0x61d86167,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Street Cop
{0x6435c095,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Short Order/Eggsplode
{0x47232739,SI_GAMEPAD,SI_GAMEPAD,SIFC_TOPRIDER}, /* Top Rider */
{0x47232739,SI_GAMEPAD,SI_GAMEPAD,SIFC_TOPRIDER}, // Top Rider
{0x48ca0ee1,SI_GAMEPAD,SI_GAMEPAD,SIFC_BWORLD}, /* Barcode World */
{0x9f8f200a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Super Mogura Tataki!! - Pokkun Moguraa */
{0x9044550e,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Rairai Kyonshizu */
{0x2f128512,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Jogging Race */
{0x60ad090a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Athletic World */
{0x48ca0ee1,SI_GAMEPAD,SI_GAMEPAD,SIFC_BWORLD}, // Barcode World
{0x9f8f200a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Super Mogura Tataki!! - Pokkun Moguraa
{0x9044550e,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Rairai Kyonshizu
{0x2f128512,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Jogging Race
{0x60ad090a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Athletic World
{0x8a12a7d9,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Totsugeki Fuuun Takeshi Jou */
{0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Running Stadium */
{0x370ceb65,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Meiro Dai Sakusen */
// Bad dump? {0x69ffb014,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Fuun Takeshi Jou 2 */
{0x6cca1c1f,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Dai Undoukai */
{0x29de87af,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Aerobics Studio */
{0xbba58be5,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Family Trainer: Manhattan Police */
{0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Family Trainer: Running Stadium */
{0x8a12a7d9,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Totsugeki Fuuun Takeshi Jou
{0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Running Stadium
{0x370ceb65,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Meiro Dai Sakusen
// Bad dump? {0x69ffb014,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Fuun Takeshi Jou 2
{0x6cca1c1f,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Dai Undoukai
{0x29de87af,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Aerobics Studio
{0xbba58be5,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Family Trainer: Manhattan Police
{0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Family Trainer: Running Stadium
{0xd9f45be9,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, /* Gimme a Break ... */
{0x1545bd13,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, /* Gimme a Break ... 2 */
{0xd9f45be9,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, // Gimme a Break ...
{0x1545bd13,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, // Gimme a Break ... 2
{0x7b44fb2a,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, /* Ide Yousuke Meijin no Jissen Mahjong 2 */
{0x9fae4d46,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, /* Ide Yousuke Meijin no Jissen Mahjong */
{0x7b44fb2a,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, // Ide Yousuke Meijin no Jissen Mahjong 2
{0x9fae4d46,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, // Ide Yousuke Meijin no Jissen Mahjong
{0x980be936,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Olympic */
{0x21f85681,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Olympic (Gentei Ban) */
{0x915a53a7,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Sports */
{0xad9c63e2,SI_GAMEPAD,-1,SIFC_SHADOW}, /* Space Shadow */
{0x980be936,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Olympic
{0x21f85681,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Olympic (Gentei Ban)
{0x915a53a7,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Sports
{0xad9c63e2,SI_GAMEPAD,SI_UNSET,SIFC_SHADOW}, // Space Shadow
{0x24598791,-1,SI_ZAPPER,0}, /* Duck Hunt */
{0xff24d794,-1,SI_ZAPPER,0}, /* Hogan's Alley */
{0xbeb8ab01,-1,SI_ZAPPER,0}, /* Gumshoe */
{0xde8fd935,-1,SI_ZAPPER,0}, /* To the Earth */
{0xedc3662b,-1,SI_ZAPPER,0}, /* Operation Wolf */
{0x2a6559a1,-1,SI_ZAPPER,0}, /* Operation Wolf (J) */
{0x24598791,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Duck Hunt
{0xff24d794,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Hogan's Alley
{0xbeb8ab01,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Gumshoe
{0xde8fd935,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // To the Earth
{0xedc3662b,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Operation Wolf
{0x2a6559a1,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Operation Wolf (J)
{0x23d17f5e,SI_GAMEPAD,SI_ZAPPER,0}, /* The Lone Ranger */
{0xb8b9aca3,-1,SI_ZAPPER,0}, /* Wild Gunman */
{0x5112dc21,-1,SI_ZAPPER,0}, /* Wild Gunman */
{0x4318a2f8,-1,SI_ZAPPER,0}, /* Barker Bill's Trick Shooting */
{0x5ee6008e,-1,SI_ZAPPER,0}, /* Mechanized Attack */
{0x3e58a87e,-1,SI_ZAPPER,0}, /* Freedom Force */
{0xe9a7fe9e,-1,SI_MOUSE,0}, /* Educational Computer 2000 */ //mbg merge 7/17/06 added -- appears to be from newer MM build
{0x851eb9be,SI_GAMEPAD,SI_ZAPPER,0}, /* Shooting Range */
{0x74bea652,SI_GAMEPAD,SI_ZAPPER,0}, /* Supergun 3-in-1 */
{0x32fb0583,-1,SI_ARKANOID,0}, /* Arkanoid(NES) */
{0xd89e5a67,-1,-1,SIFC_ARKANOID}, /* Arkanoid (J) */
{0x0f141525,-1,-1,SIFC_ARKANOID}, /* Arkanoid 2(J) */
{0x23d17f5e,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // The Lone Ranger
{0xb8b9aca3,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Wild Gunman
{0x5112dc21,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Wild Gunman
{0x4318a2f8,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Barker Bill's Trick Shooting
{0x5ee6008e,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Mechanized Attack
{0x3e58a87e,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Freedom Force
{0xe9a7fe9e,SI_UNSET,SI_MOUSE,SIFC_NONE}, // Educational Computer 2000 //mbg merge 7/17/06 added -- appears to be from newer MM build
{0x851eb9be,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // Shooting Range
{0x74bea652,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // Supergun 3-in-1
{0x32fb0583,SI_UNSET,SI_ARKANOID,SIFC_NONE}, // Arkanoid(NES)
{0xd89e5a67,SI_UNSET,SI_UNSET,SIFC_ARKANOID}, // Arkanoid (J)
{0x0f141525,SI_UNSET,SI_UNSET,SIFC_ARKANOID}, // Arkanoid 2(J)
{0x912989dc,-1,-1,SIFC_FKB}, /* Playbox BASIC */
{0xf7606810,-1,-1,SIFC_FKB}, /* Family BASIC 2.0A */
{0x895037bc,-1,-1,SIFC_FKB}, /* Family BASIC 2.1a */
{0xb2530afc,-1,-1,SIFC_FKB}, /* Family BASIC 3.0 */
{0x82f1fb96,-1,-1,SIFC_SUBORKB}, /* Subor 1.0 Russian */
{0xabb2f974,-1,-1,SIFC_SUBORKB}, /* Study and Game 32-in-1 */
{0xd5d6eac4,-1,-1,SIFC_SUBORKB}, /* Edu (As) */
{0x589b6b0d,-1,-1,SIFC_SUBORKB}, /* SuporV20 */
{0x5e073a1b,-1,-1,SIFC_SUBORKB}, /* Supor English (Chinese) */
{0x8b265862,-1,-1,SIFC_SUBORKB},
{0x41401c6d,-1,-1,SIFC_SUBORKB}, /* SuporV40 */
{0x41ef9ac4,-1,-1,SIFC_SUBORKB},
{0x368c19a8,-1,-1,SIFC_SUBORKB}, /* LIKO Study Cartridge */
{0x543ab532,-1,-1,SIFC_SUBORKB}, /* LIKO Color Lines */
{0,-1,-1,-1}
{0x912989dc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Playbox BASIC
{0xf7606810,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 2.0A
{0x895037bc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 2.1a
{0xb2530afc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 3.0
{0x82f1fb96,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Subor 1.0 Russian
{0xabb2f974,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Study and Game 32-in-1
{0xd5d6eac4,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Edu (As)
{0x589b6b0d,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // SuporV20
{0x5e073a1b,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Supor English (Chinese)
{0x8b265862,SI_UNSET,SI_UNSET,SIFC_SUBORKB},
{0x41401c6d,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // SuporV40
{0x41ef9ac4,SI_UNSET,SI_UNSET,SIFC_SUBORKB},
{0x368c19a8,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // LIKO Study Cartridge
{0x543ab532,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // LIKO Color Lines
{0,SI_UNSET,SI_UNSET,SIFC_UNSET}
};
int x=0;
int x=0;
while(moo[x].input1>=0 || moo[x].input2>=0 || moo[x].inputfc>=0)
{
if(moo[x].crc32==iNESGameCRC32)
{
GameInfo->input[0]=moo[x].input1;
GameInfo->input[1]=moo[x].input2;
GameInfo->inputfc=moo[x].inputfc;
break;
}
x++;
}
while(moo[x].input1>=0 || moo[x].input2>=0 || moo[x].inputfc>=0)
{
if(moo[x].crc32==iNESGameCRC32)
{
GameInfo->input[0]=moo[x].input1;
GameInfo->input[1]=moo[x].input2;
GameInfo->inputfc=moo[x].inputfc;
break;
}
x++;
}
}
#define INESB_INCOMPLETE 1

View File

@ -20,6 +20,7 @@
*/
#include <string>
#include <ostream>
#include <string.h>
#include "types.h"
@ -65,7 +66,7 @@ extern INPUTCFC *FCEU_InitBarcodeWorld(void);
//---------------
static uint8 joy_readbit[2];
static uint8 joy[4]={0,0,0,0};
uint8 joy[4]={0,0,0,0}; //HACK - should be static but movie needs it
static uint8 LastStrobe;
static int BotMode = 0;
@ -83,23 +84,8 @@ extern uint8 coinon;
static bool FSDisable=false; // Set to true if NES-style four-player adapter is disabled.
static struct JOYPORT
{
int attrib;
ESI type;
void* ptr;
INPUTC* driver;
} joyports[2];
static struct FCPORT
{
int attrib;
ESIFC type;
void* ptr;
INPUTCFC* driver;
} portFC;
JOYPORT joyports[2] = { JOYPORT(0), JOYPORT(1) };
FCPORT portFC;
static DECLFR(JPRead)
{
@ -142,9 +128,9 @@ static DECLFW(B4016)
}
//a main joystick port driver representing the case where nothing is plugged in
static INPUTC DummyJPort={0,0,0,0,0};
static INPUTC DummyJPort={0,0,0,0,0,0};
//and an expansion port driver for the same ting
static INPUTCFC DummyPortFC={0,0,0,0,0};
static INPUTCFC DummyPortFC={0,0,0,0,0,0};
//--------4 player driver for expansion port--------
@ -200,6 +186,35 @@ static void UpdateGP(int w, void *data, int arg)
}
}
static void LogGP(int w, MovieRecord* mr)
{
if(w==0)
{
mr->joysticks[0] = joy[0];
mr->joysticks[2] = joy[2];
}
else
{
mr->joysticks[1] = joy[1];
mr->joysticks[3] = joy[3];
}
}
static void LoadGP(int w, MovieRecord* mr)
{
if(w==0)
{
joy[0] = mr->joysticks[0];
joy[2] = mr->joysticks[2];
}
else
{
joy[1] = mr->joysticks[1];
joy[3] = mr->joysticks[3];
}
}
//basic joystick port driver
static uint8 ReadGP(int w)
{
@ -231,8 +246,8 @@ static void StrobeGP(int w)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6
static INPUTC GPC={ReadGP,0,StrobeGP,UpdateGP,0,0};
static INPUTC GPCVS={ReadGPVS,0,StrobeGP,UpdateGP,0,0};
static INPUTC GPC={ReadGP,0,StrobeGP,UpdateGP,0,0,LogGP,LoadGP};
static INPUTC GPCVS={ReadGPVS,0,StrobeGP,UpdateGP,0,0,LogGP,LoadGP};
int FCEU_BotMode()
{
@ -295,14 +310,16 @@ void FCEU_UpdateBot()
#endif //_USE_SHARED_MEMORY_
}
void FCEU_UpdateInput(void)
{
//tell all drivers to poll input and set up their logical states
if(!FCEUMOV_Mode(MOVIEMODE_PLAY) && !BotMode)
{
for(int port=0;port<2;port++)
joyports[port].driver->Update(port,joyports[port].ptr,joyports[port].attrib);
portFC.driver->Update(portFC.ptr,portFC.attrib);
}
}
if(GameInfo->type==GIT_VSUNI)
if(coinon) coinon--;
@ -310,8 +327,9 @@ void FCEU_UpdateInput(void)
if(FCEUnetplay)
NetplayUpdate(joy);
FCEUMOV_AddInputState(ZD, joy, BotMode);
FCEUMOV_AddInputState();
//TODO - should this apply to the movie data? should this be displayed in the input hud?
if(GameInfo->type==GIT_VSUNI)
FCEU_VSUniSwap(&joy[0],&joy[1]);
}

View File

@ -1,8 +1,16 @@
#ifndef _INPUT_H_
#define _INPUT_H_
#include <ostream>
#include "git.h"
class MovieRecord;
//MBG TODO - COMBINE THESE INPUTC AND INPUTCFC
//The interface for standard joystick port device drivers
typedef struct
struct INPUTC
{
//these methods call the function pointers (or not, if they are null)
uint8 Read(int w) { if(_Read) return _Read(w); else return 0; }
@ -11,17 +19,25 @@ typedef struct
void Update(int w, void *data, int arg) { if(_Update) _Update(w,data,arg); }
void SLHook(int w, uint8 *bg, uint8 *spr, uint32 linets, int final) { if(_SLHook) _SLHook(w,bg,spr,linets,final); }
void Draw(int w, uint8 *buf, int arg) { if(_Draw) _Draw(w,buf,arg); }
void Log(int w, MovieRecord* mr) { if(_Log) _Log(w,mr); }
void Load(int w, MovieRecord* mr) { if(_Load) _Load(w,mr); }
uint8 (*_Read)(int w);
void (*_Write)(uint8 v);
void (*_Strobe)(int w);
//update will be called if input is coming from the user. refresh your logical state from user input devices
void (*_Update)(int w, void *data, int arg);
void (*_SLHook)(int w, uint8 *bg, uint8 *spr, uint32 linets, int final);
void (*_Draw)(int w, uint8 *buf, int arg);
} INPUTC;
//log is called when you need to put your logical state into a movie record for recording
void (*_Log)(int w, MovieRecord* mr);
//load will be called if input is coming from a movie. refresh your logical state from a movie record
void (*_Load)(int w, MovieRecord* mr);
};
//The interface for the expansion port device drivers
typedef struct
struct INPUTCFC
{
//these methods call the function pointers (or not, if they are null)
uint8 Read(int w, uint8 ret) { if(_Read) return _Read(w,ret); else return ret; }
@ -30,14 +46,48 @@ typedef struct
void Update(void *data, int arg) { if(_Update) _Update(data,arg); }
void SLHook(uint8 *bg, uint8 *spr, uint32 linets, int final) { if(_SLHook) _SLHook(bg,spr,linets,final); }
void Draw(uint8 *buf, int arg) { if(_Draw) _Draw(buf,arg); }
void Log(MovieRecord* mr) { if(_Log) _Log(mr); }
void Load(MovieRecord* mr) { if(_Load) _Load(mr); }
uint8 (*_Read)(int w, uint8 ret);
void (*_Write)(uint8 v);
void (*_Strobe)();
//update will be called if input is coming from the user. refresh your logical state from user input devices
void (*_Update)(void *data, int arg);
void (*_SLHook)(uint8 *bg, uint8 *spr, uint32 linets, int final);
void (*_Draw)(uint8 *buf, int arg);
} INPUTCFC;
//log is called when you need to put your logical state into a movie record for recording
void (*_Log)(MovieRecord* mr);
//load will be called if input is coming from a movie. refresh your logical state from a movie record
void (*_Load)(MovieRecord* mr);
};
extern struct JOYPORT
{
JOYPORT(int _w)
: w(_w)
{}
int w;
int attrib;
ESI type;
void* ptr;
INPUTC* driver;
void log(MovieRecord* mr) { driver->Log(w,mr); }
void load(MovieRecord* mr) { driver->Load(w,mr); }
} joyports[2];
extern struct FCPORT
{
int attrib;
ESIFC type;
void* ptr;
INPUTCFC* driver;
} portFC;
void FCEU_DrawInput(uint8 *buf);
void FCEU_UpdateInput(void);

View File

@ -82,7 +82,7 @@ static void OK_Update(void *data, int arg)
static void DrawOeka(uint8 *buf, int arg)
{
if(arg && OKY<44)
if(OKY<44)
FCEU_DrawCursor(buf, OKX, OKY);
}

View File

@ -117,7 +117,6 @@ static uint8 ReadZapper(int w, uint8 ret)
static void DrawZapper(uint8 *buf, int arg)
{
if(arg)
FCEU_DrawCursor(buf, ZD.mzx, ZD.mzy);
}

View File

@ -23,8 +23,9 @@
#include "share.h"
#include "zapper.h"
#include "movie.h"
ZAPPER ZD[2];
static ZAPPER ZD[2];
static void ZapperFrapper(int w, uint8 *bg, uint8 *spr, uint32 linets, int final)
{
@ -125,8 +126,7 @@ static uint8 ReadZapper(int w)
static void DrawZapper(int w, uint8 *buf, int arg)
{
if(arg)
FCEU_DrawGunSight(buf, ZD[w].mzx,ZD[w].mzy);
FCEU_DrawGunSight(buf, ZD[w].mzx,ZD[w].mzy);
}
static void UpdateZapper(int w, void *data, int arg)
@ -144,8 +144,28 @@ static void UpdateZapper(int w, void *data, int arg)
ZD[w].mzb=ptr[2];
}
static INPUTC ZAPC={ReadZapper,0,0,UpdateZapper,ZapperFrapper,DrawZapper};
static INPUTC ZAPVSC={ReadZapperVS,0,StrobeZapperVS,UpdateZapper,ZapperFrapper,DrawZapper};
static void LogZapper(int w, MovieRecord* mr)
{
mr->zappers[w].x = ZD[w].mzx;
mr->zappers[w].y = ZD[w].mzy;
mr->zappers[w].b = ZD[w].mzb;
}
static void LoadZapper(int w, MovieRecord* mr)
{
if(ZD[w].bogo)
ZD[w].bogo--;
if(mr->zappers[w].b&3 && (!(ZD[w].mzb&3)))
ZD[w].bogo=5;
ZD[w].mzx = mr->zappers[w].x;
ZD[w].mzy = mr->zappers[w].y;
ZD[w].mzb = mr->zappers[w].b;
}
static INPUTC ZAPC={ReadZapper,0,0,UpdateZapper,ZapperFrapper,DrawZapper,LogZapper,LoadZapper};
static INPUTC ZAPVSC={ReadZapperVS,0,StrobeZapperVS,UpdateZapper,ZapperFrapper,DrawZapper,LogZapper,LoadZapper};
INPUTC *FCEU_InitZapper(int w)
{

View File

@ -608,7 +608,7 @@ void FCEUI_SaveMovie(char *fname, uint8 flags)
//the main interaction point between the emulator and the movie system.
//either dumps the current joystick state or loads one state from the movie
void FCEUMOV_AddInputState(ZAPPER (&zappers)[2], uint8 (&js)[4], int SkipFlush)
void FCEUMOV_AddInputState()
{
//todo - for tasedit, either dump or load depending on whether input recording is enabled
//or something like that
@ -624,16 +624,9 @@ void FCEUMOV_AddInputState(ZAPPER (&zappers)[2], uint8 (&js)[4], int SkipFlush)
}
else
{
MovieRecord& mr = currMovieData.records[currFrameCounter];
for(int i=0;i<4;i++)
js[i] = mr.joysticks[i];
for(int i=0;i<2;i++)
{
zappers[i].mzx = mr.zappers[i].x;
zappers[i].mzy = mr.zappers[i].y;
zappers[i].mzb = mr.zappers[i].b;
}
MovieRecord* mr = &currMovieData.records[currFrameCounter];
joyports[0].load(mr);
joyports[1].load(mr);
}
//if we are on the last frame, then pause the emulator if the player requested it
@ -657,28 +650,20 @@ void FCEUMOV_AddInputState(ZAPPER (&zappers)[2], uint8 (&js)[4], int SkipFlush)
{
MovieRecord mr;
//for each joystick
for(int i=0;i<4;i++)
mr.joysticks[i] = js[i];
joyports[0].log(&mr);
joyports[1].log(&mr);
//printf("%d %d %d\n",zappers[1].mzx,zappers[1].mzy,zappers[1].mzb);
for(int i=0;i<2;i++)
{
mr.zappers[i].x = zappers[i].mzx;
mr.zappers[i].y = zappers[i].mzy;
mr.zappers[i].b = zappers[i].mzb;
}
mr.dump(osRecordingMovie,currMovieData.records.size());
currMovieData.records.push_back(mr);
}
currFrameCounter++;
memcpy(&cur_input_display,js,4);
extern uint8 joy[4];
memcpy(&cur_input_display,joy,4);
}
//TODO
void FCEUMOV_AddCommand(int cmd)
{

View File

@ -8,7 +8,7 @@
#include "input/zapper.h"
void FCEUMOV_AddInputState(ZAPPER (&zappers)[2], uint8 (&js)[4], int SkipFlush);
void FCEUMOV_AddInputState();
void FCEUMOV_AddCommand(int cmd);
void FCEU_DrawMovies(uint8 *);

View File

@ -223,7 +223,9 @@ void FCEU_PutImage(void)
}
DrawMessage(false);
FCEU_DrawInput(XBuf);
if(FCEUD_ShouldDrawInputAids())
FCEU_DrawInput(XBuf);
//Fancy input display code
if(input_display)

View File

@ -334,7 +334,6 @@ void FCEU_VSUniCheck(uint64 md5partial, int *MapperNo, uint8 *Mirroring)
{
if(vs->ppu < RCP2C03B) pale = vs->ppu;
//puts(vs->name);
*MapperNo = vs->mapper;
*Mirroring = vs->mirroring;
GameInfo->type = GIT_VSUNI;