summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/hh_melps4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/hh_melps4.c')
-rw-r--r--src/mess/drivers/hh_melps4.c79
1 files changed, 77 insertions, 2 deletions
diff --git a/src/mess/drivers/hh_melps4.c b/src/mess/drivers/hh_melps4.c
index 737f937b4f8..2fc3291e383 100644
--- a/src/mess/drivers/hh_melps4.c
+++ b/src/mess/drivers/hh_melps4.c
@@ -29,7 +29,7 @@ public:
// devices
required_device<cpu_device> m_maincpu;
- optional_ioport_array<2> m_inp_matrix; // max 2
+ optional_ioport_array<4> m_inp_matrix; // max 4
optional_device<speaker_sound_device> m_speaker;
// misc common
@@ -226,20 +226,95 @@ public:
: hh_melps4_state(mconfig, type, tag)
{ }
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(plate_w);
+ DECLARE_WRITE16_MEMBER(grid_w);
+ DECLARE_WRITE_LINE_MEMBER(speaker_w);
+ DECLARE_READ16_MEMBER(input_r);
+
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button);
};
// handlers
+void cfrogger_state::prepare_display()
+{
+ UINT16 grid = BITSWAP16(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11);
+ UINT16 plate = BITSWAP16(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8);
+ display_matrix(16, 12, plate, grid);
+}
+
+WRITE8_MEMBER(cfrogger_state::plate_w)
+{
+ // Sx,Fx,Gx: vfd matrix plate
+ int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit
+ int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4;
+ m_plate = (m_plate & ~(mask << shift)) | (data << shift);
+ prepare_display();
+
+ // F0,F1: input mux
+ m_inp_mux = m_plate >> 8 & 3;
+}
+
+WRITE16_MEMBER(cfrogger_state::grid_w)
+{
+ // D0-D11: vfd matrix grid
+ m_grid = data;
+ prepare_display();
+}
+
+WRITE_LINE_MEMBER(cfrogger_state::speaker_w)
+{
+ // T: speaker out
+ m_speaker->level_w(state);
+}
+
+READ16_MEMBER(cfrogger_state::input_r)
+{
+ // K0,K1: multiplexed inputs
+ // K2: N/C
+ // K3: fixed input
+ return (m_inp_matrix[2]->read() & 8) | (read_inputs(2) & 3);
+}
+
// config
static INPUT_PORTS_START( cfrogger )
+ PORT_START("IN.0") // F0 port K
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+
+ PORT_START("IN.1") // F1 port K
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+
+ PORT_START("IN.2") // K3
+ PORT_CONFNAME( 0x08, 0x00, "Skill Level" )
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x08, "2" )
+
+ PORT_START("IN.3") // fake
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, cfrogger_state, reset_button, NULL)
INPUT_PORTS_END
+INPUT_CHANGED_MEMBER(cfrogger_state::reset_button)
+{
+ // reset button is directly tied to MCU reset pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
+
static MACHINE_CONFIG_START( cfrogger, cfrogger_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M58846, XTAL_600kHz)
+ MCFG_MELPS4_READ_K_CB(READ16(cfrogger_state, input_r))
+ MCFG_MELPS4_WRITE_S_CB(WRITE8(cfrogger_state, plate_w))
+ MCFG_MELPS4_WRITE_F_CB(WRITE8(cfrogger_state, plate_w))
+ MCFG_MELPS4_WRITE_G_CB(WRITE8(cfrogger_state, plate_w))
+ MCFG_MELPS4_WRITE_D_CB(WRITE16(cfrogger_state, grid_w))
+ MCFG_MELPS4_WRITE_T_CB(WRITELINE(cfrogger_state, speaker_w))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_melps4_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_hh_melps4_test)
@@ -270,4 +345,4 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
-CONS( 1981, cfrogger, 0, 0, cfrogger, cfrogger, driver_device, 0, "Coleco", "Frogger (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING )
+CONS( 1981, cfrogger, 0, 0, cfrogger, cfrogger, driver_device, 0, "Coleco", "Frogger (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
r>* version bump (nw)mame0210 Vas Crabb2019-05-301-2/+2 * version bump (nw)mame0209 Vas Crabb2019-04-241-2/+2 * version bump (nw)mame0208