AxibugEmuOnline/References/virtuanessrc097-master/NES/PadEX/EXPAD_Toprider.cpp
2024-08-05 17:58:53 +08:00

209 lines
11 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//////////////////////////////////////////////////////////////////////////
// Toprider //
//////////////////////////////////////////////////////////////////////////
void EXPAD_Toprider::Reset()
{
rider_bita = 0;
rider_bitb = 0;
rider_pos = 0;
rider_accel = 0;
rider_brake = 0;
rider_button = 0;
}
void EXPAD_Toprider::Write4016( BYTE data )
{
if( data & 0x01 ) {
rider_bita = rider_bitb = 0;
if( rider_pos > 0 ) {
// RIGHT
if( rider_pos > 0x10 ) {
rider_bita |= (1<<1)|(1<<3);
} else if( rider_pos > 0x0A ) {
rider_bita |= (1<<1)|(0<<3);
} else if( rider_pos > 0x04 ) {
rider_bita |= (0<<1)|(1<<3);
}
} else {
// LEFT
if( rider_pos < -0x10 ) {
rider_bita |= (1<<2)|(1<<4);
} else if( rider_pos < -0x0A ) {
rider_bita |= (1<<2)|(0<<4);
} else if( rider_pos < -0x04 ) {
rider_bita |= (0<<2)|(1<<4);
}
}
if( rider_accel > 0x08 || rider_brake < 0x08 ) {
if( rider_accel > 0x10 ) {
rider_bitb |= (1<<0);
} else if( rider_accel > 0x0A ) {
rider_bitb |= (1<<4);
} else if( rider_accel > 0x04 ) {
rider_bitb |= (1<<5);
}
} else {
rider_bita |= (1<<5);
if( rider_brake > 0x10 ) {
rider_bitb |= (1<<1);
} else if( rider_brake > 0x0A ) {
rider_bitb |= (1<<2);
} else if( rider_brake > 0x04 ) {
rider_bitb |= (1<<3);
}
}
// ウイリー
if( rider_button&0x01 )
rider_bita |= 0x80;
// SHIFT(Toggle)
if( rider_button&0x80 )
rider_bita |= 0x40;
// START,SELECT
if( rider_button&0x10 )
rider_bitb |= 0x40;
if( rider_button&0x20 )
rider_bitb |= 0x80;
}
}
BYTE EXPAD_Toprider::Read4017()
{
BYTE data = 0;
data |= (rider_bita&0x01)<<4;
data |= (rider_bitb&0x01)<<3;
rider_bita >>= 1;
rider_bitb >>= 1;
return data;
}
void EXPAD_Toprider::Sync()
{
BYTE bit = 0;
// Up
if( Config.controller.nButton[0][ 0] && DirectInput.m_Sw[Config.controller.nButton[0][ 0]]
|| Config.controller.nButton[0][16] && DirectInput.m_Sw[Config.controller.nButton[0][16]] )
bit |= 1<<4;
// Down
if( Config.controller.nButton[0][ 1] && DirectInput.m_Sw[Config.controller.nButton[0][ 1]]
|| Config.controller.nButton[0][17] && DirectInput.m_Sw[Config.controller.nButton[0][17]] )
bit |= 1<<5;
// Left
if( Config.controller.nButton[0][ 2] && DirectInput.m_Sw[Config.controller.nButton[0][ 2]]
|| Config.controller.nButton[0][18] && DirectInput.m_Sw[Config.controller.nButton[0][18]] )
bit |= 1<<6;
// Right
if( Config.controller.nButton[0][ 3] && DirectInput.m_Sw[Config.controller.nButton[0][ 3]]
|| Config.controller.nButton[0][19] && DirectInput.m_Sw[Config.controller.nButton[0][19]] )
bit |= 1<<7;
// 左右同時入力を禁止する
if( (bit&((1<<6)|(1<<7))) == ((1<<6)|(1<<7)) )
bit &= ~((1<<6)|(1<<7));
// A,B
if( Config.controller.nButton[0][ 4] && DirectInput.m_Sw[Config.controller.nButton[0][ 4]]
|| Config.controller.nButton[0][20] && DirectInput.m_Sw[Config.controller.nButton[0][20]] )
bit |= 1<<0;
if( Config.controller.nButton[0][ 5] && DirectInput.m_Sw[Config.controller.nButton[0][ 5]]
|| Config.controller.nButton[0][21] && DirectInput.m_Sw[Config.controller.nButton[0][21]] )
bit |= 1<<1;
// Start, Select
if( Config.controller.nButton[0][ 8] && DirectInput.m_Sw[Config.controller.nButton[0][ 8]]
|| Config.controller.nButton[0][24] && DirectInput.m_Sw[Config.controller.nButton[0][24]] )
bit |= 1<<2;
if( Config.controller.nButton[0][ 9] && DirectInput.m_Sw[Config.controller.nButton[0][ 9]]
|| Config.controller.nButton[0][25] && DirectInput.m_Sw[Config.controller.nButton[0][25]] )
bit |= 1<<3;
if( !(bit & ((1<<6)|(1<<7))) ) {
// To center...
if( rider_pos ) {
rider_pos += (rider_pos>0)?-1:1;
}
} else if( bit & (1<<6) ) {
// LEFT
rider_pos -= (rider_pos>-0x18)?1:0;
} else if( bit & (1<<7) ) {
// RIGHT
rider_pos += (rider_pos<0x18)?1:0;
}
// Brake(A)
if( bit & (1<<0) ) {
rider_brake += (rider_brake<0x18)?1:0;
} else {
rider_brake -= (rider_brake>0)?1:0;
}
// Accel(B)
if( bit & (1<<1) ) {
rider_accel += (rider_accel<0x18)?1:0;
} else {
rider_accel -= (rider_accel>0)?1:0;
}
rider_button &= 0xC0;
// Shift(UP)(Toggle)
if( bit & (1<<4) ) {
if( !(rider_button&0x40) ) {
if( rider_button&0x80 ) {
rider_button &= ~0x80;
} else {
rider_button |= 0x80;
}
}
}
// old
if( bit & (1<<4) )
rider_button |= 0x40;
else
rider_button &= ~0x40;
// Willey(DOWN)
if( bit & (1<<5) )
rider_button |= 0x01;
// Start, Select
if( bit & (1<<2) )
rider_button |= 0x20;
if( bit & (1<<3) )
rider_button |= 0x10;
#if 0
DEBUGOUT( "RIDER POS=%d\n", rider_pos );
DEBUGOUT( "RIDER ACC=%d\n", rider_accel );
DEBUGOUT( "RIDER BRK=%d\n", rider_brake );
DEBUGOUT( "RIDER BTN=%02X\n", rider_button );
#endif
}
void EXPAD_Toprider::SetSyncData( INT type, LONG data )
{
rider_pos = (INT)((SBYTE)( data &0x000000FF));
rider_accel = (INT)((SBYTE)((data>> 8)&0x000000FF));
rider_brake = (INT)((SBYTE)((data>>16)&0x000000FF));
rider_button = (BYTE)(data>>24);
#if 0
DEBUGOUT( "RIDER POS=%d\n", rider_pos );
DEBUGOUT( "RIDER ACC=%d\n", rider_accel );
DEBUGOUT( "RIDER BRK=%d\n", rider_brake );
DEBUGOUT( "RIDER BTN=%02X\n", rider_button );
#endif
}
LONG EXPAD_Toprider::GetSyncData( INT type )
{
LONG data = 0;
data = (rider_pos&0xFF)|
((rider_accel&0xFF)<< 8)|
((rider_brake&0xFF)<<16)|
(rider_button<<24);
return data;
}