Previous 199869 Revisions Next

r23728 Saturday 15th June, 2013 at 19:15:14 UTC by Fabio Priuli
(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]
[src/mess/drivers]nes.c
[src/mess/includes]nes.h
[src/mess/machine]nes.c

trunk/src/mess/drivers/nes.c
r23727r23728
7878   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)              PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
7979   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)              PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
8080   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)             PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0010)
81
8281INPUT_PORTS_END
8382
8483static INPUT_PORTS_START( nes_pads34 )
r23727r23728
101100   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4)              PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
102101   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4)              PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
103102   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4)             PORT_CONDITION("CTRLSEL", 0xf000, EQUALS, 0x1000)
103INPUT_PORTS_END
104104
105
106static INPUT_PORTS_START( nes_powerpad )
107// difference between the two sides is that we mirror the key mapping to match the real pad layout!
108   PORT_START("POWERPAD1")
109// side A layout
110   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Top1")  PORT_CODE(KEYCODE_Y) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
111   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
112   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid1")  PORT_CODE(KEYCODE_J) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
113   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
114   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid2")  PORT_CODE(KEYCODE_H) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
115   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Low1")  PORT_CODE(KEYCODE_N) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
116   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Low2")  PORT_CODE(KEYCODE_B) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
117   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid3")  PORT_CODE(KEYCODE_G) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
118// side B layout
119   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 2")     PORT_CODE(KEYCODE_T) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
120   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 1")     PORT_CODE(KEYCODE_R) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
121   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 5")     PORT_CODE(KEYCODE_F) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
122   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 9")     PORT_CODE(KEYCODE_V) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
123   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 6")     PORT_CODE(KEYCODE_G) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
124   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 10")    PORT_CODE(KEYCODE_B) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
125   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 11")    PORT_CODE(KEYCODE_N) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
126   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 7")     PORT_CODE(KEYCODE_H) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
127   PORT_START("POWERPAD2")
128// side A layout
129   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
130   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Top2")  PORT_CODE(KEYCODE_T) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
131   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
132   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad Mid4")  PORT_CODE(KEYCODE_F) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
133   PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0050)
134// side B layout
135   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 4")     PORT_CODE(KEYCODE_U) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
136   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 3")     PORT_CODE(KEYCODE_Y) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
137   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 12")    PORT_CODE(KEYCODE_M) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
138   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("PowerPad 8")     PORT_CODE(KEYCODE_J) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
139   PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )                                                  PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0060)
105140INPUT_PORTS_END
106141
107142static INPUT_PORTS_START( nes_zapper1 )
r23727r23728
132167static INPUT_PORTS_START( nes )
133168   PORT_INCLUDE( nes_pads12 )
134169   PORT_INCLUDE( nes_pads34 )
170   PORT_INCLUDE( nes_powerpad )
135171   PORT_INCLUDE( nes_zapper1 )
136172   PORT_INCLUDE( nes_zapper2 )
137173   PORT_INCLUDE( nes_paddle )
r23727r23728
146182   PORT_CONFSETTING(  0x0010, "Gamepad" )
147183   PORT_CONFSETTING(  0x0020, "Zapper" )
148184   PORT_CONFSETTING(  0x0040, "Arkanoid paddle" )
149//  PORT_CONFSETTING(  0x0050, "Family Trainer" )
185   PORT_CONFSETTING(  0x0050, "Power Pad (Side A layout)" )
186   PORT_CONFSETTING(  0x0060, "Power Pad (Side B layout)" )
150187   PORT_CONFNAME( 0x0f00, 0x0000, "P3 Controller")
151188   PORT_CONFSETTING(  0x0000, "Unconnected" )
152189   PORT_CONFSETTING(  0x0100, "Gamepad" )
r23727r23728
192229   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)              PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
193230   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)              PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
194231   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)             PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x00f0)
195
196232INPUT_PORTS_END
197233
198234static INPUT_PORTS_START( fc_pads34 )
trunk/src/mess/machine/nes.c
r23727r23728
121121   m_io_zapper2_t      = ioport("ZAPPER2_T");
122122   m_io_zapper2_x      = ioport("ZAPPER2_X");
123123   m_io_zapper2_y      = ioport("ZAPPER2_Y");
124   m_io_powerpad[0]    = ioport("POWERPAD1");
125   m_io_powerpad[1]    = ioport("POWERPAD2");
124126
125127   address_space &space = m_maincpu->space(AS_PROGRAM);
126128
r23727r23728
292294      m_paddle_latch <<= 1;
293295      m_paddle_latch &= 0xff;
294296   }
295
297   
298   // powerpad
299   if ((cfg & 0x00f0) == 0x0050 || (cfg & 0x00f0) == 0x0060)
300   {
301      ret |= ((m_powerpad_latch[0] & 0x01) << 3);
302      ret |= ((m_powerpad_latch[1] & 0x01) << 4);
303      m_powerpad_latch[0] >>= 1;
304      m_powerpad_latch[1] >>= 1;
305   }
306   
296307   if (LOG_JOY)
297308      logerror("joy 1 read, val: %02x, pc: %04x\n", ret, space.device().safe_pc());
298309
r23727r23728
323334   m_zapper_latch[1][2] = 0;
324335   m_paddle_btn_latch = 0;
325336   m_paddle_latch = 0;
337   m_powerpad_latch[0] = 0;
338   m_powerpad_latch[1] = 0;
326339   
327340   // P1 inputs
328341   switch (cfg & 0x000f)
r23727r23728
355368         m_paddle_btn_latch = m_io_paddle_btn->read();
356369         m_paddle_latch = (UINT8) (m_io_paddle->read() ^ 0xff);
357370         break;
371         
372      case 0x05:  // power pad
373      case 0x06:  // power pad
374         m_powerpad_latch[0] = m_io_powerpad[0]->read();
375         m_powerpad_latch[1] = m_io_powerpad[1]->read() | 0xf0;
376         break;
358377   }
359378
360379   // P3 & P4 inputs in NES Four Score are read serially with P1 & P2
trunk/src/mess/includes/nes.h
r23727r23728
470470   ioport_port       *m_io_fckey[9];
471471   ioport_port       *m_io_subkey[13];
472472   ioport_port       *m_io_pad[4];
473   ioport_port       *m_io_powerpad[2];
473474   ioport_port       *m_io_mahjong[4];
474475   ioport_port       *m_io_cc_left;
475476   ioport_port       *m_io_cc_right;
r23727r23728
559560   UINT8 m_mjpanel_latch;
560561   UINT8 m_fck_scan, m_fck_mode;
561562   UINT8 m_mic_obstruct;
563   UINT8 m_powerpad_latch[2];
562564
563565protected:
564566   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team