summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-03-08 21:13:51 +0100
committer hap <happppp@users.noreply.github.com>2019-03-08 21:14:03 +0100
commit6339d8d1321a9814422e0a591202236f8458cdb1 (patch)
tree924bde4c311de6a152816323764af29df1db90ab
parent873e217fdbbc295c86dc77892d1b1e34b3dfbd9b (diff)
New working machine added
-------- Waddingtons 2001: The Game Machine [hap, Sean Riddle]
-rw-r--r--src/mame/drivers/gamemachine.cpp310
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp284
-rw-r--r--src/mame/drivers/intellect02.cpp20
-rw-r--r--src/mame/drivers/k28.cpp44
-rw-r--r--src/mame/drivers/tispeak.cpp9
-rw-r--r--src/mame/drivers/video21.cpp2
-rw-r--r--src/mame/layout/tgm.lay28
-rw-r--r--src/mame/mame.lst5
8 files changed, 521 insertions, 181 deletions
diff --git a/src/mame/drivers/gamemachine.cpp b/src/mame/drivers/gamemachine.cpp
new file mode 100644
index 00000000000..ab5894d2b9d
--- /dev/null
+++ b/src/mame/drivers/gamemachine.cpp
@@ -0,0 +1,310 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Sean Riddle
+/******************************************************************************
+
+Waddingtons 2001: The Game Machine
+
+It's a tabletop electronic game machine + calculator.
+It was possibly created by VTech, but they didn't distribute it by themselves
+until later in 1980 as the Computer Game System. There's also a handheld version
+"Mini Game Machine". VTech later made a sequel "Game Machine 2" with 5 games.
+
+After boot, press a number to start a game:
+0: 4 Function Calculator (not a game)
+1: Shooting Gallery
+2: Black Jack
+3: Code Hunter
+4: Grand Prix
+
+Screen and keyboard overlays were provided for each game, though the default keyboard
+labels already show the alternate functions.
+
+hardware notes:
+- Mostek MK3870 MCU, 2KB internal ROM
+- 12 digits 7seg VFD panel
+- MC1455P(555 timer) + bunch of discrete components for sound, see schematic:
+ http://seanriddle.com/gamemachineaudio.JPG
+
+TODO:
+- discrete sound, currently it's emulated crudely, just enough to make it beep when supposed to
+- MK3870 is not emulated in MAME, plain F8 is used here instead
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/f8/f8.h"
+#include "machine/timer.h"
+#include "sound/beep.h"
+#include "speaker.h"
+
+#include "tgm.lh"
+
+namespace {
+
+class tgm_state : public driver_device
+{
+public:
+ tgm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_beeper(*this, "beeper"),
+ m_vfd_delay(*this, "vfd_delay_%u", 0),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
+ { }
+
+ void tgm(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<beep_device> m_beeper;
+ required_device_array<timer_device, 12> m_vfd_delay;
+ required_ioport_array<10> m_inp_matrix;
+ output_finder<12> m_out_digit;
+
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(vfd_delay_off);
+
+ void display_update(u16 edge);
+ DECLARE_WRITE8_MEMBER(mux1_w);
+ DECLARE_WRITE8_MEMBER(mux2_w);
+ DECLARE_WRITE8_MEMBER(_7seg_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(sound_w);
+ DECLARE_READ8_MEMBER(timer_r);
+
+ u16 m_inp_mux;
+ u16 m_digit_select;
+ u8 m_7seg_data;
+};
+
+void tgm_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // zerofill
+ m_inp_mux = 0;
+ m_digit_select = 0;
+ m_7seg_data = 0;
+
+ // register for savestates
+ save_item(NAME(m_inp_mux));
+ save_item(NAME(m_digit_select));
+ save_item(NAME(m_7seg_data));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// VFD handling
+
+TIMER_DEVICE_CALLBACK_MEMBER(tgm_state::vfd_delay_off)
+{
+ // clear VFD outputs
+ if (!BIT(m_digit_select, param))
+ m_out_digit[param] = 0;
+}
+
+void tgm_state::display_update(u16 edge)
+{
+ for (int i = 0; i < 12; i++)
+ {
+ // output VFD digit data
+ if (BIT(m_digit_select, i))
+ m_out_digit[i] = m_7seg_data;
+
+ // they're strobed, so on falling edge, delay them going off to prevent flicker
+ // BTANB: some digit segments get stuck after crashing in the GP game, it's not due to the simulated delay here
+ else if (BIT(edge, i))
+ m_vfd_delay[i]->adjust(attotime::from_msec(20), i);
+ }
+}
+
+
+// MK3870 ports
+
+WRITE8_MEMBER(tgm_state::mux1_w)
+{
+ // P00-P06: input mux part
+ m_inp_mux = (m_inp_mux & 7) | (data << 3 & 0x3f8);
+
+ // P00-P07: digit select part
+ u16 prev = m_digit_select;
+ m_digit_select = (m_digit_select & 0xf) | (data << 4);
+ display_update(m_digit_select ^ prev);
+}
+
+WRITE8_MEMBER(tgm_state::mux2_w)
+{
+ // P15-P17: input mux part
+ m_inp_mux = (m_inp_mux & 0x3f8) | (data >> 5 & 7);
+
+ // P14-P17: digit select part
+ u16 prev = m_digit_select;
+ m_digit_select = (m_digit_select & 0xff0) | (data >> 4 & 0xf);
+ display_update(m_digit_select ^ prev);
+}
+
+WRITE8_MEMBER(tgm_state::_7seg_w)
+{
+ // P50-P57: digit 7seg data
+ m_7seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
+ display_update(0);
+}
+
+READ8_MEMBER(tgm_state::input_r)
+{
+ u8 data = 0;
+
+ // P12,P13: multiplexed inputs
+ for (int i = 0; i < 10; i++)
+ if (m_inp_mux >> i & 1)
+ data |= m_inp_matrix[i]->read();
+
+ return data << 2;
+}
+
+WRITE8_MEMBER(tgm_state::sound_w)
+{
+ // P40: 555 reset
+ m_beeper->set_state(~data & 1);
+
+ // P42-P46: through caps, then 555 trigger/treshold
+ u8 pitch = 0x20 - bitswap<5>(data,6,5,2,3,4);
+ m_beeper->set_clock(64 * pitch);
+
+ // P41: polarized cap, then 555 ctrl
+ // P47: resistor, then 555 ctrl
+ //..
+}
+
+READ8_MEMBER(tgm_state::timer_r)
+{
+ // MK3870 internal timer register (used as RNG here)
+ return machine().rand();
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void tgm_state::main_map(address_map &map)
+{
+ map.global_mask(0x7ff);
+ map(0x0000, 0x07ff).rom();
+}
+
+void tgm_state::main_io(address_map &map)
+{
+ map(0x00, 0x00).w(FUNC(tgm_state::mux1_w));
+ map(0x01, 0x01).rw(FUNC(tgm_state::input_r), FUNC(tgm_state::mux2_w));
+ map(0x04, 0x04).w(FUNC(tgm_state::sound_w));
+ map(0x05, 0x05).w(FUNC(tgm_state::_7seg_w));
+ map(0x07, 0x07).r(FUNC(tgm_state::timer_r));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( tgm )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CL")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_END) PORT_NAME("MR")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_HOME) PORT_NAME("MS")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+
+ PORT_START("IN.9")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Return")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void tgm_state::tgm(machine_config &config)
+{
+ /* basic machine hardware */
+ F8(config, m_maincpu, 2000000); // measured around 2.1MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &tgm_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &tgm_state::main_io);
+
+ /* video hardware */
+ for (int i = 0; i < 12; i++)
+ TIMER(config, m_vfd_delay[i]).configure_generic(FUNC(tgm_state::vfd_delay_off));
+
+ config.set_default_layout(layout_tgm);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( 2001tgm )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("mk14154n_2001", 0x0000, 0x0800, CRC(6d524c32) SHA1(73d84e59952b751c76dff8bf259b98e1f9136b41) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1978, 2001tgm, 0, 0, tgm, tgm, tgm_state, empty_init, "Waddingtons", "2001: The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp
index 82a05082a5c..b1a48703efa 100644
--- a/src/mame/drivers/hh_hmcs40.cpp
+++ b/src/mame/drivers/hh_hmcs40.cpp
@@ -25,7 +25,7 @@
*41 HD38800A 1982, Gakken Puck Monster
*51 HD38800A 1981, Actronics(Hanzawa) Twinvader (larger white version)
@70 HD38800A 1982, Coleco Galaxian
- @73 HD38800A 1982, Bandai(Mattel) Star Hawk (PT-317B)
+ @73 HD38800A 1982, Mattel Star Hawk (PT-317B)
@77 HD38800A 1982, Bandai Frisky Tom (PT-327A)
@88 HD38800A 1984, Tomy Tron (THN-02)
@@ -874,147 +874,6 @@ ROM_END
/***************************************************************************
- Bandai/Mattel Star Hawk (manufactured in Japan)
- * PCB label Kaken, PT-317B
- * Hitachi HD38800A73 MCU
- * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel
-
- Kaken was a subsidiary of Bandai. The original Japanese release is unknown,
- was it canceled and only released in the USA?
-
- known releases:
- - Japan: ?
- - USA: Star Hawk, published by Mattel
-
-***************************************************************************/
-
-class msthawk_state : public hh_hmcs40_state
-{
-public:
- msthawk_state(const machine_config &mconfig, device_type type, const char *tag) :
- hh_hmcs40_state(mconfig, type, tag)
- { }
-
- void prepare_display();
- DECLARE_WRITE8_MEMBER(plate_w);
- DECLARE_WRITE16_MEMBER(grid_w);
-
- void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
- void msthawk(machine_config &config);
-};
-
-// handlers
-
-void msthawk_state::prepare_display()
-{
- u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
- display_matrix(21, 10, plate, grid);
-}
-
-WRITE8_MEMBER(msthawk_state::plate_w)
-{
- // R0x-R3x: vfd plate
- int shift = offset * 4;
- m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
- prepare_display();
-}
-
-WRITE16_MEMBER(msthawk_state::grid_w)
-{
- // D5: speaker out
- m_speaker->level_w(data >> 5 & 1);
-
- // D10-D15: input mux
- u8 inp_mux = data >> 10 & 0x3f;
- if (inp_mux != m_inp_mux)
- {
- m_inp_mux = inp_mux;
- update_int0();
- }
-
- // D6-D15: vfd grid
- m_grid = data >> 6 & 0x3ff;
-
- // D0-D4: more plates
- m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000);
- prepare_display();
-}
-
-void msthawk_state::update_int0()
-{
- // INT0 on multiplexed inputs
- set_interrupt(0, read_inputs(6));
-}
-
-// config
-
-static INPUT_PORTS_START( msthawk )
- PORT_START("IN.0") // D10 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Score")
-
- PORT_START("IN.1") // D11 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Land")
-
- PORT_START("IN.2") // D12 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.3") // D13 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.4") // D14 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.5") // D15 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.6") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) PORT_NAME("Fire")
-INPUT_PORTS_END
-
-void msthawk_state::msthawk(machine_config &config)
-{
- /* basic machine hardware */
- HD38800(config, m_maincpu, 400000); // approximation
- m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_d().set(FUNC(msthawk_state::grid_w));
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
- screen.set_svg_region("svg");
- screen.set_refresh_hz(50);
- screen.set_size(1920, 696);
- screen.set_visarea_full();
-
- TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_msthawk);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
-}
-
-// roms
-
-ROM_START( msthawk )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 191888, "svg", 0)
- ROM_LOAD( "msthawk.svg", 0, 191888, CRC(a607fc0f) SHA1(282a412f6462128e09ee8bd18d682dda01297611) )
-ROM_END
-
-
-
-
-
-/***************************************************************************
-
Bandai Zaxxon (manufactured in Japan, licensed from Sega)
* PCB label FL Zaxxon
* Hitachi HD38800B19 MCU
@@ -3970,6 +3829,145 @@ ROM_END
/***************************************************************************
+ Mattel Star Hawk (manufactured in Japan)
+ * PCB label Kaken, PT-317B
+ * Hitachi HD38800A73 MCU
+ * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel
+
+ Before release, it was advertised as "Space Battle"(a Mattel Intellivision game).
+ Kaken was a subsidiary of Bandai. Star Hawk shell design is the same as Bandai's
+ games from the same era. It's likely that this was made under contract exclusively
+ for Mattel. There is no indication that this game was released in Japan by Bandai.
+
+***************************************************************************/
+
+class msthawk_state : public hh_hmcs40_state
+{
+public:
+ msthawk_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(plate_w);
+ DECLARE_WRITE16_MEMBER(grid_w);
+
+ void update_int0();
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
+ void msthawk(machine_config &config);
+};
+
+// handlers
+
+void msthawk_state::prepare_display()
+{
+ u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
+ display_matrix(21, 10, plate, grid);
+}
+
+WRITE8_MEMBER(msthawk_state::plate_w)
+{
+ // R0x-R3x: vfd plate
+ int shift = offset * 4;
+ m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
+ prepare_display();
+}
+
+WRITE16_MEMBER(msthawk_state::grid_w)
+{
+ // D5: speaker out
+ m_speaker->level_w(data >> 5 & 1);
+
+ // D10-D15: input mux
+ u8 inp_mux = data >> 10 & 0x3f;
+ if (inp_mux != m_inp_mux)
+ {
+ m_inp_mux = inp_mux;
+ update_int0();
+ }
+
+ // D6-D15: vfd grid
+ m_grid = data >> 6 & 0x3ff;
+
+ // D0-D4: more plates
+ m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000);
+ prepare_display();
+}
+
+void msthawk_state::update_int0()
+{
+ // INT0 on multiplexed inputs
+ set_interrupt(0, read_inputs(6));
+}
+
+// config
+
+static INPUT_PORTS_START( msthawk )
+ PORT_START("IN.0") // D10 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Score")
+
+ PORT_START("IN.1") // D11 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Land")
+
+ PORT_START("IN.2") // D12 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.3") // D13 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.4") // D14 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.5") // D15 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.6") // INT1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) PORT_NAME("Fire")
+INPUT_PORTS_END
+
+void msthawk_state::msthawk(machine_config &config)
+{
+ /* basic machine hardware */
+ HD38800(config, m_maincpu, 400000); // approximation
+ m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_d().set(FUNC(msthawk_state::grid_w));
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1920, 696);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_msthawk);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( msthawk )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 191888, "svg", 0)
+ ROM_LOAD( "msthawk.svg", 0, 191888, CRC(a607fc0f) SHA1(282a412f6462128e09ee8bd18d682dda01297611) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
Parker Brothers Q*Bert
* PCB label 13662 REV-4
* Hitachi QFP HD38820A70 MCU
@@ -4440,7 +4438,6 @@ CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_in
CONS( 1982, bfriskyt, 0, 0, bfriskyt, bfriskyt, bfriskyt_state, empty_init, "Bandai", "Frisky Tom (Bandai)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, packmon, 0, 0, packmon, packmon, packmon_state, empty_init, "Bandai", "Packri Monster", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Bandai (Mattel license)", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, bzaxxon, 0, 0, bzaxxon, bzaxxon, bzaxxon_state, empty_init, "Bandai", "Zaxxon (Bandai)", MACHINE_SUPPORTS_SAVE )
CONS( 1983, zackman, 0, 0, zackman, zackman, zackman_state, empty_init, "Bandai", "Zackman", MACHINE_SUPPORTS_SAVE )
CONS( 1983, bpengo, 0, 0, bpengo, bpengo, bpengo_state, empty_init, "Bandai", "Pengo (Bandai)", MACHINE_SUPPORTS_SAVE )
@@ -4471,6 +4468,7 @@ CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_in
CONS( 1983, gdigdug, 0, 0, gdigdug, gdigdug, gdigdug_state, empty_init, "Gakken", "Dig Dug (Gakken)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, mwcbaseb, 0, 0, mwcbaseb, mwcbaseb, mwcbaseb_state, empty_init, "Mattel", "World Championship Baseball", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE )
CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, pbqbert_state, empty_init, "Parker Brothers", "Q*Bert (Parker Brothers)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp
index 0cb02d64754..0b3e97c42fe 100644
--- a/src/mame/drivers/intellect02.cpp
+++ b/src/mame/drivers/intellect02.cpp
@@ -68,8 +68,8 @@ public:
m_keypad(*this, "IN.%u", 0),
m_dac(*this, "dac"),
m_cart(*this, "cartslot"),
- m_digit(*this, "digit%u", 0U),
- m_led(*this, "led%u", 0U)
+ m_out_digit(*this, "digit%u", 0U),
+ m_out_led(*this, "led%u", 0U)
{ }
// machine configs
@@ -89,8 +89,8 @@ private:
required_ioport_array<2> m_keypad;
required_device<dac_bit_interface> m_dac;
required_device<generic_slot_device> m_cart;
- output_finder<4> m_digit;
- output_finder<2> m_led;
+ output_finder<4> m_out_digit;
+ output_finder<2> m_out_led;
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
@@ -115,8 +115,8 @@ private:
void intel02_state::machine_start()
{
// resolve handlers
- m_led.resolve();
- m_digit.resolve();
+ m_out_led.resolve();
+ m_out_digit.resolve();
// zerofill
m_7seg_data = 0;
@@ -154,14 +154,14 @@ void intel02_state::update_display()
for (int i = 0; i < 4; i++)
{
if (BIT(m_led_select, i))
- m_digit[i] = m_7seg_data;
+ m_out_digit[i] = m_7seg_data;
else if (!BIT(m_led_active, i))
- m_digit[i] = 0;
+ m_out_digit[i] = 0;
}
// led select d4: lose led, d5: win led
- m_led[0] = BIT(m_led_active, 4);
- m_led[1] = BIT(m_led_active, 5);
+ m_out_led[0] = BIT(m_led_active, 4);
+ m_out_led[1] = BIT(m_led_active, 5);
}
TIMER_DEVICE_CALLBACK_MEMBER(intel02_state::led_delay_off)
diff --git a/src/mame/drivers/k28.cpp b/src/mame/drivers/k28.cpp
index 906fecb0265..aa93287e6e1 100644
--- a/src/mame/drivers/k28.cpp
+++ b/src/mame/drivers/k28.cpp
@@ -1,23 +1,23 @@
// license:BSD-3-Clause
// copyright-holders:hap, Kevin Horton
-/***************************************************************************
+/******************************************************************************
- Tiger Electronics K28: Talking Learning Computer (model 7-230/7-231)
- * PCB marked PB-123 WIZARD, TIGER
- * Intel P8021 MCU with 1KB internal ROM
- * MM5445N VFD driver, 9-digit alphanumeric display same as snmath
- * 2*TMS6100 (32KB VSM)
- * SC-01-A speech chip
+Tiger Electronics K28: Talking Learning Computer (model 7-230/7-231)
+* PCB marked PB-123 WIZARD, TIGER
+* Intel P8021 MCU with 1KB internal ROM
+* MM5445N VFD driver, 9-digit alphanumeric display same as snmath
+* 2*TMS6100 (32KB VSM)
+* SC-01-A speech chip
- 3 models exist:
- - 7-230: darkblue case, toy-ish looks
- - 7-231: gray case, hardware is the same
- - 7-232: this one is completely different hw --> driver tispeak.cpp
+3 models exist:
+- 7-230: darkblue case, toy-ish looks
+- 7-231: gray case, hardware is the same
+- 7-232: this one is completely different hw --> driver tispeak.cpp
- TODO:
- - external module support (no dumps yet)
+TODO:
+- external module support (no dumps yet)
-***************************************************************************/
+******************************************************************************/
#include "emu.h"
#include "cpu/mcs48/mcs48.h"
@@ -40,7 +40,7 @@ public:
m_tms6100(*this, "tms6100"),
m_speech(*this, "speech"),
m_vfd(*this, "vfd"),
- m_digit_delay(*this, "led_delay_%u", 0),
+ m_vfd_delay(*this, "led_delay_%u", 0),
m_onbutton_timer(*this, "on_button"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
@@ -56,18 +56,18 @@ protected:
virtual void machine_reset() override;
private:
- // devices
+ // devices/pointers
required_device<i8021_device> m_maincpu;
required_device<tms6100_device> m_tms6100;
required_device<votrax_sc01_device> m_speech;
required_device<mm5445_device> m_vfd;
- required_device_array<timer_device, 9> m_digit_delay;
+ required_device_array<timer_device, 9> m_vfd_delay;
required_device<timer_device> m_onbutton_timer;
required_ioport_array<7> m_inp_matrix;
output_finder<9, 16> m_out_x;
output_finder<9> m_out_digit;
- TIMER_DEVICE_CALLBACK_MEMBER(digit_delay_off);
+ TIMER_DEVICE_CALLBACK_MEMBER(vfd_delay_off);
bool m_power_on;
u8 m_inp_mux;
@@ -137,9 +137,9 @@ void k28_state::power_off()
// VFD handling
-TIMER_DEVICE_CALLBACK_MEMBER(k28_state::digit_delay_off)
+TIMER_DEVICE_CALLBACK_MEMBER(k28_state::vfd_delay_off)
{
- // clear vfd outputs
+ // clear VFD outputs
if (!BIT(m_vfd_data, param+16))
{
m_out_digit[param] = 0;
@@ -168,7 +168,7 @@ WRITE64_MEMBER(k28_state::vfd_output_w)
// they're strobed, so on falling edge, delay them going off to prevent flicker
else if (BIT(m_vfd_data, i+16))
- m_digit_delay[i]->adjust(attotime::from_msec(50), i);
+ m_vfd_delay[i]->adjust(attotime::from_msec(50), i);
}
// O26: power-off request on falling edge
@@ -345,7 +345,7 @@ void k28_state::k28(machine_config &config)
config.set_default_layout(layout_k28);
for (int i = 0; i < 9; i++)
- TIMER(config, m_digit_delay[i]).configure_generic(FUNC(k28_state::digit_delay_off));
+ TIMER(config, m_vfd_delay[i]).configure_generic(FUNC(k28_state::vfd_delay_off));
/* sound hardware */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp
index 2c492a6a8e5..b177626bcbe 100644
--- a/src/mame/drivers/tispeak.cpp
+++ b/src/mame/drivers/tispeak.cpp
@@ -738,7 +738,8 @@ void tispeak_state::k28_prepare_display(u8 old, u8 data)
WRITE16_MEMBER(tispeak_state::k28_write_r)
{
// R1234: TMS5100 CTL8421
- m_tms5100->ctl_w(space, 0, bitswap<4>(data,1,2,3,4));
+ u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f);
+ m_tms5100->ctl_w(space, 0, r & 0xf);
// R0: TMS5100 PDC pin
m_tms5100->pdc_w(data & 1);
@@ -752,7 +753,7 @@ WRITE16_MEMBER(tispeak_state::k28_write_r)
// R7-R10: LCD data
k28_prepare_display(m_r >> 7 & 0xf, data >> 7 & 0xf);
- m_r = data;
+ m_r = r;
}
WRITE16_MEMBER(tispeak_state::k28_write_o)
@@ -763,8 +764,8 @@ WRITE16_MEMBER(tispeak_state::k28_write_o)
READ8_MEMBER(tispeak_state::k28_read_k)
{
- // K: TMS5100 CTL, multiplexed inputs
- return m_tms5100->ctl_r(space, 0) | read_inputs(9);
+ // K: TMS5100 CTL, multiplexed inputs (also tied to R1234)
+ return m_tms5100->ctl_r(space, 0) | read_inputs(9) | (m_r & 0xf);
}
diff --git a/src/mame/drivers/video21.cpp b/src/mame/drivers/video21.cpp
index 1c9481d5ed6..3ef2c9a66b7 100644
--- a/src/mame/drivers/video21.cpp
+++ b/src/mame/drivers/video21.cpp
@@ -67,7 +67,7 @@ private:
required_device<cpu_device> m_maincpu;
required_shared_ptr<u8> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
- optional_device<beep_device> m_beeper;
+ required_device<beep_device> m_beeper;
output_finder<6> m_lamps;
};
diff --git a/src/mame/layout/tgm.lay b/src/mame/layout/tgm.lay
new file mode 100644
index 00000000000..04d43cac89d
--- /dev/null
+++ b/src/mame/layout/tgm.lay
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bezel name="digit11" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit10" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit9" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit8" element="digit"><bounds x="30" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="40" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="50" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="60" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="70" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="80" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="90" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="100" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="110" y="0" width="10" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 5d55f5ab6f4..cd9dd2f75d7 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -13726,6 +13726,9 @@ gcbr // (c) 2002 Nintendo
gamekin3 //
gameking //
+@source:gamemachine.cpp
+2001tgm //
+
@source:gamemasters.cpp
gmsshoot // (c) 1989 GameMasters
@@ -15038,7 +15041,7 @@ gdigdug // Gakken
ghalien // Gakken
kingman // Tomy
machiman // Bandai
-msthawk // Bandai/Mattel
+msthawk // Mattel
mwcbaseb // Mattel
packmon // Bandai
pairmtch // Bandai