diff options
Diffstat (limited to 'src/mame/drivers/hh_pic16.cpp')
-rw-r--r-- | src/mame/drivers/hh_pic16.cpp | 196 |
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 ) |