mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
(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:
parent
ce7fd3a5d4
commit
3a6394eb99
@ -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 )
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user