(MESS) nes.c: added emulation of the NES Power Pad controller,

to be enabled in Controller Port 2 through the Driver Configuration 
submenu, and mapped by default on TY,FGHJ,BN keys for side A
layout and RTYU,FGHJ,VBNM keys for side B. [Fabio Priuli]
This commit is contained in:
Fabio Priuli 2013-06-15 19:15:14 +00:00
parent ce7fd3a5d4
commit 3a6394eb99
3 changed files with 61 additions and 4 deletions

View File

@ -78,7 +78,6 @@ static INPUT_PORTS_START( nes_pads12 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
INPUT_PORTS_END
static INPUT_PORTS_START( nes_pads34 )
@ -101,7 +100,43 @@ static INPUT_PORTS_START( nes_pads34 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
INPUT_PORTS_END
static INPUT_PORTS_START( nes_powerpad )
// difference between the two sides is that we mirror the key mapping to match the real pad layout!
PORT_START("POWERPAD1")
// side A layout
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Top1") PORT_CODE(KEYCODE_Y) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid1") PORT_CODE(KEYCODE_J) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid2") PORT_CODE(KEYCODE_H) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Low1") PORT_CODE(KEYCODE_N) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Low2") PORT_CODE(KEYCODE_B) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid3") PORT_CODE(KEYCODE_G) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
// side B layout
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 2") PORT_CODE(KEYCODE_T) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 1") PORT_CODE(KEYCODE_R) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 5") PORT_CODE(KEYCODE_F) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 9") PORT_CODE(KEYCODE_V) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 6") PORT_CODE(KEYCODE_G) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 10") PORT_CODE(KEYCODE_B) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 11") PORT_CODE(KEYCODE_N) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 7") PORT_CODE(KEYCODE_H) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_START("POWERPAD2")
// side A layout
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Top2") PORT_CODE(KEYCODE_T) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid4") PORT_CODE(KEYCODE_F) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
// side B layout
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 4") PORT_CODE(KEYCODE_U) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 3") PORT_CODE(KEYCODE_Y) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 12") PORT_CODE(KEYCODE_M) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 8") PORT_CODE(KEYCODE_J) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
INPUT_PORTS_END
static INPUT_PORTS_START( nes_zapper1 )
@ -132,6 +167,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( nes )
PORT_INCLUDE( nes_pads12 )
PORT_INCLUDE( nes_pads34 )
PORT_INCLUDE( nes_powerpad )
PORT_INCLUDE( nes_zapper1 )
PORT_INCLUDE( nes_zapper2 )
PORT_INCLUDE( nes_paddle )
@ -146,7 +182,8 @@ static INPUT_PORTS_START( nes )
PORT_CONFSETTING( 0x0010, "Gamepad" )
PORT_CONFSETTING( 0x0020, "Zapper" )
PORT_CONFSETTING( 0x0040, "Arkanoid paddle" )
// PORT_CONFSETTING( 0x0050, "Family Trainer" )
PORT_CONFSETTING( 0x0050, "Power Pad (Side A layout)" )
PORT_CONFSETTING( 0x0060, "Power Pad (Side B layout)" )
PORT_CONFNAME( 0x0f00, 0x0000, "P3 Controller")
PORT_CONFSETTING( 0x0000, "Unconnected" )
PORT_CONFSETTING( 0x0100, "Gamepad" )
@ -192,7 +229,6 @@ static INPUT_PORTS_START( fc_pads12 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
INPUT_PORTS_END
static INPUT_PORTS_START( fc_pads34 )

View File

@ -470,6 +470,7 @@ public:
ioport_port *m_io_fckey[9];
ioport_port *m_io_subkey[13];
ioport_port *m_io_pad[4];
ioport_port *m_io_powerpad[2];
ioport_port *m_io_mahjong[4];
ioport_port *m_io_cc_left;
ioport_port *m_io_cc_right;
@ -559,6 +560,7 @@ public:
UINT8 m_mjpanel_latch;
UINT8 m_fck_scan, m_fck_mode;
UINT8 m_mic_obstruct;
UINT8 m_powerpad_latch[2];
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);

View File

@ -121,6 +121,8 @@ void nes_state::machine_start()
m_io_zapper2_t = ioport("ZAPPER2_T");
m_io_zapper2_x = ioport("ZAPPER2_X");
m_io_zapper2_y = ioport("ZAPPER2_Y");
m_io_powerpad[0] = ioport("POWERPAD1");
m_io_powerpad[1] = ioport("POWERPAD2");
address_space &space = m_maincpu->space(AS_PROGRAM);
@ -292,7 +294,16 @@ READ8_MEMBER(nes_state::nes_in1_r)
m_paddle_latch <<= 1;
m_paddle_latch &= 0xff;
}
// powerpad
if ((cfg & 0x00f0) == 0x0050 || (cfg & 0x00f0) == 0x0060)
{
ret |= ((m_powerpad_latch[0] & 0x01) << 3);
ret |= ((m_powerpad_latch[1] & 0x01) << 4);
m_powerpad_latch[0] >>= 1;
m_powerpad_latch[1] >>= 1;
}
if (LOG_JOY)
logerror("joy 1 read, val: %02x, pc: %04x\n", ret, space.device().safe_pc());
@ -323,6 +334,8 @@ WRITE8_MEMBER(nes_state::nes_in0_w)
m_zapper_latch[1][2] = 0;
m_paddle_btn_latch = 0;
m_paddle_latch = 0;
m_powerpad_latch[0] = 0;
m_powerpad_latch[1] = 0;
// P1 inputs
switch (cfg & 0x000f)
@ -355,6 +368,12 @@ WRITE8_MEMBER(nes_state::nes_in0_w)
m_paddle_btn_latch = m_io_paddle_btn->read();
m_paddle_latch = (UINT8) (m_io_paddle->read() ^ 0xff);
break;
case 0x05: // power pad
case 0x06: // power pad
m_powerpad_latch[0] = m_io_powerpad[0]->read();
m_powerpad_latch[1] = m_io_powerpad[1]->read() | 0xf0;
break;
}
// P3 & P4 inputs in NES Four Score are read serially with P1 & P2