diff options
Diffstat (limited to 'src/mame/drivers/hh_tms1k.cpp')
-rw-r--r-- | src/mame/drivers/hh_tms1k.cpp | 551 |
1 files changed, 27 insertions, 524 deletions
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index d0dde07b070..57ab1b33e11 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -5,10 +5,9 @@ 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 @@ -42,7 +41,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 @@ -54,10 +53,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 TMS1370 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000 + *MP1604 ? 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000 (? note: VFD-capable) @MP1801 TMS1700 1981, Tiger Ditto/Tandy Pocket Repeat (model 60-2152) @MP2105 TMS1370 1979, Gakken/Entex Poker (6005) - @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away + @MP2139 TMS1370 1982, 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) @@ -100,7 +99,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) @@ -130,7 +129,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), f3in1(ball), ... + eg. tc4/h2hfootb(offense), bankshot(cue 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 @@ -189,7 +188,6 @@ #include "esbattle.lh" #include "esoccer.lh" #include "f2pbball.lh" -#include "f3in1.lh" #include "fxmcr165.lh" // clickable #include "gjackpot.lh" #include "gpoker.lh" @@ -219,7 +217,6 @@ #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 @@ -1776,7 +1773,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 = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4; + m_pinout = BITSWAP8(m_pinout,4,3,7,5,2,1,6,0) << 4; return image_init_result::PASS; } @@ -1808,7 +1805,7 @@ WRITE16_MEMBER(quizwizc_state::write_r) WRITE16_MEMBER(quizwizc_state::write_o) { // O0-O7: led/digit segment data - m_o = bitswap<8>(data,7,0,1,2,3,4,5,6); + m_o = BITSWAP8(data,7,0,1,2,3,4,5,6); prepare_display(); } @@ -3895,7 +3892,7 @@ WRITE16_MEMBER(f2pbball_state::write_r) WRITE16_MEMBER(f2pbball_state::write_o) { // O0-O7: led state - m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); + m_o = BITSWAP8(data,0,7,6,5,4,3,2,1); prepare_display(); } @@ -3962,143 +3959,6 @@ 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) @@ -4134,7 +3994,7 @@ protected: void gpoker_state::prepare_display() { set_display_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal - u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; + u16 segs = BITSWAP16(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); } @@ -4386,8 +4246,8 @@ public: void ginv1000_state::prepare_display() { - 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); + 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); display_matrix(12, 10, plate, grid); } @@ -4399,8 +4259,8 @@ WRITE16_MEMBER(ginv1000_state::write_r) // R8,R15: input mux m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2); - // R1-R10: VFD grid - // R11-R14: VFD plate + // R1-R10: VFD matrix grid + // R11-R14: VFD matrix plate m_grid = data >> 1 & 0x3ff; m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); prepare_display(); @@ -4408,14 +4268,14 @@ WRITE16_MEMBER(ginv1000_state::write_r) WRITE16_MEMBER(ginv1000_state::write_o) { - // O0-O7: VFD plate + // O0-O7: VFD matrix plate m_plate = (m_plate & ~0xff) | data; prepare_display(); } READ8_MEMBER(ginv1000_state::read_k) { - // K1,K2: multiplexed inputs (K8 is fire button) + // K: multiplexed inputs (K8 is fire button) return m_inp_matrix[2]->read() | read_inputs(2); } @@ -4467,142 +4327,6 @@ 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 @@ -4638,7 +4362,7 @@ void fxmcr165_state::prepare_display() { // 7seg digit from O0-O6 m_display_segmask[0] = 0x7f; - m_display_state[0] = bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f; + m_display_state[0] = BITSWAP8(m_o,7,2,6,5,4,3,1,0) & 0x7f; // leds from R4-R10 m_display_state[1] = m_r >> 4 & 0x7f; @@ -4775,7 +4499,7 @@ WRITE16_MEMBER(elecdet_state::write_r) // R0-R6: select digit set_display_segmask(0x7f, 0x7f); - display_matrix(7, 7, bitswap<8>(m_o,7,5,2,1,4,0,6,3), data); + display_matrix(7, 7, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data); } WRITE16_MEMBER(elecdet_state::write_o) @@ -5333,7 +5057,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)] = bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f; + m_display_state[3 + (offset << 1 | i)] = BITSWAP8(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); @@ -6520,7 +6244,7 @@ void mbdtower_state::prepare_display() // update current state if (~m_r & 0x10) { - u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; + u8 o = BITSWAP8(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); @@ -7091,7 +6815,7 @@ WRITE16_MEMBER(stopthief_state::write_r) { // R0-R2: select digit set_display_segmask(7, 0x7f); - display_matrix(7, 3, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f, data & 7); + display_matrix(7, 3, BITSWAP8(m_o,3,5,2,1,4,0,6,7) & 0x7f, data & 7); // R3-R8(tied together): speaker out int level = 0; @@ -7200,7 +6924,6 @@ 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); @@ -7208,11 +6931,6 @@ 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 @@ -7222,8 +6940,8 @@ WRITE16_MEMBER(bankshot_state::write_r) m_inp_mux = data >> 2 & 3; // R2-R10: led select - m_r = data; - prepare_display(); + m_r = data & ~3; + display_matrix(7, 11, m_o, m_r); } WRITE16_MEMBER(bankshot_state::write_o) @@ -7231,7 +6949,7 @@ WRITE16_MEMBER(bankshot_state::write_o) // O0-O6: led state // O7: N/C m_o = data & 0x7f; - prepare_display(); + display_matrix(7, 11, m_o, m_r); } READ8_MEMBER(bankshot_state::read_k) @@ -7329,7 +7047,6 @@ 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); @@ -7337,11 +7054,6 @@ public: // handlers -void splitsec_state::prepare_display() -{ - display_matrix(7, 8, m_o, m_r); -} - WRITE16_MEMBER(splitsec_state::write_r) { // R8: speaker out @@ -7352,7 +7064,7 @@ WRITE16_MEMBER(splitsec_state::write_r) // R0-R7: led select m_r = data; - prepare_display(); + display_matrix(7, 8, m_o, m_r); } WRITE16_MEMBER(splitsec_state::write_o) @@ -7360,7 +7072,7 @@ WRITE16_MEMBER(splitsec_state::write_o) // O0-O6: led state // O7: N/C m_o = data & 0x7f; - prepare_display(); + display_matrix(7, 8, m_o, m_r); } READ8_MEMBER(splitsec_state::read_k) @@ -8952,175 +8664,6 @@ 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) ***************************************************************************/ @@ -9425,17 +8968,6 @@ 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) ) @@ -9472,20 +9004,6 @@ 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) ) @@ -9910,17 +9428,6 @@ 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 ) @@ -9956,12 +9463,10 @@ 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( 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 ) +CONS( 1982, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, 0, "Gakken", "Galaxy Invader 1000", 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 ) // *** @@ -10012,7 +9517,5 @@ 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. |