📄 pad.cpp
字号:
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 + -