📄 pad.cpp
字号:
//////////////////////////////////////////////////////////////////////////
// //
// NES Pad //
// Norix //
// written 2001/02/22 //
// last modify ----/--/-- //
//////////////////////////////////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "typedef.h"
#include "macro.h"
#include "DebugOut.h"
#include "Config.h"
#include "DirectDraw.h"
#include "DirectInput.h"
#include "nes.h"
#include "mmu.h"
#include "cpu.h"
#include "ppu.h"
#include "pad.h"
#include "rom.h"
PAD::PAD( NES* parent ) : nes( parent )
{
excontroller_select = 0;
expad = NULL;
bStrobe = FALSE;
bSwapButton = FALSE;
bSwapPlayer = FALSE;
bZapperMode = FALSE;
nVSSwapType = VS_TYPE0;
padbit[0] = padbit[1] = padbit[2] = padbit[3] = 0;
micbit = 0;
}
PAD::~PAD()
{
DirectDraw.SetZapperMode( FALSE );
DirectDraw.SetZapperDrawMode( FALSE );
DELETEPTR( expad );
}
void PAD::Reset()
{
pad1bit = pad2bit = 0;
bStrobe = FALSE;
// if( !bZapperMode ) {
// bZapperMode = FALSE;
// }
bBarcodeWorld = FALSE;
ZEROMEMORY( padcnt, sizeof(padcnt) );
// Select Extension Devices
DWORD crc = nes->rom->GetPROM_CRC();
if( crc == 0xfbfc6a6c // Adventures of Bayou Billy, The(E)
|| crc == 0xcb275051 // Adventures of Bayou Billy, The(U)
|| crc == 0xfb69c131 // Baby Boomer(Unl)(U)
|| crc == 0xf2641ad0 // Barker Bill's Trick Shooting(U)
|| crc == 0xbc1dce96 // Chiller (Unl)(U)
|| crc == 0x90ca616d // Duck Hunt(JUE)
|| crc == 0x59e3343f // Freedom Force(U)
|| crc == 0x242a270c // Gotcha!(U)
|| crc == 0x7b5bd2de // Gumshoe(UE)
|| crc == 0x255b129c // Gun Sight(J)
|| crc == 0x8963ae6e // Hogan's Alley(JU)
|| crc == 0x51d2112f // Laser Invasion(U)
|| crc == 0x0a866c94 // Lone Ranger, The(U)
// || crc == 0xe4c04eea // Mad City(J)
|| crc == 0x9eef47aa // Mechanized Attack(U)
|| crc == 0xc2db7551 // Shooting Range(U)
|| crc == 0x163e86c0 // To The Earth(U)
|| crc == 0x0d3cf705 // Wild Gunman(J)
|| crc == 0x389960db ) { // Wild Gunman(JUE)
SetExController( EXCONTROLLER_ZAPPER );
}
if( crc == 0x35893b67 // Arkanoid(J)
|| crc == 0x6267fbd1 ) { // Arkanoid 2(J)
SetExController( EXCONTROLLER_PADDLE );
}
if( crc == 0xff6621ce // Hyper Olympic(J)
|| crc == 0xdb9418e8 // Hyper Olympic(Tonosama Ban)(J)
|| crc == 0xac98cd70 ) { // Hyper Sports(J)
SetExController( EXCONTROLLER_HYPERSHOT );
}
if( crc == 0xf9def527 // Family BASIC(Ver2.0)
|| crc == 0xde34526e // Family BASIC(Ver2.1a)
|| crc == 0xf050b611 // Family BASIC(Ver3)
|| crc == 0x3aaeed3f ) { // Family BASIC(Ver3)(Alt)
SetExController( EXCONTROLLER_KEYBOARD );
}
if( crc == 0xc68363f6 ) { // Crazy Climber(J)
SetExController( EXCONTROLLER_CRAZYCLIMBER );
}
if( crc == 0x20d22251 ) { // Top rider(J)
SetExController( EXCONTROLLER_TOPRIDER );
}
if( crc == 0x0cd00488 ) { // Space Shadow(J)
SetExController( EXCONTROLLER_SPACESHADOWGUN );
}
if( crc == 0x8c8fa83b // Family Trainer - Athletic World (J)
|| crc == 0x7e704a14 // Family Trainer - Jogging Race (J)
|| crc == 0x2330a5d3 ) { // Family Trainer - Rairai Kyonshiizu (J)
SetExController( EXCONTROLLER_FAMILYTRAINER_A );
}
if( crc == 0xf8da2506 // Family Trainer - Aerobics Studio (J)
|| crc == 0xca26a0f1 // Family Trainer - Dai Undoukai (J)
|| crc == 0x28068b8c // Family Trainer - Fuuun Takeshi Jou 2 (J)
|| crc == 0x10bb8f9a // Family Trainer - Manhattan Police (J)
|| crc == 0xad3df455 // Family Trainer - Meiro Dai Sakusen (J)
|| crc == 0x8a5b72c0 // Family Trainer - Running Stadium (J)
|| crc == 0x59794f2d ) { // Family Trainer - Totsugeki Fuuun Takeshi Jou (J)
SetExController( EXCONTROLLER_FAMILYTRAINER_B );
}
if( crc == 0x9fae4d46 // Ide Yousuke Meijin no Jissen Mahjong (J)
|| crc == 0x7b44fb2a ) { // Ide Yousuke Meijin no Jissen Mahjong 2 (J)
SetExController( EXCONTROLLER_MAHJANG );
}
if( crc == 0x786148b6 ) { // Exciting Boxing (J)
SetExController( EXCONTROLLER_EXCITINGBOXING );
}
if( crc == 0xc3c0811d // Oeka Kids - Anpanman no Hiragana Daisuki (J)
|| crc == 0x9d048ea4 ) { // Oeka Kids - Anpanman to Oekaki Shiyou!! (J)
SetExController( EXCONTROLLER_OEKAKIDS_TABLET );
}
#if 0
if( crc == 0xe792de94 // Best Play - Pro Yakyuu (New) (J)
|| crc == 0xf79d684a // Best Play - Pro Yakyuu (Old) (J)
|| crc == 0xc2ef3422 // Best Play - Pro Yakyuu 2 (J)
|| crc == 0x974e8840 // Best Play - Pro Yakyuu '90 (J)
|| crc == 0xb8747abf // Best Play - Pro Yakyuu Special (J)
|| crc == 0x9fa1c11f // Castle Excellent (J)
|| crc == 0x0b0d4d1b // Derby Stallion - Zenkoku Ban (J)
|| crc == 0x728c3d98 // Downtown - Nekketsu Monogatari (J)
|| crc == 0xd68a6f33 // Dungeon Kid (J)
|| crc == 0x3a51eb04 // Fleet Commander (J)
|| crc == 0x7c46998b // Haja no Fuuin (J)
|| crc == 0x7e5d2f1a // Itadaki Street - Watashi no Mise ni Yottette (J)
|| crc == 0xcee5857b // Ninjara Hoi! (J)
|| crc == 0x50ec5e8b // Wizardry - Legacy of Llylgamyn (J)
|| crc == 0x343e9146 // Wizardry - Proving Grounds of the Mad Overlord (J)
|| crc == 0x33d07e45 ) { // Wizardry - The Knight of Diamonds (J)
SetExController( EXCONTROLLER_TURBOFILE );
}
#endif
if( crc == 0x67898319 ) { // Barcode World (J)
bBarcodeWorld = TRUE;
}
// VS-Unisystem
if( nes->rom->IsVSUNISYSTEM() ) {
if( crc == 0xff5135a3 // VS Hogan's Alley
|| crc == 0xed588f00 // VS Duck Hunt
|| crc == 0x17ae56be ) { // VS Freedom Force
SetExController( EXCONTROLLER_VSZAPPER );
} else {
SetExController( EXCONTROLLER_VSUNISYSTEM );
}
}
}
void PAD::SetExController( INT type )
{
excontroller_select = type;
DELETEPTR( expad );
bZapperMode = FALSE;
DirectDraw.SetZapperMode( FALSE );
DirectDraw.SetZapperDrawMode( FALSE );
// ExPad Instance create
switch( type ) {
case EXCONTROLLER_ZAPPER:
expad = new EXPAD_Zapper( nes );
bZapperMode = TRUE;
DirectDraw.SetZapperMode( TRUE );
DirectDraw.SetZapperDrawMode( TRUE );
break;
case EXCONTROLLER_PADDLE:
expad = new EXPAD_Paddle( nes );
DirectDraw.SetZapperMode( TRUE );
break;
case EXCONTROLLER_HYPERSHOT:
expad = new EXPAD_HyperShot( nes );
break;
case EXCONTROLLER_KEYBOARD:
expad = new EXPAD_Keyboard( nes );
break;
case EXCONTROLLER_CRAZYCLIMBER:
expad = new EXPAD_CrazyClimber( nes );
break;
case EXCONTROLLER_TOPRIDER:
expad = new EXPAD_Toprider( nes );
break;
case EXCONTROLLER_SPACESHADOWGUN:
expad = new EXPAD_SpaceShadowGun( nes );
bZapperMode = TRUE;
DirectDraw.SetZapperMode( TRUE );
DirectDraw.SetZapperDrawMode( TRUE );
break;
case EXCONTROLLER_FAMILYTRAINER_A:
case EXCONTROLLER_FAMILYTRAINER_B:
expad = new EXPAD_FamlyTrainer( nes );
break;
case EXCONTROLLER_EXCITINGBOXING:
expad = new EXPAD_ExcitingBoxing( nes );
break;
case EXCONTROLLER_MAHJANG:
expad = new EXPAD_Mahjang( nes );
break;
case EXCONTROLLER_OEKAKIDS_TABLET:
expad = new EXPAD_OekakidsTablet( nes );
DirectDraw.SetZapperMode( TRUE );
DirectDraw.SetZapperDrawMode( FALSE );
break;
case EXCONTROLLER_TURBOFILE:
expad = new EXPAD_TurboFile( nes );
break;
case EXCONTROLLER_VSUNISYSTEM:
expad = new EXPAD_VSUnisystem( nes );
break;
case EXCONTROLLER_VSZAPPER:
expad = new EXPAD_VSZapper( nes );
bZapperMode = TRUE;
DirectDraw.SetZapperMode( TRUE );
DirectDraw.SetZapperDrawMode( TRUE );
break;
default:
break;
}
if( expad ) {
expad->Reset();
}
}
DWORD PAD::GetSyncData()
{
DWORD ret;
ret = (DWORD)padbit[0]|((DWORD)padbit[1]<<8)|((DWORD)padbit[2]<<16)|((DWORD)padbit[3]<<24);
ret |= (DWORD)micbit<<8;
return ret;
}
void PAD::SetSyncData( DWORD data )
{
micbit = (BYTE)((data&0x00000400)>>8);
padbit[0] = (BYTE) data;
padbit[1] = (BYTE)(data>> 8);
padbit[2] = (BYTE)(data>>16);
padbit[3] = (BYTE)(data>>24);
}
DWORD PAD::GetSyncExData()
{
DWORD data = 0;
switch( excontroller_select ) {
case EXCONTROLLER_ZAPPER:
case EXCONTROLLER_PADDLE:
case EXCONTROLLER_SPACESHADOWGUN:
case EXCONTROLLER_OEKAKIDS_TABLET:
case EXCONTROLLER_VSZAPPER:
{
LONG x, y;
x = expad->GetSyncData( 0 );
y = expad->GetSyncData( 1 );
if( x == -1 || y == -1 ) {
data = 0x80000000;
} else {
data = (x&0xFF)|((y&0xFF)<<8);
}
}
if( excontroller_select != EXCONTROLLER_SPACESHADOWGUN ) {
if( expad->GetSyncData( 2 ) )
data |= 0x0010000;
} else {
data |= (DWORD)expad->GetSyncData( 2 )<<16;
}
break;
case EXCONTROLLER_CRAZYCLIMBER:
data = (DWORD)expad->GetSyncData( 0 );
break;
case EXCONTROLLER_TOPRIDER:
data = (DWORD)expad->GetSyncData( 0 );
break;
case EXCONTROLLER_FAMILYTRAINER_A:
case EXCONTROLLER_FAMILYTRAINER_B:
data = (DWORD)expad->GetSyncData( 0 );
break;
case EXCONTROLLER_EXCITINGBOXING:
data = (DWORD)expad->GetSyncData( 0 );
break;
case EXCONTROLLER_MAHJANG:
data = (DWORD)expad->GetSyncData( 0 );
break;
default:
break;
}
return data;
}
void PAD::SetSyncExData( DWORD data )
{
//DEBUGOUT( "PAD::SetSyncExData\n" );
switch( excontroller_select ) {
case EXCONTROLLER_ZAPPER:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -