From 6339d8d1321a9814422e0a591202236f8458cdb1 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 8 Mar 2019 21:13:51 +0100 Subject: New working machine added -------- Waddingtons 2001: The Game Machine [hap, Sean Riddle] --- src/mame/drivers/gamemachine.cpp | 310 +++++++++++++++++++++++++++++++++++++++ src/mame/drivers/hh_hmcs40.cpp | 284 ++++++++++++++++++----------------- src/mame/drivers/intellect02.cpp | 20 +-- src/mame/drivers/k28.cpp | 44 +++--- src/mame/drivers/tispeak.cpp | 9 +- src/mame/drivers/video21.cpp | 2 +- src/mame/layout/tgm.lay | 28 ++++ src/mame/mame.lst | 5 +- 8 files changed, 521 insertions(+), 181 deletions(-) create mode 100644 src/mame/drivers/gamemachine.cpp create mode 100644 src/mame/layout/tgm.lay 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 m_maincpu; + required_device m_beeper; + required_device_array 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) @@ -872,147 +872,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) @@ -3968,6 +3827,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 @@ -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 m_dac; required_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 m_maincpu; required_device m_tms6100; required_device m_speech; required_device m_vfd; - required_device_array m_digit_delay; + required_device_array m_vfd_delay; required_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 m_maincpu; required_shared_ptr m_p_videoram; required_region_ptr m_p_chargen; - optional_device m_beeper; + required_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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 -- cgit v1.2.3