⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pad.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		case	EXCONTROLLER_PADDLE:
		case	EXCONTROLLER_SPACESHADOWGUN:
		case	EXCONTROLLER_OEKAKIDS_TABLET:
		case	EXCONTROLLER_VSZAPPER:
			{
			LONG	x, y;
				if( data & 0x80000000 ) {
					x = -1;
					y = -1;
				} else {
					x = data & 0xFF;
					y = (data&0xFF00)>>8;
				}
				expad->SetSyncData( 0, x );
				expad->SetSyncData( 1, y );
				nes->SetZapperPos( x, y );
				DirectDraw.SetZapperPos( x, y );
			}
			if( excontroller_select != EXCONTROLLER_SPACESHADOWGUN ) {
				if( data & 0x0010000 )
					expad->SetSyncData( 2, 1 );
				else
					expad->SetSyncData( 2, 0 );
			} else {
				expad->SetSyncData( 2, (BYTE)(data>>16) );
			}
			break;
		case	EXCONTROLLER_CRAZYCLIMBER:
			expad->SetSyncData( 0, (LONG)data );
			break;
		case	EXCONTROLLER_TOPRIDER:
			expad->SetSyncData( 0, (LONG)data );
			break;
		case	EXCONTROLLER_FAMILYTRAINER_A:
		case	EXCONTROLLER_FAMILYTRAINER_B:
			expad->SetSyncData( 0, (LONG)data );
			break;
		case	EXCONTROLLER_EXCITINGBOXING:
			expad->SetSyncData( 0, (LONG)data );
			break;
		case	EXCONTROLLER_MAHJANG:
			expad->SetSyncData( 0, (LONG)data );
			break;
		default:
			break;
	}
}

void	PAD::Sync()
{
	padbit[0] = SyncSub( 0 );
	padbit[1] = SyncSub( 1 );
	padbit[2] = SyncSub( 2 );
	padbit[3] = SyncSub( 3 );

	// Mic
	micbit = 0;
	if( Config.ButtonCheck( 1, 10 ) ) micbit |= 4;

	// For Excontroller
	if( expad ) {
		expad->Sync();
	}

	// For NSF
	NsfSub();
}

static	INT	ren30fps[] = {
	1, 0
};
static	INT	ren20fps[] = {
	1, 1, 0
};
static	INT	ren15fps[] = {
	1, 1, 0, 0
};
static	INT	ren10fps[] = {
	1, 1, 1, 0, 0, 0
};

static	INT	renmask[] = {
	6, 4, 3, 2,
};
static	INT*	rentbl[] = {
	ren10fps, ren15fps, ren20fps, ren30fps
};

BYTE	PAD::SyncSub( INT no )
{
WORD	bit = 0;

	// Up
	if( Config.ButtonCheck( no, 0 ) ) bit |= 1<<4;
	// Down
	if( Config.ButtonCheck( no, 1 ) ) bit |= 1<<5;
	// Left
	if( Config.ButtonCheck( no, 2 ) ) bit |= 1<<6;
	// Right
	if( Config.ButtonCheck( no, 3 ) ) bit |= 1<<7;

	// 摨帪擖椡傪嬛巭偡傞
	if( (bit&((1<<4)|(1<<5))) == ((1<<4)|(1<<5)) )
		bit &= ~((1<<4)|(1<<5));
	if( (bit&((1<<6)|(1<<7))) == ((1<<6)|(1<<7)) )
		bit &= ~((1<<6)|(1<<7));

	// A
	if( Config.ButtonCheck( no, 4 ) ) bit |= 1<<0;
	// B
	if( Config.ButtonCheck( no, 5 ) ) bit |= 1<<1;

	// A,B Rapid
	if( Config.ButtonCheck( no, 6 ) ) bit |= 1<<8;
	if( Config.ButtonCheck( no, 7 ) ) bit |= 1<<9;

	// Select
	if( Config.ButtonCheck( no, 8 ) ) bit |= 1<<2;
	// Start
	if( Config.ButtonCheck( no, 9 ) ) bit |= 1<<3;

	// A rapid setup
	if( bit&(1<<8) ) {
		INT	spd = Config.controller.nRapid[no][0];
		if( spd >= 3 ) spd = 3;
		INT*	tbl = rentbl[spd];

		if( padcnt[no][0] >= renmask[spd] )
			padcnt[no][0] = 0;

		if( tbl[padcnt[no][0]] )
			bit |= (1<<0);
		else
			bit &= ~(1<<0);

		padcnt[no][0]++;
	} else {
		padcnt[no][0] = 0;
	}
	// B rapid setup
	if( bit&(1<<9) ) {
		INT	spd = Config.controller.nRapid[no][1];
		if( spd >= 3 ) spd = 3;
		INT*	tbl = rentbl[spd];

		if( padcnt[no][1] >= renmask[spd] )
			padcnt[no][1] = 0;

		if( tbl[padcnt[no][1]] )
			bit |= (1<<1);
		else
			bit &= ~(1<<1);

		padcnt[no][1]++;
	} else {
		padcnt[no][1] = 0;
	}

	return	(BYTE)(bit&0xFF);
}

void	PAD::Strobe()
{
	// For VS-Unisystem
	if( nes->rom->IsVSUNISYSTEM() ) {
		DWORD	pad1 = (DWORD)padbit[0] & 0xF3;
		DWORD	pad2 = (DWORD)padbit[1] & 0xF3;
		DWORD	st1  = ((DWORD)padbit[0] & 0x08)>>3;
		DWORD	st2  = ((DWORD)padbit[1] & 0x08)>>3;

		switch( nVSSwapType ) {
			case	VS_TYPE0:
				pad1bit = pad1 | (st1<<2);
				pad2bit = pad2 | (st2<<2);
				break;
			case	VS_TYPE1:
				pad1bit = pad2 | (st1<<2);
				pad2bit = pad1 | (st2<<2);
				break;
			case	VS_TYPE2:
				pad1bit = pad1 | (st1<<2) | (st2<<3);
				pad2bit = pad2;
				break;
			case	VS_TYPE3:
				pad1bit = pad2 | (st1<<2) | (st2<<3);
				pad2bit = pad1;
				break;
			case	VS_TYPE4:
				pad1bit = pad1 | (st1<<2) | 0x08;	// 0x08=Start Protect
				pad2bit = pad2 | (st2<<2) | 0x08;	// 0x08=Start Protect
				break;
			case	VS_TYPE5:
				pad1bit = pad2 | (st1<<2) | 0x08;	// 0x08=Start Protect
				pad2bit = pad1 | (st2<<2) | 0x08;	// 0x08=Start Protect
				break;
			case	VS_TYPE6:
				pad1bit = pad1 | (st1<<2) | (((DWORD)padbit[0] & 0x04)<<1);
				pad2bit = pad2 | (st2<<2) | (((DWORD)padbit[1] & 0x04)<<1);
				break;
			case	VS_TYPEZ:
				pad1bit = 0;
				pad2bit = 0;
				break;
		}

		// Coin 2偲旐傞堊偵徚偡
		micbit  = 0;
	} else {
		if( Config.emulator.bFourPlayer ) {
		// NES type
			pad1bit = (DWORD)padbit[0] | ((DWORD)padbit[2]<<8) | 0x00080000;
			pad2bit = (DWORD)padbit[1] | ((DWORD)padbit[3]<<8) | 0x00040000;
		} else {
		// Famicom type
			pad1bit = (DWORD)padbit[0];
			pad2bit = (DWORD)padbit[1];
		}
	}
	pad3bit = (DWORD)padbit[2];
	pad4bit = (DWORD)padbit[3];
}

BYTE	PAD::Read( WORD addr )
{
BYTE	data = 0x00;

	if( addr == 0x4016 ) {
		data = (BYTE)pad1bit&1;
		pad1bit>>=1;
		data |= ((BYTE)pad3bit&1)<<1;
		pad3bit>>=1;
		// Mic
		if( !nes->rom->IsVSUNISYSTEM() ) {
			data |= micbit;
		}
		if( expad ) {
			data |= expad->Read4016();
		}
	}
	if( addr == 0x4017 ) {
		data = (BYTE)pad2bit&1;
		pad2bit>>=1;
		data |= ((BYTE)pad4bit&1)<<1;
		pad4bit>>=1;

		if( expad ) {
			data |= expad->Read4017();
		}

		if( bBarcodeWorld ) {
			data |= nes->Barcode2();
		}
	}

	return	data;
}

void	PAD::Write( WORD addr, BYTE data )
{
	if( addr == 0x4016 ) {
		if( data&0x01 ) {
			bStrobe = TRUE;
		} else if( bStrobe ) {
			bStrobe = FALSE;

			Strobe();
			if( expad ) {
				expad->Strobe();
			}
		}

		if( expad ) {
			expad->Write4016( data );
		}
	}
	if( addr == 0x4017 ) {
		if( expad ) {
			expad->Write4017( data );
		}
	}
}

void	PAD::NsfSub()
{
	nsfbit = 0;

	// Play
	if( Config.ButtonCheck( 0, Config.controller.nNsfButton ) ) nsfbit |= 1<<0;
	// Stop
	if( Config.ButtonCheck( 1, Config.controller.nNsfButton ) ) nsfbit |= 1<<1;

	// Number -1
	if( Config.ButtonCheck( 2, Config.controller.nNsfButton ) ) nsfbit |= 1<<2;
	// Number +1
	if( Config.ButtonCheck( 3, Config.controller.nNsfButton ) ) nsfbit |= 1<<3;
	// Number -16
	if( Config.ButtonCheck( 4, Config.controller.nNsfButton ) ) nsfbit |= 1<<4;
	// Number +16
	if( Config.ButtonCheck( 5, Config.controller.nNsfButton ) ) nsfbit |= 1<<5;

	// 摨帪擖椡傪嬛巭偡傞
	if( (nsfbit&((1<<2)|(1<<3))) == ((1<<2)|(1<<3)) )
		nsfbit &= ~((1<<2)|(1<<3));
	if( (nsfbit&((1<<4)|(1<<5))) == ((1<<4)|(1<<5)) )
		nsfbit &= ~((1<<4)|(1<<5));
}

#include "EXPAD_Zapper.cpp"
#include "EXPAD_Paddle.cpp"
#include "EXPAD_HyperShot.cpp"
#include "EXPAD_Keyboard.cpp"
#include "EXPAD_CrazyClimber.cpp"
#include "EXPAD_Toprider.cpp"
#include "EXPAD_SpaceShadowGun.cpp"

#include "EXPAD_FamlyTrainer.cpp"
#include "EXPAD_ExcitingBoxing.cpp"
#include "EXPAD_Mahjang.cpp"
#include "EXPAD_OekakidsTablet.cpp"
#include "EXPAD_TurboFile.cpp"

#include "EXPAD_VSUnisystem.cpp"
#include "EXPAD_VSZapper.cpp"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -