summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hh_tms1k.cpp
diff options
context:
space:
mode:
author Firehawke <Firehawke@users.noreply.github.com>2017-12-13 21:31:27 -0700
committer Firehawke <Firehawke@users.noreply.github.com>2017-12-13 21:31:27 -0700
commit9ece34eb218c5c1960468294c733fd00ac7fa696 (patch)
tree7160ed8d2cbe2127aaaef0a21f8736403b0f8a7c /src/mame/drivers/hh_tms1k.cpp
parent54155441e9ba9941e85d80c4834a66376a11e791 (diff)
Revert "Revert "Merge branch 'master' of https://github.com/mamedev/mame""
This reverts commit 54155441e9ba9941e85d80c4834a66376a11e791.
Diffstat (limited to 'src/mame/drivers/hh_tms1k.cpp')
-rw-r--r--src/mame/drivers/hh_tms1k.cpp551
1 files changed, 524 insertions, 27 deletions
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 57ab1b33e11..d0dde07b070 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -5,9 +5,10 @@
This driver is a collection of simple dedicated handheld and tabletop
toys based around the TMS1000 MCU series. Anything more complex or clearly
part of a series is (or will be) in its own driver, see:
- - hh_tms1k: here
- eva: Chrysler EVA-11 (and EVA-24)
- microvsn: Milton Bradley MicroVision
+
+ (contd.) hh_tms1k child drivers:
- ticalc1x: TI TMS1K-based calculators
- tispellb: TI Spelling B series gen. 1
- tispeak: TI Speak & Spell series gen. 1
@@ -41,7 +42,7 @@
@MP1180 TMS1100 1980, Tomy Power House Pinball
@MP1181 TMS1100 1979, Conic Football 2
@MP1183 TMS1100 1980, E.R.S. Superbowl XV Football/Tandy Championship Football (model 60-2151)
- *MP1185 TMS1100 1979, Fonas 3-in-1: Football, Basketball, Soccer
+ @MP1185 TMS1100 1979, Fonas 3-in-1: Football, Basketball, Soccer
@MP1193 TMS1100 1980, Tandy Championship Football (model 60-2150)
@MP1204 TMS1100 1980, Entex Baseball 3 (6007)
*MP1209 TMS1100 1980, U.S. Games Space Cruiser/Strategy Football
@@ -53,10 +54,10 @@
@MP1312 TMS1100 1983, Gakken FX-Micom R-165/Tandy Radio Shack Science Fair Microcomputer Trainer
*MP1359 TMS1100? 1985, Capsela CRC2000
@MP1525 TMS1170 1980, Coleco Head to Head Baseball
- *MP1604 ? 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000 (? note: VFD-capable)
+ @MP1604 TMS1370 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000
@MP1801 TMS1700 1981, Tiger Ditto/Tandy Pocket Repeat (model 60-2152)
@MP2105 TMS1370 1979, Gakken/Entex Poker (6005)
- @MP2139 TMS1370 1982, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away
+ @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away
@MP2726 TMS1040 1979, Tomy Break Up
*MP2788 TMS1040? 1980, Bandai Flight Time (? note: VFD-capable)
@MP3005 TMS1730 1989, Tiger Copy Cat (model 7-522)
@@ -99,7 +100,7 @@
@M34038 TMS1100 1982, Parker Brothers Lost Treasure
M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster
@M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania
- *MP4486A TMS1000C 1983, Vulcan XL 25
+ @MP4486A TMS1000C 1983, Vulcan XL 25
@MP6100A TMS0980 1979, Ideal Electronic Detective
@MP6101B TMS0980 1979, Parker Brothers Stop Thief
*MP6361 ? 1983, Defender Strikes (? note: VFD-capable)
@@ -129,7 +130,7 @@
- unknown MCU clocks for some: TMS1000 RC curve is documented in the data manual,
but not for newer ones (rev. E or TMS1400 MCUs). TMS0970/0980 osc. is on-die.
- some of the games rely on the fact that faster/longer strobed leds appear brighter,
- eg. tc4/h2hfootb(offense), bankshot(cue ball), ...
+ eg. tc4/h2hfootb(offense), bankshot(cue ball), f3in1(ball), ...
- stopthiep: unable to start a game (may be intentional?)
- 7in1ss: in 2-player mode, game select and skill select can be configured after selecting a game?
- arrball: shot button is unresponsive sometimes, maybe BTANB? no video of game on Youtube
@@ -188,6 +189,7 @@
#include "esbattle.lh"
#include "esoccer.lh"
#include "f2pbball.lh"
+#include "f3in1.lh"
#include "fxmcr165.lh" // clickable
#include "gjackpot.lh"
#include "gpoker.lh"
@@ -217,6 +219,7 @@
#include "tc4.lh"
#include "tcfball.lh"
#include "tcfballa.lh"
+#include "xl25.lh" // clickable
#include "zodiac.lh"
#include "hh_tms1k_test.lh" // common test-layout - use external artwork
@@ -1773,7 +1776,7 @@ DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state, cartridge)
// get cartridge pinout K1 to R connections
std::string pinout(image.get_feature("pinout"));
m_pinout = std::stoul(pinout, nullptr, 2) & 0xe7;
- m_pinout = BITSWAP8(m_pinout,4,3,7,5,2,1,6,0) << 4;
+ m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4;
return image_init_result::PASS;
}
@@ -1805,7 +1808,7 @@ WRITE16_MEMBER(quizwizc_state::write_r)
WRITE16_MEMBER(quizwizc_state::write_o)
{
// O0-O7: led/digit segment data
- m_o = BITSWAP8(data,7,0,1,2,3,4,5,6);
+ m_o = bitswap<8>(data,7,0,1,2,3,4,5,6);
prepare_display();
}
@@ -3892,7 +3895,7 @@ WRITE16_MEMBER(f2pbball_state::write_r)
WRITE16_MEMBER(f2pbball_state::write_o)
{
// O0-O7: led state
- m_o = BITSWAP8(data,0,7,6,5,4,3,2,1);
+ m_o = bitswap<8>(data,0,7,6,5,4,3,2,1);
prepare_display();
}
@@ -3959,6 +3962,143 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Fonas 3 in 1: Football, Basketball, Soccer
+ * TMS1100NLL MP1185
+ * 4 7seg LEDs, 40 other LEDs, 1-bit sound
+
+ It's not known if this game has an official title. The current one is
+ taken from the handheld front side.
+ MAME external artwork is needed for the switchable overlays.
+
+***************************************************************************/
+
+class f3in1_state : public hh_tms1k_state
+{
+public:
+ f3in1_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE16_MEMBER(write_r);
+ DECLARE_WRITE16_MEMBER(write_o);
+ DECLARE_READ8_MEMBER(read_k);
+
+ void set_clock();
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+
+protected:
+ virtual void machine_reset() override;
+};
+
+// handlers
+
+void f3in1_state::prepare_display()
+{
+ // R6-R9 are 7segs
+ set_display_segmask(0x3c0, 0x7f);
+ display_matrix(8, 10, m_o, m_r & ~0x20);
+}
+
+WRITE16_MEMBER(f3in1_state::write_r)
+{
+ // R0-R2,R4: input mux
+ m_inp_mux = (data & 7) | (data >> 1 & 8);
+
+ // R10: speaker out
+ m_speaker->level_w(data >> 10 & 1);
+
+ // R0-R4,R6-R9: led select
+ m_r = data;
+ prepare_display();
+}
+
+WRITE16_MEMBER(f3in1_state::write_o)
+{
+ // O0-O7: led state
+ m_o = data;
+ prepare_display();
+}
+
+READ8_MEMBER(f3in1_state::read_k)
+{
+ // K: multiplexed inputs
+ return read_inputs(4);
+}
+
+
+// config
+
+static INPUT_PORTS_START( f3in1 )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P Button")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("K Button")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("D Button")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.3") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x0e, 0x02, "Game Select" )
+ PORT_CONFSETTING( 0x02, "Football" )
+ PORT_CONFSETTING( 0x04, "Basketball" )
+ PORT_CONFSETTING( 0x08, "Soccer" )
+
+ PORT_START("IN.4") // fake
+ PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, f3in1_state, skill_switch, nullptr)
+ PORT_CONFSETTING( 0x00, "Regular" ) // REG
+ PORT_CONFSETTING( 0x01, "Professional" ) // PROF
+INPUT_PORTS_END
+
+INPUT_CHANGED_MEMBER(f3in1_state::skill_switch)
+{
+ set_clock();
+}
+
+void f3in1_state::set_clock()
+{
+ // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG)
+ m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 400000 : 300000);
+}
+
+void f3in1_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
+static MACHINE_CONFIG_START( f3in1 )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 300000) // see set_clock
+ MCFG_TMS1XXX_READ_K_CB(READ8(f3in1_state, read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(f3in1_state, write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(f3in1_state, write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_f3in1)
+
+ /* 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
+
+
+
+
+
+/***************************************************************************
+
Gakken Poker
* PCB label POKER. gakken
* TMS1370 MP2105 (die label same)
@@ -3994,7 +4134,7 @@ protected:
void gpoker_state::prepare_display()
{
set_display_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal
- u16 segs = BITSWAP16(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff;
+ u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff;
display_matrix(14, 11, segs | (m_r >> 3 & 0xf00), m_r & 0x7ff);
}
@@ -4246,8 +4386,8 @@ public:
void ginv1000_state::prepare_display()
{
- u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7);
- u16 plate = BITSWAP16(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0);
+ u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7);
+ u16 plate = bitswap<16>(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0);
display_matrix(12, 10, plate, grid);
}
@@ -4259,8 +4399,8 @@ WRITE16_MEMBER(ginv1000_state::write_r)
// R8,R15: input mux
m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2);
- // R1-R10: VFD matrix grid
- // R11-R14: VFD matrix plate
+ // R1-R10: VFD grid
+ // R11-R14: VFD plate
m_grid = data >> 1 & 0x3ff;
m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00);
prepare_display();
@@ -4268,14 +4408,14 @@ WRITE16_MEMBER(ginv1000_state::write_r)
WRITE16_MEMBER(ginv1000_state::write_o)
{
- // O0-O7: VFD matrix plate
+ // O0-O7: VFD plate
m_plate = (m_plate & ~0xff) | data;
prepare_display();
}
READ8_MEMBER(ginv1000_state::read_k)
{
- // K: multiplexed inputs (K8 is fire button)
+ // K1,K2: multiplexed inputs (K8 is fire button)
return m_inp_matrix[2]->read() | read_inputs(2);
}
@@ -4327,6 +4467,142 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Gakken Invader 2000
+ * TMS1370(28 pins) MP1604 (die label 1370A MP1604)
+ * TMS1024 I/O expander
+ * cyan/red/green VFD display, 1-bit sound
+
+ known releases:
+ - World: Invader 2000
+ - USA(1): Galaxy Invader 10000, published by CGL
+ - USA(2): Cosmic 3000 Fire Away, published by Tandy
+
+***************************************************************************/
+
+class ginv2000_state : public hh_tms1k_state
+{
+public:
+ ginv2000_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_tms1k_state(mconfig, type, tag),
+ m_expander(*this, "expander")
+ { }
+
+ required_device<tms1024_device> m_expander;
+ DECLARE_WRITE8_MEMBER(expander_w);
+
+ void prepare_display();
+ virtual DECLARE_WRITE16_MEMBER(write_r);
+ virtual DECLARE_WRITE16_MEMBER(write_o);
+ virtual DECLARE_READ8_MEMBER(read_k);
+
+protected:
+ virtual void machine_reset() override;
+};
+
+// handlers
+
+void ginv2000_state::prepare_display()
+{
+ display_matrix(16, 10, m_plate, m_grid);
+}
+
+WRITE8_MEMBER(ginv2000_state::expander_w)
+{
+ // TMS1024 port 4-7: VFD plate
+ int shift = (offset - tms1024_device::PORT4) * 4;
+ m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
+ prepare_display();
+}
+
+WRITE16_MEMBER(ginv2000_state::write_r)
+{
+ // R0: speaker out
+ m_speaker->level_w(data & 1);
+
+ // R11,R12: input mux
+ m_inp_mux = data >> 11 & 3;
+
+ // R11,R12: TMS1024 S1,S0 (S2 forced high)
+ // R13: TMS1024 STD
+ m_expander->write_s(space, 0, (data >> 12 & 1) | (data >> 10 & 2) | 4);
+ m_expander->write_std(data >> 13 & 1);
+
+ // R1-R10: VFD grid
+ m_grid = data >> 1 & 0x3ff;
+ prepare_display();
+}
+
+WRITE16_MEMBER(ginv2000_state::write_o)
+{
+ // O4-O7: TMS1024 H1-H4
+ m_expander->write_h(space, 0, data >> 4 & 0xf);
+}
+
+READ8_MEMBER(ginv2000_state::read_k)
+{
+ // K1,K2: multiplexed inputs (K8 is fire button)
+ return m_inp_matrix[2]->read() | read_inputs(2);
+}
+
+
+// config
+
+static INPUT_PORTS_START( ginv2000 )
+ PORT_START("IN.0") // R11
+ PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) )
+ PORT_CONFSETTING( 0x01, "1" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R12
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // K8
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+INPUT_PORTS_END
+
+void ginv2000_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ m_expander->write_ms(1); // Vss
+}
+
+static MACHINE_CONFIG_START( ginv2000 )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1370, 425000) // approximation - RC osc. R=36K, C=47pF
+ MCFG_TMS1XXX_READ_K_CB(READ8(ginv2000_state, read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ginv2000_state, write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ginv2000_state, write_o))
+
+ MCFG_DEVICE_ADD("expander", TMS1024, 0)
+ MCFG_TMS1025_WRITE_PORT_CB(PORT4, WRITE8(ginv2000_state, expander_w))
+ MCFG_TMS1025_WRITE_PORT_CB(PORT5, WRITE8(ginv2000_state, expander_w))
+ MCFG_TMS1025_WRITE_PORT_CB(PORT6, WRITE8(ginv2000_state, expander_w))
+ MCFG_TMS1025_WRITE_PORT_CB(PORT7, WRITE8(ginv2000_state, expander_w))
+
+ /* video hardware */
+ MCFG_SCREEN_SVG_ADD("screen", "svg")
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(364, 1080)
+ MCFG_SCREEN_VISIBLE_AREA(0, 364-1, 0, 1080-1)
+ MCFG_DEFAULT_LAYOUT(layout_svg)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+
+ /* 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
+
+
+
+
+
+/***************************************************************************
+
Gakken FX-Micom R-165
* TMS1100 MCU, label MP1312 (die label MP1312A)
* 1 7seg led, 6 other leds, 1-bit sound
@@ -4362,7 +4638,7 @@ void fxmcr165_state::prepare_display()
{
// 7seg digit from O0-O6
m_display_segmask[0] = 0x7f;
- m_display_state[0] = BITSWAP8(m_o,7,2,6,5,4,3,1,0) & 0x7f;
+ m_display_state[0] = bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f;
// leds from R4-R10
m_display_state[1] = m_r >> 4 & 0x7f;
@@ -4499,7 +4775,7 @@ WRITE16_MEMBER(elecdet_state::write_r)
// R0-R6: select digit
set_display_segmask(0x7f, 0x7f);
- display_matrix(7, 7, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data);
+ display_matrix(7, 7, bitswap<8>(m_o,7,5,2,1,4,0,6,3), data);
}
WRITE16_MEMBER(elecdet_state::write_o)
@@ -5057,7 +5333,7 @@ WRITE32_MEMBER(horseran_state::lcd_output_w)
// col5-11 and col13-19 are 7segs
for (int i = 0; i < 2; i++)
- m_display_state[3 + (offset << 1 | i)] = BITSWAP8(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f;
+ m_display_state[3 + (offset << 1 | i)] = bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f;
set_display_segmask(0x3f<<3, 0x7f);
set_display_size(24, 3+6);
@@ -6244,7 +6520,7 @@ void mbdtower_state::prepare_display()
// update current state
if (~m_r & 0x10)
{
- u8 o = BITSWAP8(m_o,7,0,4,3,2,1,6,5) & 0x7f;
+ u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f;
m_display_state[2] = (m_o & 0x80) ? o : 0;
m_display_state[1] = (m_o & 0x80) ? 0 : o;
m_display_state[0] = (m_r >> 8 & 1) | (m_r >> 4 & 0xe);
@@ -6815,7 +7091,7 @@ WRITE16_MEMBER(stopthief_state::write_r)
{
// R0-R2: select digit
set_display_segmask(7, 0x7f);
- display_matrix(7, 3, BITSWAP8(m_o,3,5,2,1,4,0,6,7) & 0x7f, data & 7);
+ display_matrix(7, 3, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f, data & 7);
// R3-R8(tied together): speaker out
int level = 0;
@@ -6924,6 +7200,7 @@ public:
: hh_tms1k_state(mconfig, type, tag)
{ }
+ void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
@@ -6931,6 +7208,11 @@ public:
// handlers
+void bankshot_state::prepare_display()
+{
+ display_matrix(7, 11, m_o, m_r & ~3);
+}
+
WRITE16_MEMBER(bankshot_state::write_r)
{
// R0: speaker out
@@ -6940,8 +7222,8 @@ WRITE16_MEMBER(bankshot_state::write_r)
m_inp_mux = data >> 2 & 3;
// R2-R10: led select
- m_r = data & ~3;
- display_matrix(7, 11, m_o, m_r);
+ m_r = data;
+ prepare_display();
}
WRITE16_MEMBER(bankshot_state::write_o)
@@ -6949,7 +7231,7 @@ WRITE16_MEMBER(bankshot_state::write_o)
// O0-O6: led state
// O7: N/C
m_o = data & 0x7f;
- display_matrix(7, 11, m_o, m_r);
+ prepare_display();
}
READ8_MEMBER(bankshot_state::read_k)
@@ -7047,6 +7329,7 @@ public:
: hh_tms1k_state(mconfig, type, tag)
{ }
+ void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
@@ -7054,6 +7337,11 @@ public:
// handlers
+void splitsec_state::prepare_display()
+{
+ display_matrix(7, 8, m_o, m_r);
+}
+
WRITE16_MEMBER(splitsec_state::write_r)
{
// R8: speaker out
@@ -7064,7 +7352,7 @@ WRITE16_MEMBER(splitsec_state::write_r)
// R0-R7: led select
m_r = data;
- display_matrix(7, 8, m_o, m_r);
+ prepare_display();
}
WRITE16_MEMBER(splitsec_state::write_o)
@@ -7072,7 +7360,7 @@ WRITE16_MEMBER(splitsec_state::write_o)
// O0-O6: led state
// O7: N/C
m_o = data & 0x7f;
- display_matrix(7, 8, m_o, m_r);
+ prepare_display();
}
READ8_MEMBER(splitsec_state::read_k)
@@ -8664,6 +8952,175 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Vulcan XL 25
+ * TMS1000SLC MP4486A (die label 1000C/, MP4486A)
+ * 28 LEDs, 1-bit sound
+
+ This game is the same logic puzzle as Tiger's Lights Out, except that
+ all 25 lights need to be turned on instead of off.
+
+***************************************************************************/
+
+class xl25_state : public hh_tms1k_state
+{
+public:
+ xl25_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void update_halt();
+ DECLARE_INPUT_CHANGED_MEMBER(k4_button);
+
+ void prepare_display();
+ DECLARE_WRITE16_MEMBER(write_r);
+ DECLARE_WRITE16_MEMBER(write_o);
+ DECLARE_READ8_MEMBER(read_k);
+
+protected:
+ virtual void machine_reset() override;
+};
+
+// handlers
+
+void xl25_state::update_halt()
+{
+ // O5+K4 go to HALT pin (used when pressing store/recall button)
+ bool halt = !((m_o & 0x20) || (read_k(machine().dummy_space(), 0) & 4));
+ m_maincpu->set_input_line(TMS1XXX_INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE);
+}
+
+void xl25_state::prepare_display()
+{
+ display_matrix(3, 10, m_o >> 1, m_r);
+}
+
+WRITE16_MEMBER(xl25_state::write_r)
+{
+ // R0-R9: input mux, led select
+ m_inp_mux = data;
+ m_r = data;
+ prepare_display();
+}
+
+WRITE16_MEMBER(xl25_state::write_o)
+{
+ // O1-O3: led data
+ m_o = data;
+ prepare_display();
+
+ // O6: speaker out
+ m_speaker->level_w(data >> 6 & 1);
+
+ // O5(+K4): MCU halt
+ update_halt();
+}
+
+READ8_MEMBER(xl25_state::read_k)
+{
+ // K: multiplexed inputs
+ // K4 also goes to MCU halt
+ return read_inputs(10);
+}
+
+
+// config
+
+static INPUT_PORTS_START( xl25 )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.4") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Store / Recall") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.6") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Cross / Knight / Score") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.7") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Clear") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.8") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Random") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.9") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Sound") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+INPUT_CHANGED_MEMBER(xl25_state::k4_button)
+{
+ update_halt();
+}
+
+void xl25_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ update_halt();
+}
+
+static MACHINE_CONFIG_START( xl25 )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1000C, 300000) // approximation - RC osc. R=5.6K, C=47pF
+ MCFG_TMS1XXX_READ_K_CB(READ8(xl25_state, read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(xl25_state, write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(xl25_state, write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_xl25)
+
+ /* 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
+
+
+
+
+
+/***************************************************************************
+
Game driver(s)
***************************************************************************/
@@ -8968,6 +9425,17 @@ ROM_START( f2pbball )
ROM_END
+ROM_START( f3in1 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1185", 0x0000, 0x0800, CRC(53f7b28d) SHA1(2249890e3a259095193b4331ca88c29ccd81eefe) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_f3in1_output.pla", 0, 365, CRC(51d947bc) SHA1(f766397d84f038be96e83d40989195c98ddcb1d9) )
+ROM_END
+
+
ROM_START( gpoker )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) )
@@ -9004,6 +9472,20 @@ ROM_START( ginv1000 )
ROM_END
+ROM_START( ginv2000 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1604", 0x0000, 0x0800, CRC(f1646d0b) SHA1(65601931d81e3eef7bf22a08de5a146910ce8137) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ginv2000_output.pla", 0, 365, CRC(520bb003) SHA1(1640ae54f8dcc257e0ad0cbe0281b38fcbd8da35) )
+
+ ROM_REGION( 374443, "svg", 0)
+ ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) )
+ROM_END
+
+
ROM_START( fxmcr165 )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) )
@@ -9428,6 +9910,17 @@ ROM_START( ssports4 )
ROM_END
+ROM_START( xl25 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp4486a", 0x0000, 0x0400, CRC(bd84b515) SHA1(377fcc68a517260acd51eb9746cd62914a75d739) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // placeholder
+ ROM_REGION( 558, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000c_xl25_output.pla", 0, 558, CRC(06ecc6e0) SHA1(e0fa1b9388948197b4de2edd3cd02fbde1dbabbb) )
+ROM_END
+
+
// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, 0, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
@@ -9463,10 +9956,12 @@ CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, 0,
CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, 0, "Entex", "Raise The Devil", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, 0, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, 0, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, 0, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, 0, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, 0, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, 0, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, 0, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE )
COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, 0, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, 0, "Ideal", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // ***
@@ -9517,5 +10012,7 @@ CONS( 1980, phpball, 0, 0, phpball, phpball, phpball_state, 0,
CONS( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, 0, "U.S. Games", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+CONS( 1983, xl25, 0, 0, xl25, xl25, xl25_state, 0, "Vulcan Electronics", "XL 25", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+
// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction
// with other, unemulatable, things eg. game board/pieces, playing cards, pen & paper, etc.