summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hh_pic16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/hh_pic16.cpp')
-rw-r--r--src/mame/drivers/hh_pic16.cpp196
1 files changed, 185 insertions, 11 deletions
diff --git a/src/mame/drivers/hh_pic16.cpp b/src/mame/drivers/hh_pic16.cpp
index 8607192872f..1bd057aa97d 100644
--- a/src/mame/drivers/hh_pic16.cpp
+++ b/src/mame/drivers/hh_pic16.cpp
@@ -13,6 +13,7 @@
@033 1655A 1979, Toytronic Football (newer)
@036 1655A 1979, Ideal Maniac
@043 1655A 1979, Caprice Pro-Action Baseball
+ @049 1655A 1980, Kingsford Match Me(?)/Mini Match Me
@051 1655A 1979, Tandy Electronic Basketball
@053 1655A 1979, Atari Touch Me
@0?? 1655A 1979, Tiger Half Court Computer Basketball/Sears Electronic Basketball (custom label)
@@ -20,6 +21,7 @@
*081 1655A 19??, Ramtex Space Invaders/Block Buster
@094 1655A 1980, GAF Melody Madness
@110 1650A 1979, Tiger/Tandy Rocket Pinball
+ *123 1655A? 1980, Kingsford Match Me/Mini Match Me
@133 1650A 1981, U.S. Games Programmable Baseball/Tandy 2-Player Baseball
@144 1650A 1981, U.S. Games/Tandy 2-Player Football
*192 1650 19??, <unknown> phone dialer (have dump)
@@ -55,6 +57,7 @@
#include "leboom.lh" // clickable
#include "maniac.lh" // clickable
#include "melodym.lh" // clickable
+#include "matchme.lh" // clickable
#include "rockpin.lh"
#include "tbaskb.lh"
#include "touchme.lh" // clickable
@@ -95,7 +98,8 @@ public:
u8 m_d; // " D
u16 m_inp_mux; // multiplexed inputs mask
- u16 read_inputs(int columns);
+ u16 read_inputs(int columns, u16 colmask = ~0);
+ u8 read_rotated_inputs(int columns, u8 rowmask = ~0);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@@ -242,10 +246,10 @@ void hh_pic16_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool
// generic input handlers
-u16 hh_pic16_state::read_inputs(int columns)
+u16 hh_pic16_state::read_inputs(int columns, u16 colmask)
{
// active low
- u16 ret = ~0;
+ u16 ret = ~0 & colmask;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -255,6 +259,20 @@ u16 hh_pic16_state::read_inputs(int columns)
return ret;
}
+u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask)
+{
+ u8 ret = 0;
+ u16 colmask = (1 << columns) - 1;
+
+ // read selected input columns
+ for (int i = 0; i < 8; i++)
+ if (1 << i & rowmask && ~m_inp_matrix[i]->read() & ~m_inp_mux & colmask)
+ ret |= 1 << i;
+
+ // active low
+ return ~ret & rowmask;
+}
+
/***************************************************************************
@@ -307,7 +325,7 @@ void touchme_state::update_speaker()
READ8_MEMBER(touchme_state::read_a)
{
// A: multiplexed inputs
- return read_inputs(3) & 0xf;
+ return read_inputs(3, 0xf);
}
WRITE8_MEMBER(touchme_state::write_b)
@@ -350,7 +368,7 @@ static INPUT_PORTS_START( touchme )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green Button")
PORT_START("IN.2") // B2 port A
- PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select")
+ PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select" )
PORT_CONFSETTING( 0x01^0x07, "1" )
PORT_CONFSETTING( 0x02^0x07, "2" )
PORT_CONFSETTING( 0x04^0x07, "3" )
@@ -523,7 +541,7 @@ WRITE8_MEMBER(melodym_state::write_b)
READ8_MEMBER(melodym_state::read_c)
{
// C0-C4: multiplexed inputs
- return read_inputs(5) | 0xe0;
+ return read_inputs(5, 0x1f) | 0xe0;
}
WRITE8_MEMBER(melodym_state::write_c)
@@ -704,6 +722,154 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Kingsford Match Me
+ * PIC 1655A-049
+ * 8 lamps, 1-bit sound
+
+ Known releases:
+ - USA(1): Match Me/Mini Match Me(latter is the handheld version, same game)
+ - USA(2): Me Too, published by Talbot
+
+ Known revisions:
+ - PIC 1655A-049 (this one, dumped from a Mini Match Me)
+ - PIC 1655A-123 (seen in Match Me and Mini Match Me)
+
+***************************************************************************/
+
+class matchme_state : public hh_pic16_state
+{
+public:
+ matchme_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_pic16_state(mconfig, type, tag)
+ { }
+
+ DECLARE_WRITE8_MEMBER(write_b);
+ DECLARE_WRITE8_MEMBER(write_c);
+ DECLARE_READ8_MEMBER(read_c);
+
+ void set_clock();
+ DECLARE_INPUT_CHANGED_MEMBER(speed_switch);
+
+protected:
+ virtual void machine_reset() override;
+};
+
+// handlers
+
+WRITE8_MEMBER(matchme_state::write_b)
+{
+ // B0-B7: lamps
+ display_matrix(8, 1, data, 1);
+}
+
+READ8_MEMBER(matchme_state::read_c)
+{
+ // C0-C3: multiplexed inputs from C4-C6
+ m_inp_mux = m_c >> 4 & 7;
+ u8 lo = read_inputs(3, 0xf);
+
+ // C4-C6: multiplexed inputs from C0-C3
+ m_inp_mux = m_c & 0xf;
+ u8 hi = read_rotated_inputs(4, 7);
+
+ return lo | hi << 4 | 0x80;
+}
+
+WRITE8_MEMBER(matchme_state::write_c)
+{
+ // C0-C6: input mux
+ m_c = data;
+
+ // C7: speaker out + RTCC pin
+ m_speaker->level_w(data >> 7 & 1);
+ m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 7 & 1);
+}
+
+// config
+
+static INPUT_PORTS_START( matchme )
+ PORT_START("IN.0") // C4 port C
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // purple
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pink
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // yellow
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // blue
+
+ PORT_START("IN.1") // C5 port C
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) // red
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) // cyan
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) // orange
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) // green
+
+ PORT_START("IN.2") // C6 port C
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START )
+ PORT_BIT( 0x02, 0x02, IPT_SPECIAL ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x03) // Last/Auto
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Long")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN.3") // port A
+ PORT_CONFNAME( 0x07, 0x00^0x07, "Game" )
+ PORT_CONFSETTING( 0x00^0x07, "1" )
+ PORT_CONFSETTING( 0x01^0x07, "2" )
+ PORT_CONFSETTING( 0x02^0x07, "3" )
+ PORT_CONFSETTING( 0x04^0x07, "4" )
+ PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) )
+ PORT_CONFSETTING( 0x08, "Amateur" ) // AMR
+ PORT_CONFSETTING( 0x00, "Professional" ) // PRO
+
+ PORT_START("IN.4") // another fake
+ PORT_CONFNAME( 0x01, 0x00, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, matchme_state, speed_switch, nullptr)
+ PORT_CONFSETTING( 0x00, DEF_STR( Low ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( High ) )
+
+ PORT_START("FAKE") // Last/Auto are electronically the same button
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Last")
+ PORT_CONFNAME( 0x02, 0x02, "Music" )
+ PORT_CONFSETTING( 0x02, "Manual" )
+ PORT_CONFSETTING( 0x00, "Auto" )
+INPUT_PORTS_END
+
+INPUT_CHANGED_MEMBER(matchme_state::speed_switch)
+{
+ set_clock();
+}
+
+void matchme_state::set_clock()
+{
+ // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a
+ // 10pF cap to speed it up by about 7.5%.
+ m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 1300000 : 1200000);
+}
+
+void matchme_state::machine_reset()
+{
+ hh_pic16_state::machine_reset();
+ set_clock();
+}
+
+static MACHINE_CONFIG_START( matchme )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", PIC1655, 1200000) // see set_clock
+ MCFG_PIC16C5x_READ_A_CB(IOPORT("IN.3"))
+ MCFG_PIC16C5x_WRITE_B_CB(WRITE8(matchme_state, write_b))
+ MCFG_PIC16C5x_READ_C_CB(READ8(matchme_state, read_c))
+ MCFG_PIC16C5x_WRITE_C_CB(WRITE8(matchme_state, write_c))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_pic16_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_matchme)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
Lakeside Le Boom
* PIC 1655A-061
* 1 led, 1-bit sound with RC circuit for volume decay
@@ -764,7 +930,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(leboom_state::speaker_decay_sim)
READ8_MEMBER(leboom_state::read_a)
{
// A: multiplexed inputs
- return read_inputs(6) & 0xf;
+ return read_inputs(6, 0xf);
}
WRITE8_MEMBER(leboom_state::write_b)
@@ -894,7 +1060,7 @@ void tbaskb_state::prepare_display()
READ8_MEMBER(tbaskb_state::read_a)
{
// A2: skill switch, A3: multiplexed inputs
- return m_inp_matrix[5]->read() | read_inputs(5) | 3;
+ return m_inp_matrix[5]->read() | read_inputs(5, 8) | 3;
}
WRITE8_MEMBER(tbaskb_state::write_b)
@@ -1119,7 +1285,7 @@ void hccbaskb_state::prepare_display()
READ8_MEMBER(hccbaskb_state::read_a)
{
// A2: skill switch, A3: multiplexed inputs
- return m_inp_matrix[5]->read() | read_inputs(5) | 3;
+ return m_inp_matrix[5]->read() | read_inputs(5, 8) | 3;
}
WRITE8_MEMBER(hccbaskb_state::write_b)
@@ -1237,7 +1403,7 @@ void ttfball_state::prepare_display()
READ8_MEMBER(ttfball_state::read_a)
{
// A3: multiplexed inputs, A0-A2: other inputs
- return m_inp_matrix[5]->read() | read_inputs(5);
+ return m_inp_matrix[5]->read() | read_inputs(5, 8);
}
WRITE8_MEMBER(ttfball_state::write_b)
@@ -1490,7 +1656,7 @@ void us2pfball_state::prepare_display()
READ8_MEMBER(us2pfball_state::read_a)
{
// A0,A1: multiplexed inputs, A4-A7: other inputs
- return (read_inputs(4) & 3) | (m_inp_matrix[4]->read() & 0xf0) | 0x0c;
+ return read_inputs(4, 3) | (m_inp_matrix[4]->read() & 0xf0) | 0x0c;
}
WRITE8_MEMBER(us2pfball_state::write_a)
@@ -1616,6 +1782,12 @@ ROM_START( maniac )
ROM_END
+ROM_START( matchme )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) )
+ROM_END
+
+
ROM_START( leboom )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) )
@@ -1673,6 +1845,8 @@ CONS( 1980, melodym, 0, 0, melodym, melodym, melodym_state, 0, "GA
CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, 0, "Ideal", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, 0, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+
CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, 0, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, tbaskb, 0, 0, tbaskb, tbaskb, tbaskb_state, 0, "Tandy Radio Shack", "Electronic Basketball (Tandy)", MACHINE_SUPPORTS_SAVE )