﻿//////////////////////////////////////////////////////////////////////////
//                                                                      //
//      NES Pad                                                         //
//                                                           Norix      //
//                                               written     2001/02/22 //
//                                               last modify ----/--/-- //
//////////////////////////////////////////////////////////////////////////

#ifndef	__PAD_INCLUDED__
#define	__PAD_INCLUDED__

#include "typedef.h"
#include "macro.h"
#include "LuaExt.h"
// class prototypes
class	NES;
class	EXPAD;

class	PAD
{
public:
	PAD( NES* parent );
	virtual	~PAD();

// メンバ関数
	void	Reset();

	// For movie
	DWORD	GetSyncData();
	void	SetSyncData( DWORD data );

	DWORD	GetSyncExData();
	void	SetSyncExData( DWORD data );

	void	VSync();

	void	Sync();
	BYTE	SyncSub( INT no );
	BYTE	SyncSubLogging( INT no );
	void	logging( INT no,WORD _bit );
	void	lua_script( INT no,WORD &_bit );

	void	SetStrobe( BOOL bStrb ) { bStrobe = bStrb; }
	BOOL	GetStrobe() { return bStrobe; }

	void	Strobe();
	WORD	StrobeSub( INT no );

	BYTE	Read( WORD addr );
	void	Write( WORD addr, BYTE data );

	void	SetExController( INT type );
	INT	GetExController()	    { return excontroller_select; }

	BOOL	IsZapperMode() { return bZapperMode; };

	// For VS-Unisystem
	void	SetSwapPlayer( BOOL bSwap ) { bSwapPlayer = bSwap; }
	void	SetSwapButton( BOOL bSwap ) { bSwapButton = bSwap; }
	void	SetVSType( INT nType ) { nVSSwapType = nType; }

	enum	{
		VS_TYPE0 = 0,	// SELECT1P=START1P/SELECT2P=START2P 1P/2P No reverse
		VS_TYPE1,	// SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse
		VS_TYPE2,	// SELECT1P=START1P/START1P =START2P 1P/2P No reverse
		VS_TYPE3,	// SELECT1P=START1P/START1P =START2P 1P/2P Reverse
		VS_TYPE4,	// SELECT1P=START1P/SELECT2P=START2P 1P/2P No reverse (Protection)
		VS_TYPE5,	// SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse    (Protection)
		VS_TYPE6,	// SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse	(For Golf)
		VS_TYPEZ,	// ZAPPER
	};

	enum	EXCONTROLLER {
		EXCONTROLLER_NONE = 0,
		EXCONTROLLER_PADDLE,
		EXCONTROLLER_HYPERSHOT,
		EXCONTROLLER_ZAPPER,
		EXCONTROLLER_KEYBOARD,
		EXCONTROLLER_CRAZYCLIMBER,
		EXCONTROLLER_TOPRIDER,
		EXCONTROLLER_SPACESHADOWGUN,

		EXCONTROLLER_FAMILYTRAINER_A,
		EXCONTROLLER_FAMILYTRAINER_B,
		EXCONTROLLER_EXCITINGBOXING,
		EXCONTROLLER_MAHJANG,
		EXCONTROLLER_OEKAKIDS_TABLET,
		EXCONTROLLER_TURBOFILE,

		EXCONTROLLER_VSUNISYSTEM,
		EXCONTROLLER_VSZAPPER,

		EXCONTROLLER_GYROMITE,
		EXCONTROLLER_STACKUP,

		EXCONTROLLER_SUPOR_KEYBOARD,
	};

	DWORD	pad1bit, pad2bit;
	DWORD	pad3bit, pad4bit;

	// Frame Synchronized
	LONG	zapperx, zappery;
	BYTE	zapperbit;
	BYTE	crazyclimberbit;

	// For NSF Player
	BYTE	GetNsfController() { return nsfbit; }

protected:
	NES*	nes;
	// Extension Devices
	EXPAD*	expad;

	// Frame Synchronized
	BYTE	padbit[4];
	BYTE	micbit;

	BYTE	padbitsync[4];
	BYTE	micbitsync;

	INT	excontroller_select;
	INT	padcnt[4][2];

	BOOL	bStrobe;
	BOOL	bZapperMode;

	// For VS-Unisystem
	INT	nVSSwapType;
	BOOL	bSwapPlayer;
	BOOL	bSwapButton;

	// For BarcodeWorld
	BOOL	bBarcodeWorld;

	// For NSF Player
	void	NsfSub();

	BYTE	nsfbit;
private:
	DWORD lua_time[4];
	TimePad sTmPad[4];
	TimePad sTmPadScript[4];
	std::vector<ProgPad>  oPadProg[4];
};

#include "EXPAD.h"
#include "EXPAD_Zapper.h"
#include "EXPAD_Paddle.h"
#include "EXPAD_HyperShot.h"
#include "EXPAD_Keyboard.h"
#include "EXPAD_Supor_Keyboard.h"
#include "EXPAD_CrazyClimber.h"
#include "EXPAD_Toprider.h"
#include "EXPAD_SpaceShadowGun.h"

#include "EXPAD_FamlyTrainer.h"
#include "EXPAD_ExcitingBoxing.h"
#include "EXPAD_Mahjang.h"
#include "EXPAD_OekakidsTablet.h"
#include "EXPAD_TurboFile.h"

#include "EXPAD_VSUnisystem.h"
#include "EXPAD_VSZapper.h"

#include "EXPAD_Gyromite.h"

#endif	// !__PAD_INCLUDED__

