From 0bdc4c8e264db2241b0d3173cb91f4f2ee7b4d7f Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 29 Jun 2022 17:05:57 +0200 Subject: source org: rename handheld to misc_handheld and move some files over --- scripts/target/mame/mame.lua | 32 +- src/mame/handheld/hh_cop400.cpp | 2506 ------ src/mame/handheld/hh_cops1.cpp | 850 -- src/mame/handheld/hh_hmcs40.cpp | 5345 ------------ src/mame/handheld/hh_melps4.cpp | 381 - src/mame/handheld/hh_pic16.cpp | 1965 ----- src/mame/handheld/hh_pps41.cpp | 1617 ---- src/mame/handheld/hh_rw5000.cpp | 1109 --- src/mame/handheld/hh_sm510.cpp | 10093 ----------------------- src/mame/handheld/hh_sm510.h | 116 - src/mame/handheld/hh_tms1k.cpp | 14465 --------------------------------- src/mame/handheld/hh_tms1k.h | 73 - src/mame/handheld/hh_ucom4.cpp | 3060 ------- src/mame/handheld/rzone.cpp | 355 - src/mame/handheld/tispeak.cpp | 1909 ----- src/mame/handheld/tispellb.cpp | 452 - src/mame/mame.lst | 36 +- src/mame/mess.flt | 36 +- src/mame/misc_handheld/README.md | 4 + src/mame/misc_handheld/hh_cop400.cpp | 2506 ++++++ src/mame/misc_handheld/hh_cops1.cpp | 850 ++ src/mame/misc_handheld/hh_hmcs40.cpp | 5345 ++++++++++++ src/mame/misc_handheld/hh_melps4.cpp | 381 + src/mame/misc_handheld/hh_pic16.cpp | 1965 +++++ src/mame/misc_handheld/hh_pps41.cpp | 1617 ++++ src/mame/misc_handheld/hh_rw5000.cpp | 1109 +++ src/mame/misc_handheld/hh_sm510.cpp | 10093 +++++++++++++++++++++++ src/mame/misc_handheld/hh_sm510.h | 116 + src/mame/misc_handheld/hh_tms1k.cpp | 14465 +++++++++++++++++++++++++++++++++ src/mame/misc_handheld/hh_tms1k.h | 73 + src/mame/misc_handheld/hh_ucom4.cpp | 3060 +++++++ src/mame/misc_handheld/monty.cpp | 296 + src/mame/misc_handheld/rzone.cpp | 355 + src/mame/misc_handheld/scrablex.cpp | 229 + src/mame/misc_handheld/talkingbb.cpp | 351 + src/mame/misc_handheld/talkingfb.cpp | 256 + src/mame/misc_handheld/tispeak.cpp | 1909 +++++ src/mame/misc_handheld/tispellb.cpp | 452 + src/mame/misc_handheld/wildfire.cpp | 212 + src/mame/parker/talkingbb.cpp | 351 - src/mame/parker/talkingfb.cpp | 256 - src/mame/parker/wildfire.cpp | 212 - src/mame/ritam/monty.cpp | 296 - src/mame/selchow/scrablex.cpp | 229 - 44 files changed, 45687 insertions(+), 45701 deletions(-) delete mode 100644 src/mame/handheld/hh_cop400.cpp delete mode 100644 src/mame/handheld/hh_cops1.cpp delete mode 100644 src/mame/handheld/hh_hmcs40.cpp delete mode 100644 src/mame/handheld/hh_melps4.cpp delete mode 100644 src/mame/handheld/hh_pic16.cpp delete mode 100644 src/mame/handheld/hh_pps41.cpp delete mode 100644 src/mame/handheld/hh_rw5000.cpp delete mode 100644 src/mame/handheld/hh_sm510.cpp delete mode 100644 src/mame/handheld/hh_sm510.h delete mode 100644 src/mame/handheld/hh_tms1k.cpp delete mode 100644 src/mame/handheld/hh_tms1k.h delete mode 100644 src/mame/handheld/hh_ucom4.cpp delete mode 100644 src/mame/handheld/rzone.cpp delete mode 100644 src/mame/handheld/tispeak.cpp delete mode 100644 src/mame/handheld/tispellb.cpp create mode 100644 src/mame/misc_handheld/README.md create mode 100644 src/mame/misc_handheld/hh_cop400.cpp create mode 100644 src/mame/misc_handheld/hh_cops1.cpp create mode 100644 src/mame/misc_handheld/hh_hmcs40.cpp create mode 100644 src/mame/misc_handheld/hh_melps4.cpp create mode 100644 src/mame/misc_handheld/hh_pic16.cpp create mode 100644 src/mame/misc_handheld/hh_pps41.cpp create mode 100644 src/mame/misc_handheld/hh_rw5000.cpp create mode 100644 src/mame/misc_handheld/hh_sm510.cpp create mode 100644 src/mame/misc_handheld/hh_sm510.h create mode 100644 src/mame/misc_handheld/hh_tms1k.cpp create mode 100644 src/mame/misc_handheld/hh_tms1k.h create mode 100644 src/mame/misc_handheld/hh_ucom4.cpp create mode 100644 src/mame/misc_handheld/monty.cpp create mode 100644 src/mame/misc_handheld/rzone.cpp create mode 100644 src/mame/misc_handheld/scrablex.cpp create mode 100644 src/mame/misc_handheld/talkingbb.cpp create mode 100644 src/mame/misc_handheld/talkingfb.cpp create mode 100644 src/mame/misc_handheld/tispeak.cpp create mode 100644 src/mame/misc_handheld/tispellb.cpp create mode 100644 src/mame/misc_handheld/wildfire.cpp delete mode 100644 src/mame/parker/talkingbb.cpp delete mode 100644 src/mame/parker/talkingfb.cpp delete mode 100644 src/mame/parker/wildfire.cpp delete mode 100644 src/mame/ritam/monty.cpp delete mode 100644 src/mame/selchow/scrablex.cpp diff --git a/scripts/target/mame/mame.lua b/scripts/target/mame/mame.lua index 2a47c1ac1d4..4f0393befc8 100644 --- a/scripts/target/mame/mame.lua +++ b/scripts/target/mame/mame.lua @@ -1365,7 +1365,6 @@ function linkProjects_mame_mame(_target, _subtarget) "gridcomp", "grundy", "h01x", - "handheld", "hartung", "hds", "heathkit", @@ -1432,6 +1431,7 @@ function linkProjects_mame_mame(_target, _subtarget) "midway", "mips", "misc", + "misc_handheld", "mit", "mits", "mitsubishi", @@ -1474,7 +1474,6 @@ function linkProjects_mame_mame(_target, _subtarget) "pacific", "pacman", "palm", - "parker", "pc", "pce", "pdp1", @@ -1497,7 +1496,6 @@ function linkProjects_mame_mame(_target, _subtarget) "rare", "rca", "regnecentralen", - "ritam", "rm", "robotron", "rockwell", @@ -1514,7 +1512,6 @@ function linkProjects_mame_mame(_target, _subtarget) "sega", "segacons", "seibu", - "selchow", "sequential", "seta", "sgi", @@ -2331,12 +2328,6 @@ files { MAME_DIR .. "src/mame/h01x/*.cpp", } -createMAMEProjects(_target, _subtarget, "handheld") -files { - MAME_DIR .. "src/mame/handheld/*.cpp", - MAME_DIR .. "src/mame/handheld/*.h", -} - createMAMEProjects(_target, _subtarget, "hartung") files { MAME_DIR .. "src/mame/hartung/*.cpp", @@ -2932,11 +2923,6 @@ files { MAME_DIR .. "src/mame/palm/*.ipp", } -createMAMEProjects(_target, _subtarget, "parker") -files { - MAME_DIR .. "src/mame/parker/*.cpp", -} - createMAMEProjects(_target, _subtarget, "pc") files { MAME_DIR .. "src/mame/pc/*.cpp", @@ -3057,11 +3043,6 @@ files { MAME_DIR .. "src/mame/regnecentralen/*.h", } -createMAMEProjects(_target, _subtarget, "ritam") -files { - MAME_DIR .. "src/mame/ritam/*.cpp", -} - createMAMEProjects(_target, _subtarget, "rm") files { MAME_DIR .. "src/mame/rm/*.cpp", @@ -3155,11 +3136,6 @@ files { MAME_DIR .. "src/mame/seibu/*.ipp", } -createMAMEProjects(_target, _subtarget, "selchow") -files { - MAME_DIR .. "src/mame/selchow/*.cpp", -} - createMAMEProjects(_target, _subtarget, "sequential") files { MAME_DIR .. "src/mame/sequential/*.cpp", @@ -3669,6 +3645,12 @@ files { MAME_DIR .. "src/mame/misc/*.h", } +createMAMEProjects(_target, _subtarget, "misc_handheld") +files { + MAME_DIR .. "src/mame/misc_handheld/*.cpp", + MAME_DIR .. "src/mame/misc_handheld/*.h", +} + createMAMEProjects(_target, _subtarget, "skeleton") files { MAME_DIR .. "src/mame/skeleton/*.cpp", diff --git a/src/mame/handheld/hh_cop400.cpp b/src/mame/handheld/hh_cop400.cpp deleted file mode 100644 index 587d1575207..00000000000 --- a/src/mame/handheld/hh_cop400.cpp +++ /dev/null @@ -1,2506 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -National Semiconductor COPS(COP400 MCU series) handhelds or other simple -devices, mostly LED electronic games/toys. - -TODO: -- why does h2hbaskbc(and clones) need a workaround on writing L pins? -- plus1: which sensor position is which colour? -- vidchal: Add screen and gun cursor with brightness detection callback, - and softwarelist for the video tapes. We'd also need a VHS player device. - The emulated lightgun itself appears to be working fine(eg. add a 30hz - timer to IN.3 to score +100) -- solution release year, most chips on the PCB were from 1984, but this one - was dumped from a licensed product branded for the VWR company, so it - could be later than the initial release - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/cop400/cop400.h" -#include "video/pwm.h" -#include "machine/timer.h" -#include "sound/spkrdev.h" -#include "sound/dac.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "bship82.lh" // clickable -#include "ctstein.lh" // clickable -#include "einvaderc.lh" -#include "funjacks.lh" // clickable -#include "funrlgl.lh" // clickable -#include "funtag.lh" // clickable -#include "h2hbaskbc.lh" -#include "h2hhockeyc.lh" -#include "h2hsoccerc.lh" -#include "lafootb.lh" -#include "lchicken.lh" // clickable -#include "lightfgt.lh" // clickable -#include "mbaskb2.lh" -#include "mdallas.lh" -#include "msoccer2.lh" -#include "qkracer.lh" -#include "scat.lh" -#include "unkeinv.lh" -#include "vidchal.lh" - -//#include "hh_cop400_test.lh" // common test-layout - use external artwork - - -class hh_cop400_state : public driver_device -{ -public: - hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_l = 0; // MCU port L write data - u8 m_g = 0; // MCU port G write data - u8 m_d = 0; // MCU port D write data - int m_so = 0; // MCU SO line state - int m_sk = 0; // MCU SK line state - u16 m_inp_mux = ~0; // multiplexed inputs mask - - u16 read_inputs(int columns, u16 colmask = ~0); -}; - - -// machine start/reset - -void hh_cop400_state::machine_start() -{ - // register for savestates - save_item(NAME(m_l)); - save_item(NAME(m_g)); - save_item(NAME(m_d)); - save_item(NAME(m_so)); - save_item(NAME(m_sk)); - save_item(NAME(m_inp_mux)); -} - -void hh_cop400_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_cop400_state::read_inputs(int columns, u16 colmask) -{ - // active low - u16 ret = ~0 & colmask; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (~m_inp_mux >> i & 1) - ret &= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button) -{ - // when an input is directly wired to MCU reset pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Castle Toy Einstein - * COP421 MCU label ~/927 COP421-NEZ/N - * 4 lamps, 1-bit sound - - This is a Simon clone, the tones are not harmonic. Two models exist, each - with a different batteries setup, assume they're same otherwise. - -***************************************************************************/ - -class ctstein_state : public hh_cop400_state -{ -public: - ctstein_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void ctstein(machine_config &config); - -private: - void write_g(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void ctstein_state::write_g(u8 data) -{ - // G0-G2: input mux - m_inp_mux = data & 7; -} - -void ctstein_state::write_l(u8 data) -{ - // L0-L3: button lamps - m_display->matrix(1, data & 0xf); -} - -u8 ctstein_state::read_l() -{ - // L4-L7: multiplexed inputs - return read_inputs(3, 0xf) << 4 | 0xf; -} - -// config - -static INPUT_PORTS_START( ctstein ) - PORT_START("IN.0") // G0 port L - PORT_CONFNAME( 0x0f, 0x01^0x0f, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01^0x0f, "1" ) - PORT_CONFSETTING( 0x02^0x0f, "2" ) - PORT_CONFSETTING( 0x04^0x0f, "3" ) - PORT_CONFSETTING( 0x08^0x0f, "4" ) - - PORT_START("IN.1") // G1 port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SELECT ) PORT_NAME("Best Score") - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Red Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Green Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Blue Button") -INPUT_PORTS_END - -void ctstein_state::ctstein(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_g().set(FUNC(ctstein_state::write_g)); - m_maincpu->write_l().set(FUNC(ctstein_state::write_l)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ctstein); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ctstein ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Basketball/Hockey/Soccer (model 2150/2160/2170) - * COP420 MCU label COP420L-NEZ/N - * 2-digit 7seg display, 41 other leds, 1-bit sound - - 3 Head to Head games were released using this MCU/ROM. They play very much - the same, only differing on game time. The PCB is pre-configured on G1+IN2 - and IN3 to select the game. - - An earlier revision of this runs on TMS1000, see hh_tms1k.cpp driver. Model - numbers are the same. From the outside, an easy way to spot the difference is - the Start/Display button: TMS1000 version button label is D, COP420 one is a *. - The COP420 version also plays much slower. - -***************************************************************************/ - -class h2hbaskbc_state : public hh_cop400_state -{ -public: - h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void h2hsoccerc(machine_config &config); - void h2hbaskbc(machine_config &config); - void h2hhockeyc(machine_config &config); - -private: - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); -}; - -// handlers - -void h2hbaskbc_state::write_d(u8 data) -{ - // D: led select - m_d = data & 0xf; -} - -void h2hbaskbc_state::write_g(u8 data) -{ - // G: led select, input mux - m_inp_mux = data; - m_g = data & 0xf; -} - -void h2hbaskbc_state::write_l(u8 data) -{ - // D2,D3 double as multiplexer - u16 mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00); - u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask; - - // D2+G0,G1 are 7segs - // L0-L6: digit segments A-G, L0-L4: led data - m_display->matrix(sel, data); -} - -u8 h2hbaskbc_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(4, 7) | (m_inputs[4]->read() & 8); -} - -// config - -static INPUT_PORTS_START( h2hbaskbc ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start/Display") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // factory set - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x04, "Factory Test" ) - PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("IN.4") // IN3 (factory set) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hhockeyc ) - PORT_INCLUDE( h2hbaskbc ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hsoccerc ) - PORT_INCLUDE( h2hhockeyc ) - - PORT_MODIFY("IN.1") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) -INPUT_PORTS_END - -void h2hbaskbc_state::h2hbaskbc(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 1000000); // approximation - RC osc. R=43K, C=101pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(h2hbaskbc_state::write_d)); - m_maincpu->write_g().set(FUNC(h2hbaskbc_state::write_g)); - m_maincpu->write_l().set(FUNC(h2hbaskbc_state::write_l)); - m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_h2hbaskbc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void h2hbaskbc_state::h2hhockeyc(machine_config &config) -{ - h2hbaskbc(config); - config.set_default_layout(layout_h2hhockeyc); -} - -void h2hbaskbc_state::h2hsoccerc(machine_config &config) -{ - h2hbaskbc(config); - config.set_default_layout(layout_h2hsoccerc); -} - -// roms - -ROM_START( h2hbaskbc ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) ) -ROM_END - -#define rom_h2hhockeyc rom_h2hbaskbc // dumped from Basketball -#define rom_h2hsoccerc rom_h2hbaskbc // " - - - - - -/*************************************************************************** - - Entex Space Invader - * COP444L MCU label /B138 COPL444-HRZ/N INV II (die label HRZ COP 444L/A) - * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - The first version was on TMS1100 (see hh_tms1k.c), this is the reprogrammed - second release with a gray case instead of black. - -***************************************************************************/ - -class einvaderc_state : public hh_cop400_state -{ -public: - einvaderc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void einvaderc(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - DECLARE_WRITE_LINE_MEMBER(write_sk); - DECLARE_WRITE_LINE_MEMBER(write_so); - void write_l(u8 data); -}; - -// handlers - -void einvaderc_state::update_display() -{ - u8 l = bitswap<8>(m_l,7,6,0,1,2,3,4,5); - u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff; - - m_display->matrix(grid, l); -} - -void einvaderc_state::write_d(u8 data) -{ - // D: led grid 0-3 (D0-D2 are 7segs) - m_d = data; - update_display(); -} - -void einvaderc_state::write_g(u8 data) -{ - // G: led grid 4-7 - m_g = data; - update_display(); -} - -WRITE_LINE_MEMBER(einvaderc_state::write_sk) -{ - // SK: speaker out + led grid 8 - m_speaker->level_w(state); - m_sk = state; - update_display(); -} - -WRITE_LINE_MEMBER(einvaderc_state::write_so) -{ - // SO: led grid 9 - m_so = state; - update_display(); -} - -void einvaderc_state::write_l(u8 data) -{ - // L: led state/segment - m_l = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( einvaderc ) - PORT_START("IN.0") // port IN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "Amateur" ) - PORT_CONFSETTING( 0x00, "Professional" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) -INPUT_PORTS_END - -void einvaderc_state::einvaderc(machine_config &config) -{ - // basic machine hardware - COP444L(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->read_in().set_ioport("IN.0"); - m_maincpu->write_d().set(FUNC(einvaderc_state::write_d)); - m_maincpu->write_g().set(FUNC(einvaderc_state::write_g)); - m_maincpu->write_sk().set(FUNC(einvaderc_state::write_sk)); - m_maincpu->write_so().set(FUNC(einvaderc_state::write_so)); - m_maincpu->write_l().set(FUNC(einvaderc_state::write_l)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(919, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_einvaderc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvaderc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) ) - - ROM_REGION( 82104, "mask", 0) - ROM_LOAD( "einvaderc.svg", 0, 82104, CRC(0013227f) SHA1(44a3ac48c947369231f010559331ad16fcbef7be) ) -ROM_END - - - - - -/*************************************************************************** - - Gordon Barlow Design electronic Space Invaders game (unreleased, from patent US4345764) - * COP421 (likely a development chip) - * 36+9 LEDs, 1-bit sound - - This game is presumedly unreleased. The title is unknown, the patent simply names - it "Hand-held electronic game". There is no mass-manufacture company assigned - to it either. The game seems unfinished(no scorekeeping, some bugs), and the design - is very complex. Player ship and bullets are on a moving "wand", a 2-way mirror - makes it appear on the same plane as the enemies and barriers. - -***************************************************************************/ - -class unkeinv_state : public hh_cop400_state -{ -public: - unkeinv_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void unkeinv(machine_config &config); - -private: - void update_display(); - void write_g(u8 data); - void write_d(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void unkeinv_state::update_display() -{ - m_display->matrix(m_g << 4 | m_d, m_l); -} - -void unkeinv_state::write_g(u8 data) -{ - // G0,G1: led select part - // G2,G3: input mux - m_g = ~data & 0xf; - update_display(); -} - -void unkeinv_state::write_d(u8 data) -{ - // D0-D3: led select part - m_d = ~data & 0xf; - update_display(); -} - -void unkeinv_state::write_l(u8 data) -{ - // L0-L7: led data - m_l = ~data & 0xff; - update_display(); -} - -u8 unkeinv_state::read_l() -{ - u8 ret = 0xff; - - // L0-L5+G2: positional odd - // L0-L5+G3: positional even - u8 pos = m_inputs[1]->read(); - if (m_g & 4 && pos & 1) - ret ^= (1 << (pos >> 1)); - if (m_g & 8 && ~pos & 1) - ret ^= (1 << (pos >> 1)); - - // L7+G3: fire button - if (m_g & 8 && m_inputs[0]->read()) - ret ^= 0x80; - - return ret & ~m_l; -} - -// config - -static INPUT_PORTS_START( unkeinv ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") - PORT_BIT( 0x0f, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(12) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) -INPUT_PORTS_END - -void unkeinv_state::unkeinv(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // frequency guessed - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_g().set(FUNC(unkeinv_state::write_g)); - m_maincpu->write_d().set(FUNC(unkeinv_state::write_d)); - m_maincpu->write_l().set(FUNC(unkeinv_state::write_l)); - m_maincpu->read_l().set(FUNC(unkeinv_state::read_l)); - m_maincpu->read_l_tristate().set_constant(0xff); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 8); - config.set_default_layout(layout_unkeinv); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( unkeinv ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality -ROM_END - - - - - -/*************************************************************************** - - LJN I Took a Lickin' From a Chicken - * COP421 MCU label ~/005 COP421-NJC/N - * 11 leds, 1-bit sound, motor to a chicken on a spring - - This toy includes 4 games: Tic Tac Toe, Chicken Sez, and Total Recall I/II. - - known releases: - - USA: I Took a Lickin' From a Chicken, published by LJN - - Japan: Professor Chicken's Genius Classroom 「にわとり博士の天才教室」, published by Bandai - (not sure if it's the same ROM, or just licensed the outer shell) - -***************************************************************************/ - -class lchicken_state : public hh_cop400_state -{ -public: - lchicken_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag), - m_motor_pos_out(*this, "motor_pos"), - m_motor_on_out(*this, "motor_on") - { } - - void lchicken(machine_config &config); - - DECLARE_READ_LINE_MEMBER(motor_switch_r); - -protected: - virtual void machine_start() override; - -private: - output_finder<> m_motor_pos_out; - output_finder<> m_motor_on_out; - - u8 m_motor_pos = 0; - TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); - - void write_l(u8 data); - void write_d(u8 data); - void write_g(u8 data); - u8 read_g(); -}; - -void lchicken_state::machine_start() -{ - hh_cop400_state::machine_start(); - - m_motor_pos_out.resolve(); - m_motor_on_out.resolve(); - - // register for savestates - save_item(NAME(m_motor_pos)); -} - -// handlers - -READ_LINE_MEMBER(lchicken_state::motor_switch_r) -{ - return m_motor_pos > 0xe8; // approximation -} - -TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick) -{ - if (~m_inp_mux & 8) - { - m_motor_pos++; - m_motor_pos_out = 100 * (m_motor_pos / (float)0x100); - } -} - -void lchicken_state::write_l(u8 data) -{ - // L0-L3: led data - // L4-L6: led select - // L7: N/C - m_display->matrix(data >> 4 & 7, ~data & 0xf); -} - -void lchicken_state::write_d(u8 data) -{ - // D0-D3: input mux - // D3: motor on - m_inp_mux = data & 0xf; - m_motor_on_out = ~data >> 3 & 1; -} - -void lchicken_state::write_g(u8 data) -{ - m_g = data; -} - -u8 lchicken_state::read_g() -{ - // G0-G3: multiplexed inputs - return read_inputs(4, m_g); -} - -// config - -static INPUT_PORTS_START( lchicken ) - PORT_START("IN.0") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(lchicken_state, motor_switch_r) -INPUT_PORTS_END - -void lchicken_state::lchicken(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(lchicken_state::write_l)); - m_maincpu->write_d().set(FUNC(lchicken_state::write_d)); - m_maincpu->write_g().set(FUNC(lchicken_state::write_g)); - m_maincpu->read_g().set(FUNC(lchicken_state::read_g)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); - - TIMER(config, "chicken_motor").configure_periodic(FUNC(lchicken_state::motor_sim_tick), attotime::from_msec(6000/0x100)); // ~6sec for a full rotation - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 4); - config.set_default_layout(layout_lchicken); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lchicken ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Jacks (model 1603) - * COP410L MCU die bonded directly to PCB (die label COP410L/B NGS) - * 8 LEDs, 1-bit sound - -***************************************************************************/ - -class funjacks_state : public hh_cop400_state -{ -public: - funjacks_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funjacks(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_g(); -}; - -// handlers - -void funjacks_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funjacks_state::write_d(u8 data) -{ - // D: led grid + input mux - m_inp_mux = data; - m_d = ~data & 0xf; - update_display(); -} - -void funjacks_state::write_l(u8 data) -{ - // L0,L1: led state - m_l = data & 3; - update_display(); -} - -void funjacks_state::write_g(u8 data) -{ - // G1: speaker out - m_speaker->level_w(data >> 1 & 1); - m_g = data; -} - -u8 funjacks_state::read_l() -{ - // L4,L5: multiplexed inputs - return read_inputs(3, 0x30) | m_l; -} - -u8 funjacks_state::read_g() -{ - // G1: speaker out state - // G2,G3: inputs - return m_inputs[3]->read() | (m_g & 2); -} - -// config - -static INPUT_PORTS_START( funjacks ) - PORT_START("IN.0") // D0 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) - - PORT_START("IN.1") // D1 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) - - PORT_START("IN.2") // D2 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // positioned at 1 o'clock on panel, increment clockwise - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) - - PORT_START("IN.3") // port G - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speaker - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void funjacks_state::funjacks(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=56pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funjacks_state::write_d)); - m_maincpu->write_l().set(FUNC(funjacks_state::write_l)); - m_maincpu->write_g().set(FUNC(funjacks_state::write_g)); - m_maincpu->read_l().set(FUNC(funjacks_state::read_l)); - m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 2); - config.set_default_layout(layout_funjacks); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funjacks ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Red Light Green Light (model 1604) - * COP410L MCU die bonded directly to PCB (die label COP410L/B NHZ) - * 14 LEDs, 1-bit sound - - known releases: - - USA: Funtronics: Red Light Green Light, published by Mattel - - USA(rerelease): Funtronics: Hot Wheels Drag Race, published by Mattel - -***************************************************************************/ - -class funrlgl_state : public hh_cop400_state -{ -public: - funrlgl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funrlgl(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); -}; - -// handlers - -void funrlgl_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funrlgl_state::write_d(u8 data) -{ - // D: led grid - m_d = ~data & 0xf; - update_display(); -} - -void funrlgl_state::write_l(u8 data) -{ - // L0-L3: led state - // L4-L7: N/C - m_l = ~data & 0xf; - update_display(); -} - -void funrlgl_state::write_g(u8 data) -{ - // G3: speaker out - m_speaker->level_w(data >> 3 & 1); -} - -// config - -static INPUT_PORTS_START( funrlgl ) - PORT_START("IN.0") // port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, 0) -INPUT_PORTS_END - -void funrlgl_state::funrlgl(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 800000); // approximation - RC osc. R=51K, C=91pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funrlgl_state::write_d)); - m_maincpu->write_l().set(FUNC(funrlgl_state::write_l)); - m_maincpu->read_l_tristate().set_constant(0xff); - m_maincpu->write_g().set(FUNC(funrlgl_state::write_g)); - m_maincpu->read_g().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 4); - m_display->set_bri_levels(0.005, 0.1); // top led is brighter - config.set_default_layout(layout_funrlgl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funrlgl ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Tag (model 1497) - * COP410L MCU die bonded directly to PCB (die label COP410L/B GTJ) - * 7 LEDs, 7 buttons, 1-bit sound - -***************************************************************************/ - -class funtag_state : public hh_cop400_state -{ -public: - funtag_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funtag(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_g(); -}; - -// handlers - -void funtag_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funtag_state::write_d(u8 data) -{ - // D: led grid + input mux - m_inp_mux = data; - m_d = ~data & 0xf; - update_display(); -} - -void funtag_state::write_l(u8 data) -{ - // L0,L1: led state - m_l = data & 3; - update_display(); -} - -void funtag_state::write_g(u8 data) -{ - // G2: speaker out - m_speaker->level_w(data >> 2 & 1); -} - -u8 funtag_state::read_l() -{ - // L2: difficulty switch - return m_inputs[4]->read() | 8; -} - -u8 funtag_state::read_g() -{ - // G0,G1: multiplexed inputs - // G3: start button - return read_inputs(3, 3) | m_inputs[3]->read() | 4; -} - -// config - -static INPUT_PORTS_START( funtag ) - PORT_START("IN.0") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) - - PORT_START("IN.1") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) - - PORT_START("IN.2") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) - - PORT_START("IN.3") // port G - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START ) - - PORT_START("IN.4") // port L - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void funtag_state::funtag(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=47K, C=91pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funtag_state::write_d)); - m_maincpu->write_l().set(FUNC(funtag_state::write_l)); - m_maincpu->write_g().set(FUNC(funtag_state::write_g)); - m_maincpu->read_l().set(FUNC(funtag_state::read_l)); - m_maincpu->read_g().set(FUNC(funtag_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 2); - config.set_default_layout(layout_funtag); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funtag ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_gtj", 0x0000, 0x0200, CRC(ce565da6) SHA1(34e5f39e32f220007d353c93787c1a6d117592c1) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Basketball 2 (model 1645), Soccer 2 (model 1642) - * PCB label: MA6037/38 - * dual COP420L MCUs, dies bonded to PCB (see romdefs for rom serials) - * 4001, die also bonded to PCB - * 2-digit 7seg display, 36 other leds, 1-bit sound - - The clock generator was measured ~527kHz for mbaskb2, ~483kHz for msoccer2, - meaning that the internal divider is 8. Main MCU SK connects to the other - MCU CKO pin, probably for syncing serial I/O. - - These two are on the same hardware, see patents US4341383 and US4372556 - for detailed descriptions of the games. - -***************************************************************************/ - -class mbaskb2_state : public hh_cop400_state -{ -public: - mbaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag), - m_subcpu(*this, "subcpu"), - m_on_timer(*this, "on_timer") - { } - - void mbaskb2(machine_config &config); - void msoccer2(machine_config &config); - - DECLARE_CUSTOM_INPUT_MEMBER(switch_r); - -protected: - virtual void machine_reset() override; - -private: - required_device m_subcpu; - required_device m_on_timer; - - void update_display(); - void shared_write_l(u8 data); - void main_write_g(u8 data); - void sub_write_g(u8 data); - void sub_write_d(u8 data); - u8 sub_read_in(); -}; - -void mbaskb2_state::machine_reset() -{ - hh_cop400_state::machine_reset(); - m_on_timer->adjust(attotime::from_msec(5)); -} - -// handlers - -void mbaskb2_state::update_display() -{ - m_display->matrix(~(m_d << 4 | m_g), m_l); -} - -void mbaskb2_state::shared_write_l(u8 data) -{ - // L: led data (though it's unlikely that maincpu will write valid led data to it) - m_l = m_maincpu->l_r() | m_subcpu->l_r(); - update_display(); -} - -void mbaskb2_state::main_write_g(u8 data) -{ - // G1: speaker out - m_speaker->level_w(data >> 1 & 1); -} - -void mbaskb2_state::sub_write_g(u8 data) -{ - // G: led select (low), input mux - m_g = m_inp_mux = data & 0xf; - update_display(); -} - -void mbaskb2_state::sub_write_d(u8 data) -{ - // D: led select (high) - m_d = data & 0xf; - update_display(); -} - -u8 mbaskb2_state::sub_read_in() -{ - // IN: multiplexed inputs - return read_inputs(3, 0xf); -} - -// config - -CUSTOM_INPUT_MEMBER(mbaskb2_state::switch_r) -{ - // The power switch is off-1-2, and the game relies on power-on starting at 1, - // otherwise msoccer2 boots up to what looks like a factory test mode. - return (m_inputs[3]->read() & 1) | (m_on_timer->enabled() ? 1 : 0); -} - -static INPUT_PORTS_START( mbaskb2 ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Shoot") - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Defense: Man") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Defense: Zone") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Defense: Press") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mbaskb2_state, switch_r) - - PORT_START("IN.3") - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( msoccer2 ) - PORT_INCLUDE( mbaskb2 ) - - PORT_MODIFY("IN.2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Low/High Kick") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Teammate") -INPUT_PORTS_END - -void mbaskb2_state::mbaskb2(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 500000); // approximation - m_maincpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed - m_maincpu->write_g().set(FUNC(mbaskb2_state::main_write_g)); - m_maincpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); - m_maincpu->read_l().set(m_subcpu, FUNC(cop400_cpu_device::l_r)); - m_maincpu->read_l_tristate().set_constant(0x80); - m_maincpu->read_si().set(m_subcpu, FUNC(cop400_cpu_device::so_r)); - - COP420(config, m_subcpu, 500000); // same as maincpu - m_subcpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed - m_subcpu->write_d().set(FUNC(mbaskb2_state::sub_write_d)); - m_subcpu->write_g().set(FUNC(mbaskb2_state::sub_write_g)); - m_subcpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); - m_subcpu->read_l().set(m_maincpu, FUNC(cop400_cpu_device::l_r)); - m_subcpu->read_l_tristate().set_constant(0x80); - m_subcpu->read_in().set(FUNC(mbaskb2_state::sub_read_in)); - m_subcpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); - m_subcpu->read_cko().set(m_maincpu, FUNC(cop400_cpu_device::sk_r)); - - config.set_perfect_quantum(m_maincpu); - - TIMER(config, "on_timer").configure_generic(nullptr); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(0xc0, 0x7f); - m_display->set_bri_levels(0.008, 0.04); // offense is brighter - config.set_default_layout(layout_mbaskb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void mbaskb2_state::msoccer2(machine_config &config) -{ - mbaskb2(config); - config.set_default_layout(layout_msoccer2); -} - -// roms - -ROM_START( mbaskb2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l_nmp", 0x0000, 0x0400, CRC(afc44378) SHA1(e96435bd1d0b2bea5140efdfe21f4684f2525075) ) - - ROM_REGION( 0x0400, "subcpu", 0 ) - ROM_LOAD( "cop420l_nmq", 0x0000, 0x0400, CRC(70943f6f) SHA1(3f711d8b7c7c5dd13c68bf1ef980d2f784b748f4) ) -ROM_END - -ROM_START( msoccer2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l_nnm", 0x0000, 0x0400, CRC(c9169aca) SHA1(525486e8a18ec6132e53f9be582b2667172230a9) ) - - ROM_REGION( 0x0400, "subcpu", 0 ) - ROM_LOAD( "cop420l_nnk", 0x0000, 0x0400, CRC(a84dd5f4) SHA1(5d269816248319a2bca1708d5022af455d52682d) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Look Alive! Football (model 1998) - * COP421L MCU die bonded directly to PCB (rom serial HCJ) - * 2 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - For a detailed description, see patent US4582323. 1st-person view versions - for Baseball and Basketball were also announced, but not released. - -***************************************************************************/ - -class lafootb_state : public hh_cop400_state -{ -public: - lafootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void lafootb(machine_config &config); - -private: - void update_display(); - void write_l(u8 data); - void write_d(u8 data); - u8 read_g(); -}; - -// handlers - -void lafootb_state::update_display() -{ - m_display->matrix(~m_d, m_l); -} - -void lafootb_state::write_l(u8 data) -{ - // L: led data - m_l = data; - update_display(); -} - -void lafootb_state::write_d(u8 data) -{ - // D: led select, D2,D3: input mux - m_d = data & 0xf; - m_inp_mux = data >> 2 & 3; - update_display(); -} - -u8 lafootb_state::read_g() -{ - // G: multiplexed inputs - return read_inputs(2, 7) | (m_inputs[2]->read() & 8); -} - -// config - -static INPUT_PORTS_START( lafootb ) - PORT_START("IN.0") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Right / Home") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick / Yards to go") - - PORT_START("IN.1") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Left / Visitors") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Up / Time") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass / Status") - - PORT_START("IN.2") // G3 - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void lafootb_state::lafootb(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 900000); // approximation - RC osc. R=51K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(lafootb_state::write_l)); - m_maincpu->write_d().set(FUNC(lafootb_state::write_d)); - m_maincpu->read_g().set(FUNC(lafootb_state::read_g)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1920, 864); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(4, 8); - m_display->set_segmask(0x4, 0x7f); - m_display->set_segmask(0x8, 0xff); // right digit has dp - m_display->set_bri_levels(0.005); - config.set_default_layout(layout_lafootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lafootb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421l_hcj", 0x0000, 0x0400, CRC(a9cc1e94) SHA1(7a39f5a5f10b8a2bd72da3ff3f3fcfaad35ead5f) ) - - ROM_REGION( 38608, "mask", 0) - ROM_LOAD( "lafootb.svg", 0, 38608, CRC(35387445) SHA1(7cd9db170820fc84d47545c3db8d991b2c5f4f7f) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Dalla$ (J.R. handheld) - * COP444 MCU label COP444L-HYN/N - * 8-digit 7seg display, 1-bit sound - - This is a board game, only the handheld device is emulated here. - -***************************************************************************/ - -class mdallas_state : public hh_cop400_state -{ -public: - mdallas_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void mdallas(machine_config &config); - -private: - void update_display(); - void write_l(u8 data); - void write_d(u8 data); - void write_g(u8 data); - u8 read_in(); -}; - -// handlers - -void mdallas_state::update_display() -{ - m_display->matrix(~(m_d << 4 | m_g), m_l); -} - -void mdallas_state::write_l(u8 data) -{ - // L: digit segment data - m_l = data; - update_display(); -} - -void mdallas_state::write_d(u8 data) -{ - // D: select digit, input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); - m_d = data & 0xf; - update_display(); -} - -void mdallas_state::write_g(u8 data) -{ - // G: select digit, input mux low - m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); - m_g = data & 0xf; - update_display(); -} - -u8 mdallas_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(6, 0xf); -} - -// config - -/* physical button layout and labels are like this: - - < ON> [YES] [NO] [NEXT] - [] - [7] [8] [9] [STATUS] - [4] [5] [6] [ASSETS] - [1] [2] [3] [START] - [CLEAR] [0] [MOVE] [ENTER] -*/ - -static INPUT_PORTS_START( mdallas ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Start") - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Assets") - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Status") - - PORT_START("IN.4") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("West") // W - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Next") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("East") // E - - PORT_START("IN.5") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("No") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Yes") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("South") // S - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("North") // N -INPUT_PORTS_END - -void mdallas_state::mdallas(machine_config &config) -{ - // basic machine hardware - COP444L(config, m_maincpu, 900000); // approximation - RC osc. R=57K, C=101pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(mdallas_state::write_l)); - m_maincpu->write_d().set(FUNC(mdallas_state::write_d)); - m_maincpu->write_g().set(FUNC(mdallas_state::write_g)); - m_maincpu->read_in().set(FUNC(mdallas_state::read_in)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_mdallas); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mdallas ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cop444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Plus One - * COP410L MCU in 8-pin DIP, label ~/029 MM 57405 (die label COP410L/B NNE) - * orientation sensor(4 directions), 1-bit sound - - This is a board game, each player needs to rotate a triangular pyramid - shaped piece the same as the previous player, plus 1. - -***************************************************************************/ - -class plus1_state : public hh_cop400_state -{ -public: - plus1_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void plus1(machine_config &config); - -private: - void write_d(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void plus1_state::write_d(u8 data) -{ - // D0?: speaker out - m_speaker->level_w(data & 1); -} - -void plus1_state::write_l(u8 data) -{ - m_l = data; -} - -u8 plus1_state::read_l() -{ - // L: IN.1, mask with output - return m_inputs[1]->read() & m_l; -} - -// config - -static INPUT_PORTS_START( plus1 ) - PORT_START("IN.0") // port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Sensor Position 3") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sensor Position 1") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Sensor Position 4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sensor Position 2") - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void plus1_state::plus1(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=51K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(plus1_state::write_d)); - m_maincpu->read_g().set_ioport("IN.0"); - m_maincpu->write_l().set(FUNC(plus1_state::write_l)); - m_maincpu->read_l().set(FUNC(plus1_state::read_l)); - - // no visual feedback! - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( plus1 ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Lightfight - * COP421L MCU label /B119 COP421L-HLA/N - * LED matrix, 1-bit sound - - Xbox-shaped electronic game for 2 or more players, with long diagonal buttons - next to each outer LED. The main object of the game is to pinpoint a light - by pressing 2 buttons. To start, press a skill-level button(P2 button 7/8/9) - after selecting a game mode(P1 button 6-10). - - The game variations are: - 1: LightFight - 2: NightFight - 3: RiteSite - 4: QuiteBrite - 5: RightLight - -***************************************************************************/ - -class lightfgt_state : public hh_cop400_state -{ -public: - lightfgt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void lightfgt(machine_config &config); - -private: - void update_display(); - DECLARE_WRITE_LINE_MEMBER(write_so); - void write_d(u8 data); - void write_l(u8 data); - u8 read_g(); -}; - -// handlers - -void lightfgt_state::update_display() -{ - u8 grid = (m_so | m_d << 1) ^ 0x1f; - m_display->matrix(grid, m_l); -} - -WRITE_LINE_MEMBER(lightfgt_state::write_so) -{ - // SO: led grid 0 (and input mux) - m_so = state; - update_display(); -} - -void lightfgt_state::write_d(u8 data) -{ - // D: led grid 1-4 (and input mux) - m_d = data; - update_display(); -} - -void lightfgt_state::write_l(u8 data) -{ - // L0-L4: led state - // L5-L7: N/C - m_l = data & 0x1f; - update_display(); -} - -u8 lightfgt_state::read_g() -{ - // G: multiplexed inputs - m_inp_mux = m_d << 1 | m_so; - return read_inputs(5, 0xf); -} - -// config - -static INPUT_PORTS_START( lightfgt ) - PORT_START("IN.0") // SO port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) // note: button 1 is on the left side from player perspective - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_COCKTAIL - - PORT_START("IN.1") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_COCKTAIL - - PORT_START("IN.2") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_COCKTAIL - - PORT_START("IN.3") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_COCKTAIL - - PORT_START("IN.4") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_COCKTAIL -INPUT_PORTS_END - -void lightfgt_state::lightfgt(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 950000); // approximation - RC osc. R=82K, C=56pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_so().set(FUNC(lightfgt_state::write_so)); - m_maincpu->write_d().set(FUNC(lightfgt_state::write_d)); - m_maincpu->write_l().set(FUNC(lightfgt_state::write_l)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 5); - config.set_default_layout(layout_lightfgt); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lightfgt ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1982 version) - * COP420 MCU label COP420-JWE/N - - see hh_tms1k.cpp bship driver for more information - -***************************************************************************/ - -class bship82_state : public hh_cop400_state -{ -public: - bship82_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void bship82(machine_config &config); - -private: - void write_d(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_in(); - DECLARE_WRITE_LINE_MEMBER(write_so); -}; - -// handlers - -void bship82_state::write_d(u8 data) -{ - // D: input mux - m_inp_mux = data; -} - -void bship82_state::write_g(u8 data) -{ - // G0-G2: speaker out via 3.9K, 2.2K, 1.0K resistor - // G3: enable speaker - m_speaker->level_w((data & 8) ? (data & 7) : 0); -} - -u8 bship82_state::read_l() -{ - // L: multiplexed inputs - return read_inputs(4, 0xff); -} - -u8 bship82_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(4, 0xf00) >> 8; -} - -WRITE_LINE_MEMBER(bship82_state::write_so) -{ - // SO: led - m_display->matrix(1, state); -} - -// config - -static INPUT_PORTS_START( bship82 ) - PORT_START("IN.0") // D0 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // D1 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") - - PORT_START("IN.2") // D2 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") // CLE - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 A") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 B") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 C") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 D") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 E") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 F") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 G") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 H") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 I") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 J") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // D3 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") // CM - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 1") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 2") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 3") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 4") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 5") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 6") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 7") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 8") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 9") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 10") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Fire") - - PORT_START("IN.4") // SI - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch -INPUT_PORTS_END - -void bship82_state::bship82(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 750000); // approximation - RC osc. R=14K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(bship82_state::write_d)); - m_maincpu->write_g().set(FUNC(bship82_state::write_g)); - m_maincpu->read_l().set(FUNC(bship82_state::read_l)); - m_maincpu->read_in().set(FUNC(bship82_state::read_in)); - m_maincpu->write_so().set(FUNC(bship82_state::write_so)); - m_maincpu->read_si().set_ioport("IN.4"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship82); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/7.0, 2.0/7.0, 3.0/7.0, 4.0/7.0, 5.0/7.0, 6.0/7.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bship82 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Racer (COP420 version) - * COP420 MCU label COP420-NPG/N - * 8-digit 7seg led display(1 custom digit), 1 green led, no sound - - This is the COP420 version, they removed support for the link cable. - The first release was on a MM5799 MCU, see hh_cops1.cpp. - -***************************************************************************/ - -class qkracer_state : public hh_cop400_state -{ -public: - qkracer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void qkracer(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); - DECLARE_WRITE_LINE_MEMBER(write_sk); -}; - -// handlers - -void qkracer_state::update_display() -{ - m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l); -} - -void qkracer_state::write_d(u8 data) -{ - // D: select digit, D3: input mux low bit - m_inp_mux = (m_inp_mux & ~1) | (data >> 3 & 1); - m_d = data & 0xf; - update_display(); -} - -void qkracer_state::write_g(u8 data) -{ - // G: select digit, input mux - m_inp_mux = (m_inp_mux & 1) | (data << 1 & 0x1e); - m_g = data & 0xf; - update_display(); -} - -void qkracer_state::write_l(u8 data) -{ - // L0-L6: digit segment data - m_l = data & 0x7f; - update_display(); -} - -u8 qkracer_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(5, 0xf); -} - -WRITE_LINE_MEMBER(qkracer_state::write_sk) -{ - // SK: green led - m_sk = state; - update_display(); -} - -// config - -static INPUT_PORTS_START( qkracer ) - PORT_START("IN.0") // D3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") - - PORT_START("IN.1") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.2") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void qkracer_state::qkracer(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 950000); // approximation - RC osc. R=47K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(qkracer_state::write_d)); - m_maincpu->write_g().set(FUNC(qkracer_state::write_g)); - m_maincpu->write_l().set(FUNC(qkracer_state::write_l)); - m_maincpu->read_in().set(FUNC(qkracer_state::read_in)); - m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0xdf, 0x7f); - m_display->set_segmask(0x20, 0x41); // equals sign - config.set_default_layout(layout_qkracer); - - // no sound! -} - -// roms - -ROM_START( qkracer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor Cops Pocket Assistant (CPA) - * COP444 MCU label COP444L-JXY/N - * 8-digit 7seg display, 1-bit sound - - It's a programmable COP400 series MCU simulator, on a COP400 series MCU. - Note that this MCU doesn't have executable RAM, so it truly is a simulator. - The hardware/PCB and the green clamshell are identical to Mattel Dalla$. - -***************************************************************************/ - -// handlers: see mdallas_state - -// config - -static INPUT_PORTS_START( copspa ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / CLRA") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / LQID") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / COMP") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / CAB") - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / RC") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / SC") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / ASC") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / CBA") - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / SKC") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / SKE") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_NAME("A / JP") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_NAME("B / JSR") - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_NAME("C / LBI") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_NAME("D / SMB") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_NAME("E / RMB") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_NAME("F / SKMB") - - PORT_START("IN.4") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_NAME("Prog") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("SS / AISC") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("Run / STII") - - PORT_START("IN.5") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_NAME("Exec / LD") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_NAME("Reset / X") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_NAME("Modify / XIS") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_NAME("Disp / XDS") -INPUT_PORTS_END - -// roms - -ROM_START( copspa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cop444l-jxy_n", 0x0000, 0x0800, CRC(8e5da5d2) SHA1(d557a5ede206fa0dff7b549acef9e0ef48e48c8a) ) -ROM_END - - - - - -/*************************************************************************** - - SCAT specialist calculators - * COP404LSN-5 MCU (no internal ROM) - * 2KB EPROM (ETC2716Q) - * 8-digit 7seg led display - - SCAT = aka South Carolina(SC) Applied Technology, Inc. - - Known products, assumed to be all on the same hardware: - - The Dimension (aka Feet & Inch Calculator) - - The Solution - - Metalmate - - CKI was measured ~1.469MHz, but D0 was measured ~77.44Hz so that means real - clock speed is a bit higher than CKI measurement, and the clock divider is 32. - -***************************************************************************/ - -class scat_state : public hh_cop400_state -{ -public: - scat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void scat(machine_config &config); - -private: - void main_map(address_map &map); - - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); -}; - -// handlers - -void scat_state::update_display() -{ - m_display->matrix(~(m_d | m_g << 4), bitswap<8>(m_l,0,1,2,3,4,5,6,7)); -} - -void scat_state::write_d(u8 data) -{ - // D: select digit, input mux (low) - m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); - m_d = data & 0xf; - update_display(); -} - -void scat_state::write_g(u8 data) -{ - // G: select digit, input mux (high) - m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); - m_g = data & 0xf; - update_display(); -} - -void scat_state::write_l(u8 data) -{ - // L: digit segment data - m_l = data; - update_display(); -} - -u8 scat_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(6, 0xf); -} - -void scat_state::main_map(address_map &map) -{ - map(0x0000, 0x07ff).rom(); -} - -// config - -static INPUT_PORTS_START( solution ) - PORT_START("IN.0") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / Enter") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / ppm") - - PORT_START("IN.1") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Atoms / Mole") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Atomic Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / %") - - PORT_START("IN.2") // D2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Density Wntd.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Orig. Density") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Eq. Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / Normal") - - PORT_START("IN.3") // D3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Conc. Wntd.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Orig. Conc.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Fmla. Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / Molar") - - PORT_START("IN.4") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Milli.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Micro.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Gram") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Liter") - - PORT_START("IN.5") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Known Vol.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Known Wt.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Dil. Wntd.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") -INPUT_PORTS_END - -void scat_state::scat(machine_config &config) -{ - // basic machine hardware - COP404L(config, m_maincpu, 1500000); // R/C OSC via MM74C14N - m_maincpu->set_config(COP400_CKI_DIVISOR_32, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->set_addrmap(AS_PROGRAM, &scat_state::main_map); - m_maincpu->write_d().set(FUNC(scat_state::write_d)); - m_maincpu->write_g().set(FUNC(scat_state::write_g)); - m_maincpu->write_l().set(FUNC(scat_state::write_l)); - m_maincpu->read_in().set(FUNC(scat_state::read_in)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_scat); - - // no sound! -} - -// roms - -ROM_START( solution ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "etc2716q", 0x0000, 0x0800, CRC(cf990f88) SHA1(6d505fdc94028cbdf6445df9e9451156a9d5f372) ) // no custom label -ROM_END - - - - - -/*************************************************************************** - - Select Merchandise Video Challenger - * COP420 MCU label COP420-TDX/N - * 6-digit 7seg led display, 3 other leds, 4-bit sound - - This is a lightgun with scorekeeping. The "games" themselves were released - on VHS tapes. To determine scoring, the lightgun detects strobe lighting - from objects in the video. - - known releases: - - Japan: Video Challenger, published by Takara - - UK: Video Challenger, published by Bandai - - Canada: Video Challenger, published by Irwin - -***************************************************************************/ - -class vidchal_state : public hh_cop400_state -{ -public: - vidchal_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void vidchal(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - DECLARE_WRITE_LINE_MEMBER(write_sk); -}; - -// handlers - -void vidchal_state::update_display() -{ - m_display->matrix(m_d | m_sk << 6, m_l); -} - -void vidchal_state::write_d(u8 data) -{ - // D: CD4028BE to digit select - m_d = 1 << data & 0x3f; - update_display(); -} - -void vidchal_state::write_l(u8 data) -{ - // L: digit segment data - m_l = bitswap<8>(data,0,3,1,5,4,7,2,6); - update_display(); -} - -WRITE_LINE_MEMBER(vidchal_state::write_sk) -{ - // SK: hit led - m_sk = state; - update_display(); -} - -// config - -static INPUT_PORTS_START( vidchal ) - PORT_START("IN.0") // port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Light Sensor") -INPUT_PORTS_END - -void vidchal_state::vidchal(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 900000); // approximation - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(vidchal_state::write_d)); - m_maincpu->write_g().set("dac", FUNC(dac_byte_interface::data_w)); - m_maincpu->write_l().set(FUNC(vidchal_state::write_l)); - m_maincpu->read_in().set_ioport("IN.0"); - m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6+1, 8); - m_display->set_segmask(0x3f, 0xff); - config.set_default_layout(layout_vidchal); - - // sound hardware - SPEAKER(config, "mono").front_center(); - DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC -} - -// roms - -ROM_START( vidchal ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, einvaderc_state, empty_init, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, unkeinv, 0, 0, unkeinv, unkeinv, unkeinv_state, empty_init, "Gordon Barlow Design", "unknown electronic Space Invaders game (patent)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) - -CONS( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, mbaskb2, 0, 0, mbaskb2, mbaskb2, mbaskb2_state, empty_init, "Mattel Electronics", "Basketball 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, msoccer2, 0, 0, msoccer2, msoccer2, mbaskb2_state, empty_init, "Mattel Electronics", "Soccer 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, lafootb, 0, 0, lafootb, lafootb, lafootb_state, empty_init, "Mattel Electronics", "Look Alive! Football", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, mdallas, 0, 0, mdallas, mdallas, mdallas_state, empty_init, "Mattel Electronics", "Dalla$ (J.R. handheld)", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** -CONS( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight - The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, bship82, bship, 0, bship82, bship82, bship82_state, empty_init, "Milton Bradley", "Electronic Battleship (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1979, qkracer, 0, 0, qkracer, qkracer, qkracer_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "Cops Pocket Assistant", MACHINE_SUPPORTS_SAVE ) - -COMP( 1984, solution, 0, 0, scat, solution, scat_state, empty_init, "SCAT", "The Solution", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1987, vidchal, 0, 0, vidchal, vidchal, vidchal_state, empty_init, "Select Merchandise", "Video Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_cops1.cpp b/src/mame/handheld/hh_cops1.cpp deleted file mode 100644 index 62134295653..00000000000 --- a/src/mame/handheld/hh_cops1.cpp +++ /dev/null @@ -1,850 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -National Semiconductor COPS(MM57 MCU series) handhelds - -MCU die label for MM5799 games says MM4799, but they are in fact MM5799. - -ROM source notes when dumped from another publisher, but confident it's the same: -- cambrp: Radio Shack EC-4001 Programmable - -TODO: -- qkracerm link cable (already tested locally and it works, so driver notes - and MCU serial emulation are good enough) - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/cops1/mm5799.h" -#include "machine/ds8874.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "cambrp.lh" -#include "mbaskb.lh" -#include "mhockey.lh" -#include "mhockeya.lh" -#include "msoccer.lh" -#include "qkracerm.lh" -#include "qkspeller.lh" - -//#include "hh_cops1_test.lh" // common test-layout - use external artwork - - -class hh_cops1_state : public driver_device -{ -public: - hh_cops1_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<9> m_inputs; // max 9 - - u16 m_inp_mux = 0; - u16 m_grid = 0; - - // MCU output pin state - u8 m_s = 0; - u8 m_do = 0; - u8 m_f = 0; - int m_blk = false; - - u8 read_inputs(int columns); -}; - - -// machine start/reset - -void hh_cops1_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_s)); - save_item(NAME(m_do)); - save_item(NAME(m_f)); - save_item(NAME(m_blk)); -} - -void hh_cops1_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_cops1_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Mattel Basketball (model 2437) - * PCB label: MA 6017/18/19 - * MM5799 MCU die bonded directly to PCB (die label MM4799 C NCX) - * 4001 and 74154, also bonded to PCB - * 2-digit 7seg led display, 21 leds, 2-bit sound - - Mattel Soccer (model 2678) - * MCU die label MM4799 C NDC - * same hardware as Basketball - - Mattel Hockey (model 2946) - * MCU die label MM4799 C NFR - * same hardware as Basketball - - Judging from videos online, there are two versions of Basketball. One where - the display shows "12" at power-on(as on MAME), and one that shows "15". - - There's also an older version of Hockey, it has the same ROM as Soccer. - This version wasn't sold in the USA. It is commonly known as the Canadian - version, though it was also released in Europe and Japan. - -***************************************************************************/ - -class mbaskb_state : public hh_cops1_state -{ -public: - mbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag) - { } - - void mbaskb(machine_config &config); - void msoccer(machine_config &config); - void mhockey(machine_config &config); - void mhockeya(machine_config &config); - -private: - void update_display(); - void write_do(u8 data); - void write_blk(int state); - void write_s(u8 data); - void write_f(u8 data); - u8 read_f(); -}; - -// handlers - -void mbaskb_state::update_display() -{ - // DO4321: 74154 CBAD - u8 d = (m_do >> 1 & 7) | (m_do << 3 & 8); - u16 sel = m_blk ? (1 << d) : 0; - - // 74154 output 2,6: speaker out - u8 spk = bitswap<2>(sel, 6,2); - m_speaker->level_w(spk); - - // 74154 output 3-5,10-13: digit/led select - u8 dsp = bitswap<7>(sel, 11,4,12,5,13,3,10); - m_display->matrix((m_f << 5 & 0x80) | dsp, m_s); -} - -void mbaskb_state::write_do(u8 data) -{ - // DO: 74154 inputs - m_do = data; - update_display(); -} - -void mbaskb_state::write_blk(int state) -{ - // BLK: 74154 enable - m_blk = state; - update_display(); -} - -void mbaskb_state::write_s(u8 data) -{ - // Sa-Sg: digit segment/led data - m_s = data; - update_display(); -} - -void mbaskb_state::write_f(u8 data) -{ - // F3: led data - m_f = data; - update_display(); -} - -u8 mbaskb_state::read_f() -{ - // F1: difficulty switch - // F2: N/C or tied high - return m_inputs[2]->read() | (m_f & 2); -} - -// config - -static INPUT_PORTS_START( mbaskb ) - PORT_START("IN.0") // port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // INB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // both buttons - - PORT_START("IN.2") // F1 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( mhockeya ) - PORT_INCLUDE( mbaskb ) - - PORT_MODIFY("IN.2") // F2 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_CUSTOM ) // tied high to select Hockey -INPUT_PORTS_END - -void mbaskb_state::mbaskb(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 370000); // approximation - m_maincpu->write_do().set(FUNC(mbaskb_state::write_do)); - m_maincpu->write_blk().set(FUNC(mbaskb_state::write_blk)); - m_maincpu->write_s().set(FUNC(mbaskb_state::write_s)); - m_maincpu->write_f().set(FUNC(mbaskb_state::write_f)); - m_maincpu->read_f().set(FUNC(mbaskb_state::read_f)); - m_maincpu->read_k().set_ioport("IN.0"); - m_maincpu->read_inb().set_ioport("IN.1"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(3, 0x7f); - m_display->set_bri_levels(0.015, 0.2); // ball led is brighter - config.set_default_layout(layout_mbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void mbaskb_state::msoccer(machine_config &config) -{ - mbaskb(config); - config.set_default_layout(layout_msoccer); - - m_display->set_bri_levels(0.005, 0.05, 0.2); // goalie is darker -} - -void mbaskb_state::mhockey(machine_config &config) -{ - mbaskb(config); - config.set_default_layout(layout_mhockey); -} - -void mbaskb_state::mhockeya(machine_config &config) -{ - msoccer(config); - config.set_default_layout(layout_mhockeya); -} - -// roms - -ROM_START( mbaskb ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ncx", 0x0000, 0x0200, CRC(d0e5fce1) SHA1(04708c043a763bf92d765095e9551388a1d967e8) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( msoccer ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( mhockeya ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( mhockey ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_nfr", 0x0000, 0x0200, CRC(979e5c5b) SHA1(e6c81572f47d93f4c13472f477aac67e05841976) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Racer (MM5799 version) - * MM5799 MCU die bonded directly to PCB (die label MM4799 C DUZ) - * DS8874 LED driver, die bonded to PCB as well - * 8-digit 7seg led display(1 custom digit), 1 green led, no sound - * optional link cable to compete with another player (see patent US4051605) - - This is the first version of QuizKid Racer, the 2nd release is on a - COP420 MCU, see hh_cop400.cpp. - -***************************************************************************/ - -class qkracerm_state : public hh_cops1_state -{ -public: - qkracerm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void qkracerm(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - u8 read_f(); - u8 read_k(); - int read_si(); -}; - -// handlers - -void qkracerm_state::update_display() -{ - m_display->matrix(m_grid, m_s); -} - -void qkracerm_state::ds8874_output_w(u16 data) -{ - // DS8874 outputs: digit select, input mux - m_grid = ~data; - m_inp_mux = m_grid >> 3; - update_display(); -} - -void qkracerm_state::write_do(u8 data) -{ - // DO1: DS8874 CP - // DO4: DS8874 _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 3)); -} - -void qkracerm_state::write_s(u8 data) -{ - // Sa-Sg: digit segment data - // Sp: link data out - m_s = data; - update_display(); -} - -u8 qkracerm_state::read_f() -{ - // F1: N/C - // F2: link cable detected - // F3: link data in - return m_maincpu->f_output_r() & 1; -} - -u8 qkracerm_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -int qkracerm_state::read_si() -{ - // SI: link master(1)/slave(0) - return 0; -} - -// config - -static INPUT_PORTS_START( qkracerm ) - PORT_START("IN.0") // DS8874 OUT 4 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") - - PORT_START("IN.1") // DS8874 OUT 5 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.2") // DS8874 OUT 6 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // DS8874 OUT 7 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // DS8874 OUT 8 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void qkracerm_state::qkracerm(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 220000); // approximation - m_maincpu->set_option_ram_d12(true); - m_maincpu->set_option_lb_10(5); - m_maincpu->write_do().set(FUNC(qkracerm_state::write_do)); - m_maincpu->write_s().set(FUNC(qkracerm_state::write_s)); - m_maincpu->read_f().set(FUNC(qkracerm_state::read_f)); - m_maincpu->read_k().set(FUNC(qkracerm_state::read_k)); - m_maincpu->read_si().set(FUNC(qkracerm_state::read_si)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(qkracerm_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0xdf, 0x7f); - m_display->set_segmask(0x20, 0x41); // equals sign - config.set_default_layout(layout_qkracerm); - - // no sound! -} - -// roms - -ROM_START( qkracerm ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_duz", 0x0000, 0x0200, CRC(8b484d2a) SHA1(809e902a11e23bed010ac795ab8dc50e5c1869dc) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_qkracerm_output.pla", 0, 254, CRC(f095fc51) SHA1(e3321d5cc4ecef363df7ef94f47e860c7a6d8c7e) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Speller - * MM5799 MCU die bonded directly to PCB (die label MM4799 C NDF) - * 2-digit 7seg led display, green led, red led, no sound - - The manual included 99 pictures for matching the words, with increased - difficulty. For example 10 = owl, 90 = kangaroo. - - Modes: - - Spell: match numbered picture with word - - Learn: same as Spell, but only the 1st letter - - Game: player 1 enters word, player 2 needs to guess it - -***************************************************************************/ - -class qkspeller_state : public hh_cops1_state -{ -public: - qkspeller_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag) - { } - - void qkspeller(machine_config &config); - -private: - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - void write_f(u8 data); - u8 read_f(); - u8 read_k(); -}; - -// handlers - -void qkspeller_state::update_display() -{ - m_display->matrix((m_f << 1 & 0xc) | (m_do & 3), m_inp_mux); -} - -void qkspeller_state::write_do(u8 data) -{ - // DO1,DO2: digit select - m_do = data; - update_display(); -} - -void qkspeller_state::write_s(u8 data) -{ - // S: digit segment data, input mux - m_inp_mux = data; - update_display(); -} - -void qkspeller_state::write_f(u8 data) -{ - // F2,F3: led data - m_f = data; - update_display(); -} - -u8 qkspeller_state::read_f() -{ - // F1: 3-pos switch (GND, floating, Vcc) - if (m_inputs[8]->read() == 2) - return m_f; - else - return (m_inputs[8]->read() & 1) | (m_f & ~1); -} - -u8 qkspeller_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -static INPUT_PORTS_START( qkspeller ) - PORT_START("IN.0") // Sa port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - - PORT_START("IN.1") // Sb port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - - PORT_START("IN.2") // Sc port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - - PORT_START("IN.3") // Sd port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - - PORT_START("IN.4") // Se port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_NAME("Erase") - - PORT_START("IN.5") // Sf port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // Sg port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.7") // Sp port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Start") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Next") - - PORT_START("IN.8") // F1 - PORT_CONFNAME( 0x03, 0x00, "Mode" ) - PORT_CONFSETTING( 0x00, "Spell" ) - PORT_CONFSETTING( 0x02, "Learn" ) - PORT_CONFSETTING( 0x01, "Game" ) - - PORT_START("TEST.0") // INB test pad - PORT_CONFNAME( 0x01, 0x00, "Factory Test 1" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("TEST.1") // DO3 test pad - PORT_CONFNAME( 0x01, 0x00, "Factory Test 2" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) -INPUT_PORTS_END - -void qkspeller_state::qkspeller(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 220000); // approximation - m_maincpu->write_do().set(FUNC(qkspeller_state::write_do)); - m_maincpu->write_s().set(FUNC(qkspeller_state::write_s)); - m_maincpu->write_f().set(FUNC(qkspeller_state::write_f)); - m_maincpu->read_f().set(FUNC(qkspeller_state::read_f)); - m_maincpu->read_k().set(FUNC(qkspeller_state::read_k)); - m_maincpu->read_inb().set_ioport("TEST.0"); - m_maincpu->read_do3().set_ioport("TEST.1"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_qkspeller); - - // no sound! -} - -// roms - -ROM_START( qkspeller ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndf", 0x0000, 0x0200, CRC(0f497a12) SHA1(78eb79dcc414ed2a955450ffb3be431ecc2edb0c) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - - - - - -/*************************************************************************** - - Sinclair Radionics Cambridge Programmable - * MM5799 MCU (label MM5799NBP/N, die label MM4799 C NBP) - * DS8874 LED driver, 9-digit 7seg led display - - It's a programmable pocket calculator, up to 36 steps. 2 MCU revisions - are known: MM5799EHY and MM5799NBP. - - 4 program libraries were available: - - Vol. 1: General / Finance / Statistics - - Vol. 2: Mathematics - - Vol. 3: Physics & Engineering - - Vol. 4: Electronics - - Paste example: CCSS200SR 2-32+.12131*.5=.5.201=50.200 CSS200C - Now enter a value under 70, followed by RUN, to calculate its factorial. - - known releases: - - World: Cambridge Programmable, published by Sinclair Radionics - - USA: EC-4001 Programmable, published by Tandy Corporation, Radio Shack brand - -***************************************************************************/ - -class cambrp_state : public hh_cops1_state -{ -public: - cambrp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void cambrp(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - u8 read_f(); - u8 read_k(); -}; - -// handlers - -void cambrp_state::update_display() -{ - m_display->matrix(m_grid, m_s); -} - -void cambrp_state::ds8874_output_w(u16 data) -{ - // DS8874 outputs: digit select, input mux - m_grid = ~data; - m_inp_mux = m_grid >> 2; - update_display(); -} - -void cambrp_state::write_do(u8 data) -{ - // DO1: DS8874 CP - // DO4: DS8874 _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 3)); -} - -void cambrp_state::write_s(u8 data) -{ - // S: digit segment data - // (DS8874 low battery out also connects to Sp) - m_s = data; - update_display(); -} - -u8 cambrp_state::read_f() -{ - // F2: K3, other: N/C - return (~read_inputs(6) >> 1 & 2) | (m_maincpu->f_output_r() & ~2); -} - -u8 cambrp_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( cambrp ) - PORT_START("IN.0") // DS8874 OUT 3 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / stop / +/-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / () / R>D") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('=') PORT_NAME("= / -") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("Up/Downshift") - - PORT_START("IN.1") // DS8874 OUT 4 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / " UTF8_SQUAREROOT "x / go if neg") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / sin / arcsin") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') PORT_NAME("- / -x / F") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR('C') PORT_NAME("C/CE / step") - - PORT_START("IN.2") // DS8874 OUT 5 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / sto / go to") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / cos / arccos") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') PORT_NAME(u8"÷ / 1/x / G") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("RUN / learn") - - PORT_START("IN.3") // DS8874 OUT 6 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / ChN/# / D>R") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / tan / arctan") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') PORT_NAME("+ / 2x / E") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // DS8874 OUT 7 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / ln x / e" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_NAME("./EE/_ / Downshift / A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') PORT_NAME("× / x" UTF8_POW_2 " / .") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // DS8874 OUT 8 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / rcl / MEx") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cambrp_state::cambrp(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 200000); // approximation - m_maincpu->set_option_ram_d12(true); - m_maincpu->set_option_lb_10(4); - m_maincpu->write_do().set(FUNC(cambrp_state::write_do)); - m_maincpu->write_s().set(FUNC(cambrp_state::write_s)); - m_maincpu->read_f().set(FUNC(cambrp_state::read_f)); - m_maincpu->read_k().set(FUNC(cambrp_state::read_k)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(cambrp_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_cambrp); - - // no sound! -} - -// roms - -ROM_START( cambrp ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm5799nbp_n", 0x0000, 0x0200, CRC(f4e9063b) SHA1(04b7bf24e994cd453584d233405621f8110feded) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_cambrp_output.pla", 0, 254, CRC(eb882256) SHA1(acd77c066a7b7d18c3ea10f137a45ab83d1c53e1) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1978, mbaskb, 0, 0, mbaskb, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Basketball (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, msoccer, 0, 0, msoccer, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Soccer (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mhockey, 0, 0, mhockey, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, US version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mhockeya, mhockey, 0, mhockeya, mhockeya, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, export version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1977, qkracerm, qkracer, 0, qkracerm, qkracerm, qkracerm_state, empty_init, "National Semiconductor", "QuizKid Racer (MM5799 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NODEVICE_LAN ) -CONS( 1978, qkspeller, 0, 0, qkspeller, qkspeller, qkspeller_state, empty_init, "National Semiconductor", "QuizKid Speller", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** - -COMP( 1977, cambrp, 0, 0, cambrp, cambrp, cambrp_state, empty_init, "Sinclair Radionics", "Cambridge Programmable", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_hmcs40.cpp b/src/mame/handheld/hh_hmcs40.cpp deleted file mode 100644 index 347d603f2fb..00000000000 --- a/src/mame/handheld/hh_hmcs40.cpp +++ /dev/null @@ -1,5345 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/*************************************************************************** - -Hitachi HMCS40 MCU tabletops/handhelds or other simple devices, -most of them are VFD electronic games/toys. - -known chips: - - serial device etc. ----------------------------------------------------------------- - @A07 HD38750 1979, Bambino Knock-Em Out Boxing (ET-06B) - @A08 HD38750 1979, Bambino Dribble Away Basketball (ET-05) - @A45 HD38750 1981, VTech Invaders - *A56 HD38750 1981, Actronics(Hanzawa) Twinvader (small brown version) - *A58 HD38750 1981, Actronics(Hanzawa) Challenge Racer/Ludotronic(Hanzawa) Grand Prix Turbo - *A62 HD38750 1982, Actronics(Hanzawa) Pack'n Maze - @A67 HD38750 1982, Romtec Pucki & Monsters (ET-803) - - @A04 HD38800 1980, Gakken Heiankyo Alien - A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp - *A20 HD38800 1981, Entex Super Space Invader 2 - @A25 HD38800 1981, Coleco Alien Attack - @A27 HD38800 1981, Bandai Packri Monster - @A31 HD38800 1981, Entex Select-A-Game cartridge: Space Invader 2 -> sag.cpp - also used in 2nd version of Super Space Invader 2! - A36 HD38800 1981, Entex Select-A-Game cartridge: Pac-Man 2 -> " - A37 HD38800 1981, Entex Select-A-Game cartridge: Baseball 4 -> " - A38 HD38800 1981, Entex Select-A-Game cartridge: Pinball -> " - *A41 HD38800 1982, Gakken Puck Monster - *A42 HD38800 1981, Akai GX-77 - *A51 HD38800 1981, Actronics(Hanzawa) Twinvader (larger white version) - @A70 HD38800 1982, Coleco Galaxian - @A73 HD38800 1982, Mattel Star Hawk (PT-317B) - @A77 HD38800 1982, Bandai Frisky Tom (PT-327A) - @A88 HD38800 1982, Tomy Tron (THN-02) - @B01 HD38800 1982, Gakken Crazy Kong - @B19 HD38800 1982, Bandai Zaxxon - @B23 HD38800 1982, Tomy Kingman (THF-01II) - @B24 HD38800 1982, Actronics(Hanzawa) Wanted G-Man - @B29 HD38800 1984, Tomy Bombman - *B31 HD38800 1983, Romtec Frog Prince (ET-806) - *B35 HD38800 1983, Bandai Gundam vs Gelgoog Zaku - @B42 HD38800 1983, Bandai Kiteyo Parman - @B43 HD38800 1983, Bandai Dokodemo Dorayaki Doraemon (PT-412) - @B48 HD38800 1983, Bandai Toukon Juohmaru - @B52 HD38800 1983, Bandai Ultraman Monster Battle (PT-424) - - @A09 HD38820 1980, Mattel World Championship Baseball - @A13 HD38820 1981, Entex Galaxian 2 - @A23 HD38820 1981, Entex Pac Man 2 - @A28 HD38820 1981, Coleco Pac-Man (ver 1) - @A29 HD38820 1981, Coleco Pac-Man (ver 2) - @A32 HD38820 1982, Gakken Super Cobra - *A38 HD38820 1982, Entex Crazy Climber - @A42 HD38820 1982, Entex Stargate - @A43 HD38820 1982, Entex Turtles - @A45 HD38820 1982, Coleco Donkey Kong - @A49 HD38820 1983, Bandai Zackman - @L53 HD38820 1983, Gakken Defender - @A61 HD38820 1983, Coleco Ms. Pac-Man - *A62 HD38820 1983, Coleco Zaxxon - @A63 HD38820 1983, Bandai Pengo - @A65 HD38820 1983, Bandai Burger Time (PT-389) - @A69 HD38820 1983, Gakken Dig Dug - @A70 HD38820 1983, Parker Brothers Q*Bert - @A75 HD38820 1983, Bandai Go Go Dynaman - @A85 HD38820 1984, Bandai Machine Man (PT-438) - @A88 HD38820 1984, Bandai Pair Match (PT-460) (1/2) - @A89 HD38820 1984, Bandai Pair Match (PT-460) (2/2) - - A34 HD44801 1981, SciSys Mini Chess -> saitek_minichess.cpp - A50 HD44801 1981, CXG Sensor Computachess -> cxg_scptchess.cpp - A75 HD44801 1982, Alpha 8201 protection MCU -> machine/alpha8201.* - *A85 HD44801 1982, SciSys Travel Sensor / Travel Mate / Chesspartner 5000/6000 - *A92 HD44801 1982, SciSys Play Bridge Computer - B35 HD44801 1983, Alpha 8302 protection MCU (see 8201) - B42 HD44801 1983, Alpha 8303 protection MCU (see 8201) - *B43 HD44801 1983, Alpha 8304 protection MCU (see 8201) - C57 HD44801 1985, Alpha 8505 protection MCU (see 8201) - C89 HD44801 1985, CXG Portachess (1985 version) -> cxg_scptchess.cpp - - *A86 HD44820 1983, Chess King Pocket Micro - *B63 HD44820 1985, CXG Pocket Chess (12 buttons) - - *A13 HD44840 1982, CXG Computachess II - *A14 HD44840 1982, CXG Computachess II / Advanced Portachess - - *B55 HD44860 1987, Saitek Pro Bridge 100 - - *A04 HD44868 1984, SciSys Rapier - *A07 HD44868 1984, Chess King Pocket Micro Deluxe - *A12 HD44868 1985, SciSys MK 10 / Pocket Chess - *A14 HD44868 1985, SciSys Kasparov Plus - - (* means undumped unless noted, @ denotes it's in this driver) - -============================================================================ - -ROM source notes when dumped from another model, but confident it's the same: -- gckong: CGL Super Kong -- ggdman: Bandai Kampf der Monster -- ghalien: CGL Earth Invaders -- kingman: Tandy Kingman -- wantgman: Ludotronic Operation 'Z' -- zackman: Tandy Zackman - -TODO: -- cgalaxn discrete sound (alien attacking sound effect) -- gckong glitchy jump on 1st level (rarely happens), caused by MCU stack overflow. - It can be tested by jumping up repeatedly at the start position under the ladder, - if the glitch happens there, you can jump onto the 2nd floor. -- epacman2 booting the game in demo mode, pacman should take the shortest route to - the upper-left power pill: mcu cycle/interrupt timing related -- kevtris's HMCS40 ROM dumps are incomplete, missing MCU factory test code from - the 2nd half of the ROM, none of the games access it though and it's impossible - to execute unless the chip is in testmode. -- Though very uncommon when compared to games with LED/lamp display, some - games may manipulate VFD plate brightness by strobing it longer/shorter, - eg. cgalaxn when a ship explodes. -- bzaxxon 3D effect is difficult to simulate -- improve/redo SVG for: bzaxxon, bbtime -- add SVG for: ggdman, ktparman, tkjmaru, gdefender, bombman, wantgman, puckimon -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/hmcs40/hmcs40.h" -#include "cpu/cop400/cop400.h" -#include "video/pwm.h" -#include "machine/gen_latch.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork (complete) -#include "pairmtch.lh" - -// internal artwork (bezel overlay) -#include "bambball.lh" -#include "gckong.lh" -#include "mwcbaseb.lh" -#include "msthawk.lh" -#include "packmon.lh" - -#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_hmcs40_state : public driver_device -{ -public: - hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<7> m_inputs; // max 7 - - // misc common - u8 m_r[8] = { }; // MCU R ports write data (optional) - u16 m_d = 0; // MCU D port write data (optional) - u8 m_int[2] = { }; // MCU INT0/1 pins state - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u64 m_plate = 0; // VFD current column data - - u16 read_inputs(int columns); - void refresh_interrupts(void); - void set_interrupt(int line, int state); -}; - - -// machine start/reset - -void hh_hmcs40_state::machine_start() -{ - // register for savestates - save_item(NAME(m_r)); - save_item(NAME(m_int)); - save_item(NAME(m_d)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_hmcs40_state::machine_reset() -{ - refresh_interrupts(); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_hmcs40_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - -// interrupt handling - -void hh_hmcs40_state::refresh_interrupts() -{ - for (int i = 0; i < 2; i++) - m_maincpu->set_input_line(i, m_int[i] ? ASSERT_LINE : CLEAR_LINE); -} - -void hh_hmcs40_state::set_interrupt(int line, int state) -{ - line = line ? 1 : 0; - state = state ? 1 : 0; - - if (state != m_int[line]) - { - if (machine().phase() >= machine_phase::RESET) - m_maincpu->set_input_line(line, state ? ASSERT_LINE : CLEAR_LINE); - m_int[line] = state; - } -} - -INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line) -{ - set_interrupt((int)param, newval); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Actronics / Hanzawa Wanted G-Man - * Hitachi HD38800B24 MCU - * cyan/red VFD display - - known releases: - - World: Wanted G-Man, published by Actronics - - France: Operation 'Z', published by Ludotronic - -***************************************************************************/ - -class wantgman_state : public hh_hmcs40_state -{ -public: - wantgman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void wantgman(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void wantgman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void wantgman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void wantgman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D6: input mux - m_inp_mux = data >> 1 & 0x3f; - - // D1-D9,D13,D14: vfd grid - m_grid = (data >> 1 & 0x1ff) | (data >> 4 & 0x600); - update_display(); -} - -u16 wantgman_state::input_r() -{ - // D15: multiplexed inputs - return read_inputs(6) & 0x8000; -} - -// config - -static INPUT_PORTS_START( wantgman ) - PORT_START("IN.0") // D1 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D2 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // D3 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.3") // D4 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.4") // D5 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Skill / Start / Jump") - - PORT_START("IN.5") // D6 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Demo") -INPUT_PORTS_END - -void wantgman_state::wantgman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_d().set(FUNC(wantgman_state::grid_w)); - m_maincpu->read_d().set(FUNC(wantgman_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 16); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( wantgman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b24", 0x0000, 0x1000, CRC(ad1dfb26) SHA1(f2ef0ec98116a8a38e97299e3e3b2b0129d78c04) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "wantgman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Dribble Away Basketball (manufactured in Japan) - * PCB label Emix Corp. ET-05 - * Hitachi HD38750A08 MCU - * cyan VFD display Emix-106, with bezel overlay - -***************************************************************************/ - -class bambball_state : public hh_hmcs40_state -{ -public: - bambball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bambball(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void bambball_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x(,D0-D3): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); - m_display->matrix(m_grid, plate); -} - -void bambball_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D10: input mux - m_inp_mux = data >> 7 & 0xf; - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D3: more plates (update display there) - plate_w(3 + 1, data & 0xf); -} - -u8 bambball_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( bambball ) - PORT_START("IN.0") // D7 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dribble Low") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Dribble Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Dribble High") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Shoot") - - PORT_START("IN.1") // D8 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // D9 port R0x - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Display") - - PORT_START("IN.3") // D10 port R0x - PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void bambball_state::bambball(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(bambball_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_d().set(FUNC(bambball_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 478); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - config.set_default_layout(layout_bambball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bambball ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 281988, "screen", 0) - ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Knock-Em Out Boxing - * PCB label Emix Corp. ET-06B - * Hitachi HD38750A07 MCU - * cyan VFD display Emix-103, with blue or green color overlay - -***************************************************************************/ - -class bmboxing_state : public hh_hmcs40_state -{ -public: - bmboxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bmboxing(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void bmboxing_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u32 plate = bitswap<16>(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8); - m_display->matrix(grid, plate); -} - -void bmboxing_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x: vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmboxing_state::grid_w(u16 data) -{ - // D13: speaker out - m_speaker->level_w(data >> 13 & 1); - - // D9-D12: input mux - m_inp_mux = data >> 9 & 0xf; - - // D4-D12: vfd grid - m_grid = data >> 4 & 0x1ff; - update_display(); -} - -u8 bmboxing_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - * left = P2 side * * right = P1 side * - - [ BACK ] [ HIGH ] (players sw) [ HIGH ] [ BACK ] - 1<--->2 [START/ - [NORMAL] [MEDIUM] RESET] [MEDIUM] [NORMAL] - 1<---OFF--->2 - [ DUCK ] [ LOW ] (skill lvl sw) [ LOW ] [ DUCK ] -*/ - -static INPUT_PORTS_START( bmboxing ) - PORT_START("IN.0") // D9 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Punch High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Punch Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P1 Punch Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D10 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Position Normal") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Position Back") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P1 Position Ducking") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // D11 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Punch High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Punch Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P2 Punch Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D12 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Position Normal") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Position Back") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P2 Position Ducking") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // port D - PORT_CONFNAME( 0x0001, 0x0000, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0001, "2" ) - PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0002, "2" ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bmboxing_state::bmboxing(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(bmboxing_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_d().set(FUNC(bmboxing_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.4"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 529); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmboxing ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 257144, "screen", 0) - ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Frisky Tom (manufactured in Japan) - * PCB label Kaken Corp., PT-327A - * Hitachi HD38800A77 MCU - * cyan/red/green VFD display Futaba DM-43ZK 2E - -***************************************************************************/ - -class bfriskyt_state : public hh_hmcs40_state -{ -public: - bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bfriskyt(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bfriskyt_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21); - m_display->matrix(grid, plate); -} - -void bfriskyt_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bfriskyt_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D5: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x3f0000); - update_display(); -} - -void bfriskyt_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bfriskyt ) - PORT_START("IN.0") // D11 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.5") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void bfriskyt_state::bfriskyt(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_d().set(FUNC(bfriskyt_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 675); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 22); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bfriskyt ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 413577, "screen", 0) - ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Packri Monster (manufactured in Japan) - * PCB label DM-21ZA2 - * Hitachi HD38800A27 MCU - * cyan/red/green VFD display Futaba DM-21ZK 2B, with bezel overlay - - known releases: - - Japan: FL Packri Monster, published by Bandai - - USA(World?): Packri Monster, published by Bandai - - USA/Canada: Hungry Monster, published by Tandy - - other: Gobble Man/Ogre Monster, published by Tandy - -***************************************************************************/ - -class packmon_state : public hh_hmcs40_state -{ -public: - packmon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void packmon(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void packmon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update 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,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7); - m_display->matrix(grid, plate); -} - -void packmon_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D11-D15: input mux - m_inp_mux = data >> 11 & 0x1f; - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3: plate 9-12 (update display there) - plate_w(4, data & 0xf); -} - -u16 packmon_state::input_r() -{ - // D5: multiplexed inputs - return read_inputs(5) & 0x20; -} - -// config - -static INPUT_PORTS_START( packmon ) - PORT_START("IN.0") // D11 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START ) - - PORT_START("IN.1") // D12 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D13 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // D14 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.4") // D15 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) -INPUT_PORTS_END - -void packmon_state::packmon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_d().set(FUNC(packmon_state::grid_w)); - m_maincpu->read_d().set(FUNC(packmon_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 680); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - config.set_default_layout(layout_packmon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( packmon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 224386, "screen", 0) - ROM_LOAD( "packmon.svg", 0, 224386, CRC(b2ee5b6b) SHA1(e53b4d5a4118cc5fbec4656580c2aab76af8f8d7) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Zaxxon (manufactured in Japan, licensed from Sega) - * PCB label FL Zaxxon - * Hitachi HD38800B19 MCU - * cyan/red/blue VFD display NEC FIP11BM24T no. 4-8, half of it reflected - with a one-way mirror to give the illusion of a 3D display - -***************************************************************************/ - -class bzaxxon_state : public hh_hmcs40_state -{ -public: - bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bzaxxon(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bzaxxon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); - u32 plate = bitswap<24>(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; - m_display->matrix(grid, plate); -} - -void bzaxxon_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D10: input mux - u8 inp_mux = data >> 7 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0-D2: plate 7-9 (update display there) - plate_w(4, data & 7); -} - -void bzaxxon_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( bzaxxon ) - PORT_START("IN.0") // D7 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.1") // D8 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.2") // D9 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.3") // D10 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.5") // port D - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bzaxxon_state::bzaxxon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 450000); // approximation - m_maincpu->write_r<0>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_d().set(FUNC(bzaxxon_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(613, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bzaxxon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 521080, "screen", 0) - ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Zackman "The Pit, FL Exploration of Space" (manufactured in Japan) - * Hitachi QFP HD38820A49 MCU - * cyan/red/yellow VFD display Futaba DM-53Z 3E, with color overlay - - known releases: - - World: Zackman, published by Bandai - - USA: Zackman, published by Tandy - -***************************************************************************/ - -class zackman_state : public hh_hmcs40_state -{ -public: - zackman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void zackman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void zackman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D0,D1): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<32>(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12); - m_display->matrix(grid, plate); -} - -void zackman_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D11-D14: input mux - u8 inp_mux = data >> 11 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0,D1: plate 12,13 (update display there) - plate_w(7, data & 3); -} - -void zackman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( zackman ) - PORT_START("IN.0") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void zackman_state::zackman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_d().set(FUNC(zackman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(487, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( zackman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 910689, "screen", 0) - ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Pengo (manufactured in Japan, licensed from Sega) - * PCB label FL Pengo(in katakana) - * Hitachi QFP HD38820A63 MCU - * cyan/red/blue VFD display Futaba DM-68ZK 3D DM-63 - -***************************************************************************/ - -class bpengo_state : public hh_hmcs40_state -{ -public: - bpengo_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bpengo(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bpengo_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<32>(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bpengo_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bpengo_state::grid_w(u16 data) -{ - // D10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D0-D7: vfd grid - m_grid = data & 0xff; - update_display(); -} - -void bpengo_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( bpengo ) - PORT_START("IN.0") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) - - PORT_START("IN.5") // port D - PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0800, DEF_STR( On ) ) - PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bpengo_state::bpengo(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_d().set(FUNC(bpengo_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 759); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 25); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bpengo ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 565069, "screen", 0) - ROM_LOAD( "bpengo.svg", 0, 565069, CRC(fb25ffeb) SHA1(fb4db5120f1e35e39c7fb2da4af3aa63417efaf1) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Burger Time (manufactured in Japan, licensed from Data East) - * PCB label Kaken Corp. PT-389 Burger Time - * Hitachi QFP HD38820A65 MCU - * cyan/red/green VFD display NEC FIP6AM25T no. 21-21 - -***************************************************************************/ - -class bbtime_state : public hh_hmcs40_state -{ -public: - bbtime_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bbtime(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bbtime_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); - u32 plate = bitswap<32>(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; - m_display->matrix(grid, plate); -} - -void bbtime_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bbtime_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(data >> 3 & 1); - - // D10-D14: input mux - u8 inp_mux = data >> 10 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D4-D9: vfd grid - m_grid = data >> 4 & 0x3f; - update_display(); -} - -void bbtime_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bbtime ) - PORT_START("IN.0") // D10 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.1") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.2") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.5") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void bbtime_state::bbtime(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_d().set(FUNC(bbtime_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(379, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6, 28); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bbtime ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 461605, "screen", 0) - ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Kiteyo Parman - * Hitachi HD38800B42 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class ktparman_state : public hh_hmcs40_state -{ -public: - ktparman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ktparman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void ktparman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void ktparman_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(data >> 3 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D2: vfd plate (update display there) - plate_w(4, data & 7); -} - -// config - -static INPUT_PORTS_START( ktparman ) - PORT_START("IN.0") // port D - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void ktparman_state::ktparman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_d().set(FUNC(ktparman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 19); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ktparman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b42", 0x0000, 0x1000, CRC(ba1f7939) SHA1(1038d33923fcc87b5dd95954d5f964064a10ff9d) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "ktparman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Dokodemo Dorayaki Doraemon (FL LSI Game Push Up) (manufactured in Japan) - * PCB label Kaken Corp PT-412 FL-Doreamon(in katakana) - * Hitachi HD38800B43 MCU - * cyan/red/blue VFD display Futaba DM-71 - -***************************************************************************/ - -class bdoramon_state : public hh_hmcs40_state -{ -public: - bdoramon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bdoramon(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bdoramon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); - u32 plate = bitswap<24>(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bdoramon_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D3: plate 15-18 (update display there) - plate_w(4, data & 0xf); -} - -// config - -static INPUT_PORTS_START( bdoramon ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) - - PORT_START("IN.2") // port D - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // port R2x - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void bdoramon_state::bdoramon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->read_r<2>().set_ioport("IN.3"); - m_maincpu->write_r<3>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_d().set(FUNC(bdoramon_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.2"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 668); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bdoramon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 624751, "screen", 0) - ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Toukon Juohmaru - * Hitachi HD38800B48 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class tkjmaru_state : public hh_hmcs40_state -{ -public: - tkjmaru_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void tkjmaru(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void tkjmaru_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void tkjmaru_state::grid_w(u16 data) -{ - // D4-D7: input mux - m_inp_mux = data >> 4 & 0xf; - - // D10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // D11-D15: vfd grid - m_grid = data >> 11 & 0x1f; - - // D0: vfd plate (update display there) - plate_w(4, data & 1); -} - -u16 tkjmaru_state::input_r() -{ - // D3: multiplexed inputs, D8,D9: fixed inputs - return read_inputs(4) | m_inputs[4]->read(); -} - -// config - -static INPUT_PORTS_START( tkjmaru ) - PORT_START("IN.0") // D4 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D5 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // D6 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.3") // D7 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.4") // D8,D9 - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x200, 0x000, "Factory Test" ) - PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x200, DEF_STR( On ) ) -INPUT_PORTS_END - -void tkjmaru_state::tkjmaru(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_d().set(FUNC(tkjmaru_state::grid_w)); - m_maincpu->read_d().set(FUNC(tkjmaru_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 17); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tkjmaru ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b48", 0x0000, 0x1000, CRC(249f357d) SHA1(0b5dad187a035db622790eb092b7be1ca7c57d97) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "tkjmaru.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Ultraman Monster Battle (FL LSI Game Push Up) (manufactured in Japan) - * PCB label Kaken Corp. PT-424 FL Ultra Man - * Hitachi HD38800B52 MCU - * cyan/red/blue VFD display NEC FIP8BM25T no. 21-8 2 - -***************************************************************************/ - -class bultrman_state : public hh_hmcs40_state -{ -public: - bultrman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bultrman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bultrman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2); - m_display->matrix(grid, plate); -} - -void bultrman_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D2: plate 15-17 (update display there) - plate_w(4, data & 7); -} - -// config - -static INPUT_PORTS_START( bultrman ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_CONFNAME( 0x0010, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0010, DEF_STR( On ) ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bultrman_state::bultrman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 350000); // approximation - m_maincpu->write_r<0>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_d().set(FUNC(bultrman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 673); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bultrman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 405717, "screen", 0) - ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Go Go Dynaman - * Hitachi HD38820A75 MCU - * cyan/red/blue VFD display - - known releases: - - Japan: Go Go Dynaman, published by Bandai - - Germany: Kampf der Monster, published by Bandai - -***************************************************************************/ - -class ggdman_state : public hh_hmcs40_state -{ -public: - ggdman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ggdman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void ggdman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ggdman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R5x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ggdman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D6-D9: input mux - u8 inp_mux = data >> 6 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D11-D15: vfd grid - m_grid = data >> 11 & 0x1f; - update_display(); -} - -void ggdman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( ggdman ) - PORT_START("IN.0") // D6 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.1") // D7 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.2") // D8 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.3") // D9 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void ggdman_state::ggdman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_d().set(FUNC(ggdman_state::grid_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 24); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ggdman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a75", 0x0000, 0x1000, CRC(14a9c064) SHA1(253a5decbf4219c1b457280e301b82388694e49f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "ggdman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Machine Man (FL Flat Type) (manufactured in Japan) - * PCB label Kaken PT-438 - * Hitachi QFP HD38820A85 MCU - * cyan/red/green VFD display NEC FIP5CM33T no. 4 21 - -***************************************************************************/ - -class machiman_state : public hh_hmcs40_state -{ -public: - machiman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void machiman(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void machiman_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18); - m_display->matrix(m_grid, plate); -} - -void machiman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x,R6012: vfd plate - int shift = (offset == 6) ? 16 : offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void machiman_state::grid_w(u16 data) -{ - // D13: speaker out - m_speaker->level_w(data >> 13 & 1); - - // D0-D4: vfd grid - m_grid = data & 0x1f; - update_display(); -} - -// config - -static INPUT_PORTS_START( machiman ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_BIT( 0x3fff, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY -INPUT_PORTS_END - -void machiman_state::machiman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_d().set(FUNC(machiman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1534, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(5, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( machiman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 374097, "screen", 0) - ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Pair Match (manufactured in Japan) - * PCB label Kaken Corp. PT-460 - * Hitachi QFP HD38820A88 MCU(main), HD38820A89(audio) - * cyan/red VFD display - - This is a memory game, the difference is instead of pictures, the player - needs to match sound effects. It has an extra MCU for sound. The case is - shaped like a glossy black pyramid. Star Trek fans will recognize it as - a prop used in TNG Ten Forward. - -***************************************************************************/ - -class pairmtch_state : public hh_hmcs40_state -{ -public: - pairmtch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_audiocpu(*this, "audiocpu"), - m_soundlatch(*this, "soundlatch%u", 0) - { } - - void pairmtch(machine_config &config); - -private: - required_device m_audiocpu; - required_device_array m_soundlatch; - - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); - - void sound_w(u8 data); - void sound2_w(u8 data); - void speaker_w(u16 data); -}; - -// handlers: maincpu side - -void pairmtch_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void pairmtch_state::plate_w(offs_t offset, u8 data) -{ - // R2x,R3x,R6x: vfd plate - int shift = (offset == 6) ? 8 : (offset-2) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void pairmtch_state::grid_w(u16 data) -{ - // D7: sound reset (to audiocpu reset line) - m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); - - // D9: sound start (to audiocpu INT0) - m_audiocpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); - - // D10,D15: input mux - m_inp_mux = (data >> 10 & 1) | (data >> 14 & 2); - - // D0-D5: vfd grid - m_grid = data & 0x3f; - update_display(); -} - -u8 pairmtch_state::input_r() -{ - // R4x: multiplexed inputs - return read_inputs(2); -} - -void pairmtch_state::sound_w(u8 data) -{ - // R5x: soundlatch (to audiocpu R2x) - m_soundlatch[0]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); -} - -// handlers: audiocpu side - -void pairmtch_state::sound2_w(u8 data) -{ - // R2x: soundlatch (to maincpu R5x) - m_soundlatch[1]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); -} - -void pairmtch_state::speaker_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1: sound ack (to maincpu INT0) - m_maincpu->set_input_line(0, (data & 2) ? ASSERT_LINE : CLEAR_LINE); -} - -// config - -static INPUT_PORTS_START( pairmtch ) - PORT_START("IN.0") // D10 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.1") // D15 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // port D - PORT_CONFNAME( 0x0040, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0040, DEF_STR( On ) ) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_CONFNAME( 0x0800, 0x0800, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x0800, "1" ) - PORT_CONFSETTING( 0x0000, "2" ) - PORT_CONFNAME( 0x3000, 0x2000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x2000, "1" ) - PORT_CONFSETTING( 0x1000, "2" ) - PORT_CONFSETTING( 0x0000, "3" ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x86bf, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pairmtch_state::pairmtch(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<2>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->read_r<4>().set(FUNC(pairmtch_state::input_r)); - m_maincpu->write_r<5>().set(FUNC(pairmtch_state::sound_w)); - m_maincpu->read_r<5>().set(m_soundlatch[1], FUNC(generic_latch_8_device::read)); - m_maincpu->write_r<6>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->write_d().set(FUNC(pairmtch_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.2"); - - HD38820(config, m_audiocpu, 400000); // approximation - m_audiocpu->write_r<2>().set(FUNC(pairmtch_state::sound2_w)); - m_audiocpu->read_r<2>().set(m_soundlatch[0], FUNC(generic_latch_8_device::read)); - m_audiocpu->write_d().set(FUNC(pairmtch_state::speaker_w)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 12); - config.set_default_layout(layout_pairmtch); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); - - GENERIC_LATCH_8(config, m_soundlatch[0]); - GENERIC_LATCH_8(config, m_soundlatch[1]); -} - -// roms - -ROM_START( pairmtch ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Alien Attack (manufactured in Taiwan) - * Hitachi HD38800A25 MCU - * cyan/red VFD display Futaba DM-19Z 1J - - It looks like Coleco took Gakken's Heiankyo Alien and turned it into a more - action-oriented game. - -***************************************************************************/ - -class alnattck_state : public hh_hmcs40_state -{ -public: - alnattck_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void alnattck(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void alnattck_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15); - m_display->matrix(m_grid, plate); -} - -void alnattck_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D13: input mux - m_inp_mux = data >> 7 & 0x7f; - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3: plate 16-19 (update display there) - plate_w(4, data & 0xf); -} - -u16 alnattck_state::input_r() -{ - // D5: multiplexed inputs - return read_inputs(7) & 0x20; -} - -// config - -static INPUT_PORTS_START( alnattck ) - PORT_START("IN.0") // D7 line D5 - PORT_CONFNAME( 0x20, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x20, "2" ) - - PORT_START("IN.1") // D8 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D9 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // D10 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.4") // D11 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.5") // D12 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Move") - - PORT_START("IN.6") // D13 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Fire") -INPUT_PORTS_END - -void alnattck_state::alnattck(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_d().set(FUNC(alnattck_state::grid_w)); - m_maincpu->read_d().set(FUNC(alnattck_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 700); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alnattck ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 564271, "screen", 0) - ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Donkey Kong (manufactured in Taiwan, licensed from Nintendo) - * PCB label Coleco Rev C 75790 DK - * Hitachi QFP HD38820A45 MCU - * RC circuit for speaker volume decay - * cyan/red VFD display Futaba DM-47ZK 2K, with color overlay - -***************************************************************************/ - -class cdkong_state : public hh_hmcs40_state -{ -public: - cdkong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void cdkong(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void cdkong_state::machine_start() -{ - hh_hmcs40_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void cdkong_state::speaker_update() -{ - if (m_r[1] & 8) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.02; -} - -void cdkong_state::update_display() -{ - u32 plate = bitswap<32>(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; - m_display->matrix(m_grid, plate); -} - -void cdkong_state::plate_w(offs_t offset, u8 data) -{ - // R13: speaker on - m_r[offset] = data; - speaker_update(); - - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void cdkong_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(BIT(data, 3)); - - // D4-D14: vfd grid - m_grid = data >> 4 & 0x7ff; - update_display(); -} - -// config - -static INPUT_PORTS_START( cdkong ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cdkong_state::cdkong(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_d().set(FUNC(cdkong_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(605, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( cdkong ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359199, "screen", 0) - ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Galaxian (manufactured in Taiwan) - * PCB label Coleco Rev A 75718 - * Hitachi HD38800A70 MCU - * discrete sound (when alien attacks) - * cyan/red VFD display Futaba DM-36Z 2H, with color overlay - - Select game mode on start: - - P1 Left: Galaxian (default game) - - P1 Right: Midway's Attackers - - P2 Left: Head-to-Head Galaxian (2-player mode, short) - - P2 Right: Head-to-Head Galaxian (2-player mode, long) - -***************************************************************************/ - -class cgalaxn_state : public hh_hmcs40_state -{ -public: - cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cgalaxn(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(player_switch); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cgalaxn_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3); - u16 plate = bitswap<16>(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13); - m_display->matrix(grid, plate); -} - -INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch) -{ - // 2-player switch directly enables plate 14 - m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000); - update_display(); -} - -void cgalaxn_state::grid_w(offs_t offset, u8 data) -{ - // R10,R11: input mux - if (offset == 1) - m_inp_mux = data & 3; - - // R1x-R3x: vfd grid - int shift = (offset - 1) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void cgalaxn_state::plate_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1: start alien attack whine sound effect (edge triggered) - - // D2-D15: vfd plate - m_plate = (m_plate & 0x4000) | (data >> 2 & 0x3fff); - update_display(); -} - -u8 cgalaxn_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( cgalaxn ) - PORT_START("IN.0") // R10 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // R11 port R0x - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, cgalaxn_state, player_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.3") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void cgalaxn_state::cgalaxn(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cgalaxn_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_r<2>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_r<3>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_d().set(FUNC(cgalaxn_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(526, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 15); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cgalaxn ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 712204, "screen", 0) - ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Pac-Man (manufactured in Taiwan, licensed from Midway) - * PCB label Coleco 75690 - * Hitachi QFP HD38820A28/29 MCU - * cyan/red VFD display Futaba DM-34Z 2A, with color overlay - - known releases: - - USA: Pac-Man, by Coleco (name-license from Midway) - - Japan: Super Puck Monster, published by Gakken - - Select game mode on start: - - P1 Right: Pac-Man (default game) - - P1 Left: Head-to-Head Pac-Man (2-player mode) - - P1 Up: Eat & Run - - P1 Down: Demo - - BTANB: 1st version doesn't show the whole maze on power-on - -***************************************************************************/ - -class cpacman_state : public hh_hmcs40_state -{ -public: - cpacman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cpacman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cpacman_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x(,D1,D2): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); - u32 plate = bitswap<32>(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7); - m_display->matrix(grid, plate); -} - -void cpacman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D13-D15: input mux - m_inp_mux = data >> 13 & 7; - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D1,D2: plate 8,14 (update display there) - plate_w(6 + 1, data >> 1 & 3); -} - -u8 cpacman_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cpacman ) - PORT_START("IN.0") // D13 port R0x - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D14 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D15 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) -INPUT_PORTS_END - -void cpacman_state::cpacman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cpacman_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_d().set(FUNC(cpacman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(484, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 27); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cpacman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359765, "screen", 0) - ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) -ROM_END - -ROM_START( cpacmanr1 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359765, "screen", 0) - ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Ms. Pac-Man (manufactured in Taiwan, licensed from Midway) - * PCB label Coleco 911171 - * Hitachi QFP HD38820A61 MCU - * cyan/red VFD display Futaba DM-60Z 3I, with color overlay - - Select game mode on start: - - P1 Left: Ms. Pac-Man (default game) - - P1 Down: Head-to-Head Ms. Pac-Man (2-player mode) - - P1 Up: Demo - - BTANB: in demo-mode, she hardly ever walks to the upper two rows - -***************************************************************************/ - -class cmspacmn_state : public hh_hmcs40_state -{ -public: - cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cmspacmn(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cmspacmn_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x(,D0,D1): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); - u32 plate = bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; - m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate); -} - -void cmspacmn_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D13-D15: input mux - m_inp_mux = data >> 13 & 7; - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0,D1: more plates (update display there) - plate_w(6 + 1, data & 3); -} - -u8 cmspacmn_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cmspacmn ) - PORT_START("IN.0") // D13 port R0x - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D14 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - - PORT_START("IN.2") // D15 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) -INPUT_PORTS_END - -void cmspacmn_state::cmspacmn(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cmspacmn_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_d().set(FUNC(cmspacmn_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(481, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 33); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cmspacmn ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 849327, "screen", 0) - ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Galaxian 2 (manufactured in Japan) - * PCB labels ENTEX GALAXIAN PB-118/116/097 80-210137/135/114 - * Hitachi QFP HD38820A13 MCU - * cyan/red/green VFD display Futaba DM-20 - - known releases: - - USA: Galaxian 2, published by Entex - - UK: Astro Invader, published by Hales/Entex - -***************************************************************************/ - -class egalaxn2_state : public hh_hmcs40_state -{ -public: - egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void egalaxn2(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void egalaxn2_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); - u32 plate = bitswap<24>(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); - m_display->matrix(grid, plate); -} - -void egalaxn2_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D4: input mux - m_inp_mux = data >> 1 & 0xf; - - // D1-D15: vfd grid - m_grid = data >> 1 & 0x7fff; - update_display(); -} - -void egalaxn2_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x: vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -u8 egalaxn2_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( egalaxn2 ) - PORT_START("IN.0") // D1 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D4 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) // for Demo mode: need to hold down Fire button at power-on - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) -INPUT_PORTS_END - -void egalaxn2_state::egalaxn2(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(egalaxn2_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_d().set(FUNC(egalaxn2_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(505, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(15, 24); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( egalaxn2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 507945, "screen", 0) - ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Pac Man 2 (manufactured in Japan) - * PCB labels ENTEX PAC-MAN PB-093/094 80-210149/50/51 - * Hitachi QFP HD38820A23 MCU - * cyan/red VFD display Futaba DM-28Z 1G(cyan Pac-Man) or DM-28 1K(orange Pac-Man) - - 2 VFD revisions are known, the difference is Pac-Man's color: cyan or red. - -***************************************************************************/ - -class epacman2_state : public egalaxn2_state -{ -public: - epacman2_state(const machine_config &mconfig, device_type type, const char *tag) : - egalaxn2_state(mconfig, type, tag) - { } - - void epacman2(machine_config &config); -}; - -// handlers are identical to Galaxian 2, so we can use those - -// config - -static INPUT_PORTS_START( epacman2 ) - PORT_START("IN.0") // D1 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Skill Control") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Demo Light Test") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D4 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void epacman2_state::epacman2(machine_config &config) -{ - egalaxn2(config); - - // video hardware - screen_device *screen = subdevice("screen"); - screen->set_size(505, 1080); - screen->set_visarea_full(); -} - -// roms - -ROM_START( epacman2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 262480, "screen", 0) - ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) ) -ROM_END - -ROM_START( epacman2r ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 262483, "screen", 0) - ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Super Space Invader 2 (black version) - * Hitachi HD38800A31 MCU - * cyan/red VFD display - - This version has the same MCU as the Select-A-Game cartridge. Maybe from - surplus inventory after that console was discontinued?. It was also sold - as "Super Alien Invader 2". - - Hold down the fire button at boot for demo mode to work. - -***************************************************************************/ - -class einvader2_state : public hh_hmcs40_state -{ -public: - einvader2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void einvader2(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void einvader2_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void einvader2_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void einvader2_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D3,D5,D6: input mux - m_inp_mux = (data >> 3 & 1) | (data >> 4 & 6); - - // D1-D12: vfd grid - m_grid = data >> 1 & 0xfff; - update_display(); -} - -u16 einvader2_state::input_r() -{ - // D13-D15: multiplexed inputs - return read_inputs(3) << 13; -} - -// config - -static INPUT_PORTS_START( einvader2 ) - PORT_START("IN.0") // D3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x01) // 1 player - - PORT_START("IN.1") // D5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x00) // demo - - PORT_START("IN.2") // D6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - - PORT_START("FAKE") // shared D3/D5 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "Demo" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) -INPUT_PORTS_END - -void einvader2_state::einvader2(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 450000); // approximation - m_maincpu->write_r<0>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_d().set(FUNC(einvader2_state::grid_w)); - m_maincpu->read_d().set(FUNC(einvader2_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(469, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 14); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvader2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, CRC(10e39521) SHA1(41d86696e518ea071e75ed37d5dc63c0408c262e) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 217430, "screen", 0) - ROM_LOAD( "einvader2.svg", 0, 217430, CRC(b082d9a3) SHA1(67f7e0314c69ba146751ea12cf490805b8660489) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Turtles (manufactured in Japan) - * PCB label 560359 - * Hitachi QFP HD38820A43 MCU - * COP411L sub MCU, label COP411L-KED/N - * cyan/red/green VFD display NEC FIP15BM32T - -***************************************************************************/ - -class eturtles_state : public hh_hmcs40_state -{ -public: - eturtles_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_audiocpu(*this, "audiocpu") - { } - - void eturtles(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int(); } - -protected: - virtual void machine_start() override; - - required_device m_audiocpu; - - void update_int(); - virtual void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - - DECLARE_WRITE_LINE_MEMBER(speaker_w); - void cop_irq_w(u8 data); - u8 cop_latch_r(); - u8 cop_ack_r(); - - u8 m_cop_irq = 0; -}; - -void eturtles_state::machine_start() -{ - hh_hmcs40_state::machine_start(); - save_item(NAME(m_cop_irq)); -} - -// handlers: maincpu side - -void eturtles_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); - u32 plate = bitswap<32>(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); - m_display->matrix(grid, plate | (grid >> 5 & 8)); // grid 8 also forces plate 3 high -} - -void eturtles_state::plate_w(offs_t offset, u8 data) -{ - m_r[offset] = data; - - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void eturtles_state::grid_w(u16 data) -{ - m_d = data; - - // D1-D6: input mux - u8 inp_mux = data >> 1 & 0x3f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int(); - } - - // D1-D15: vfd grid - m_grid = data >> 1 & 0x7fff; - update_display(); -} - -void eturtles_state::update_int() -{ - // INT0/1 on multiplexed inputs, and from COP D0 - u8 inp = read_inputs(6); - set_interrupt(0, (inp & 1) | m_cop_irq); - set_interrupt(1, inp & 2); -} - -// handlers: COP side - -WRITE_LINE_MEMBER(eturtles_state::speaker_w) -{ - // SK: speaker out - m_speaker->level_w(!state); -} - -void eturtles_state::cop_irq_w(u8 data) -{ - // D0: maincpu INT0 (active low) - m_cop_irq = ~data & 1; - update_int(); -} - -u8 eturtles_state::cop_latch_r() -{ - // L0-L3: soundlatch from maincpu R0x - return m_r[0]; -} - -u8 eturtles_state::cop_ack_r() -{ - // G0: ack from maincpu D0 - return m_d & 1; -} - -// config - -static INPUT_PORTS_START( eturtles ) - PORT_START("IN.0") // D1 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.1") // D2 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.2") // D3 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.3") // D4 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.4") // D5 INT0/1 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.5") // D6 INT0/1 - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x02, "0 (Demo)" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -void eturtles_state::eturtles(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_d().set(FUNC(eturtles_state::grid_w)); - - COP411(config, m_audiocpu, 215000); // approximation - m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_audiocpu->write_sk().set(FUNC(eturtles_state::speaker_w)); - m_audiocpu->write_d().set(FUNC(eturtles_state::cop_irq_w)); - m_audiocpu->read_l().set(FUNC(eturtles_state::cop_latch_r)); - m_audiocpu->read_g().set(FUNC(eturtles_state::cop_ack_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(484, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(15, 30); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( eturtles ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x0200, "audiocpu", 0 ) - ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) ) - - ROM_REGION( 1027626, "screen", 0) - ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Stargate (manufactured in Japan) - * PCB label 5603521/31 - * Hitachi QFP HD38820A42 MCU - * COP411L sub MCU, label ~/B8236 COP411L-KEC/N - * cyan/red/green VFD display NEC FIP15AM32T (EL628-003) no. 2-421, with partial color overlay - -***************************************************************************/ - -class estargte_state : public eturtles_state -{ -public: - estargte_state(const machine_config &mconfig, device_type type, const char *tag) : - eturtles_state(mconfig, type, tag) - { } - - void estargte(machine_config &config); - -private: - virtual void update_display() override; - u8 cop_data_r(); -}; - -// handlers (most of it is in eturtles_state above) - -void estargte_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); - u32 plate = bitswap<32>(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); - m_display->matrix(grid, plate); -} - -u8 estargte_state::cop_data_r() -{ - // L0-L3: soundlatch from maincpu R0x - // L7: ack from maincpu D0 - return m_r[0] | (m_d << 7 & 0x80); -} - -// config - -static INPUT_PORTS_START( estargte ) - PORT_START("IN.0") // D1 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Inviso") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Smart Bomb") - - PORT_START("IN.1") // D2 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Change Direction") - - PORT_START("IN.2") // D3 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.3") // D4 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Thrust") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // D5 INT0/1 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x00, "0 (Demo)" ) // yes, same value as 1-player, hold the Inviso button at boot to enter demo mode - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.5") // D6 INT0/1 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void estargte_state::estargte(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_d().set(FUNC(estargte_state::grid_w)); - - COP411(config, m_audiocpu, 190000); // approximation - m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_audiocpu->write_sk().set(FUNC(estargte_state::speaker_w)); - m_audiocpu->write_d().set(FUNC(estargte_state::cop_irq_w)); - m_audiocpu->read_l().set(FUNC(estargte_state::cop_data_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 854); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(14, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( estargte ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x0200, "audiocpu", 0 ) - ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) ) - - ROM_REGION( 462214, "screen", 0) - ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Heiankyo Alien (manufactured in Japan) - * Hitachi HD38800A04 MCU - * cyan/red VFD display Futaba DM-11Z 1H - - known releases: - - Japan: Heiankyo Alien, published by Gakken - - USA: Earth Invaders, published by CGL - -***************************************************************************/ - -class ghalien_state : public hh_hmcs40_state -{ -public: - ghalien_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ghalien(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void ghalien_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D10-D13): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update 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,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18); - m_display->matrix(grid, plate); -} - -void ghalien_state::grid_w(u16 data) -{ - // D14: speaker out - m_speaker->level_w(data >> 14 & 1); - - // D0-D6: input mux - m_inp_mux = data & 0x7f; - - // D0-D9: vfd grid - m_grid = data & 0x3ff; - - // D10-D13: more plates (update display there) - plate_w(4, data >> 10 & 0xf); -} - -u16 ghalien_state::input_r() -{ - // D15: multiplexed inputs - return read_inputs(7) & 0x8000; -} - -// config - -static INPUT_PORTS_START( ghalien ) - PORT_START("IN.0") // D0 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // D1 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // D2 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.3") // D3 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.4") // D4 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dig") - - PORT_START("IN.5") // D5 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bury") - - PORT_START("IN.6") // D6 line D15 - PORT_CONFNAME( 0x8000, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "Amateur" ) - PORT_CONFSETTING( 0x8000, "Professional" ) -INPUT_PORTS_END - -void ghalien_state::ghalien(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_d().set(FUNC(ghalien_state::grid_w)); - m_maincpu->read_d().set(FUNC(ghalien_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 699); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ghalien ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 462749, "screen", 0) - ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Crazy Kong (manufactured in Japan) - * PCB label ZENY 5603601 - * Hitachi HD38800B01 MCU - * cyan/red/blue VFD display Futaba DM-54Z 2H, with bezel overlay - - known releases: - - Japan: Crazy Kong, published by Gakken - - USA: Super Kong, published by CGL - -***************************************************************************/ - -class gckong_state : public hh_hmcs40_state -{ -public: - gckong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gckong(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gckong_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0,D1): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); - u32 plate = bitswap<32>(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; - m_display->matrix(grid, plate); -} - -void gckong_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D5-D8: input mux - u8 inp_mux = data >> 5 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0,D1: more plates (update display there) - plate_w(4, data & 3); -} - -void gckong_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( gckong ) - PORT_START("IN.0") // D5 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.1") // D6 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.2") // D7 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.3") // D8 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.5") // port D - PORT_CONFNAME( 0x0010, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "A" ) - PORT_CONFSETTING( 0x0010, "B" ) - PORT_BIT( 0xffef, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gckong_state::gckong(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_d().set(FUNC(gckong_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(479, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 32); - config.set_default_layout(layout_gckong); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gckong ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 346588, "screen", 0) - ROM_LOAD( "gckong.svg", 0, 346588, CRC(317af984) SHA1(ff6323526d1f5e46eccf8fa8d979175895be75de) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Super Cobra - * PCB label SUPER COBRA 3000N - * Hitachi QFP HD38820A32 MCU - * cyan/red/green VFD display - - known releases: - - World: Super Cobra, published by Gakken - - USA: Cobra Super Copter, published by Tandy - - There are 2 versions, a green one and a white one. They have the same MCU, - though the VFD has color differences and is more compact. - - BTANB(green version): 1 rocket seems out of place at the top-right area - -***************************************************************************/ - -class gscobra_state : public hh_hmcs40_state -{ -public: - gscobra_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gscobra(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gscobra_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D1-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void gscobra_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D10-D15: input mux - u8 inp_mux = data >> 10 & 0x3f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D1-D3: more plates (update display there) - plate_w(7, data >> 1 & 7); -} - -void gscobra_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(6)); -} - -// config - -static INPUT_PORTS_START( gscobra ) - PORT_START("IN.0") // D10 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.1") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.2") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.5") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) -INPUT_PORTS_END - -void gscobra_state::gscobra(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_d().set(FUNC(gscobra_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 852); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 31); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gscobra ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a32", 0x0000, 0x1000, CRC(7bbd130f) SHA1(91dd280e4108fad7ba99191355364bd3217b9d17) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 232919, "screen", 0) - ROM_LOAD( "gscobra.svg", 0, 232919, CRC(5ceb4bfc) SHA1(77c9a45569d780838ebe75818acb2d2ced4bda00) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Defender - * Hitachi HD38820L53 MCU (SDIP) - * cyan/red/green VFD display - -***************************************************************************/ - -class gdefender_state : public hh_hmcs40_state -{ -public: - gdefender_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gdefender(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_display(); - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void gdefender_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void gdefender_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void gdefender_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D3-D15: vfd grid - m_grid = data >> 3 & 0x1fff; - update_display(); -} - -u16 gdefender_state::input_r() -{ - // D1: multiplexed inputs - return read_inputs(4) & 2; -} - -void gdefender_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4) & 1); -} - -// config - -static INPUT_PORTS_START( gdefender ) - PORT_START("IN.0") // D11 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.1") // D12 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Warp") - - PORT_START("IN.2") // D13 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) PORT_NAME("Missile / Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") - - PORT_START("IN.3") // D14 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gdefender_state::gdefender(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_d().set(FUNC(gdefender_state::grid_w)); - m_maincpu->read_d().set(FUNC(gdefender_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(13, 28); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gdefender ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820l53", 0x0000, 0x1000, CRC(fe52bbb4) SHA1(e0250954c3801af9841306c2e1fdf57f3b9edffa) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "gdefender.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Dig Dug (manufactured in Japan) - * PCB label Gakken DIG-DAG KS-004283(A/B) - * Hitachi QFP HD38820A69 MCU - * cyan/red/green VFD display Futaba DM-69Z 3F, with color overlay - -***************************************************************************/ - -class gdigdug_state : public hh_hmcs40_state -{ -public: - gdigdug_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gdigdug(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gdigdug_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<32>(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16); - m_display->matrix(m_grid, plate); -} - -void gdigdug_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D3: more plates (update display there) - plate_w(7, data & 0xf); -} - -void gdigdug_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( gdigdug ) - PORT_START("IN.0") // D11 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.5") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void gdigdug_state::gdigdug(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_d().set(FUNC(gdigdug_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(476, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 32); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gdigdug ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 807990, "screen", 0) - ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel World Championship Baseball (model 3201) - * PCB label MEL-001 Baseball Rev. B - * Hitachi QFP HD38820A09 MCU - * cyan/red/green VFD display Futaba DM-24ZK 1G, with etched overlay - - It was patented under US4372557. To start the game in 2-player mode, simply - turn the game on. For 1-player, turn the game on while holding the 1-key - and use the visitor's side keypad to play offsense. - -***************************************************************************/ - -class mwcbaseb_state : public hh_hmcs40_state -{ -public: - mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void mwcbaseb(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - void speaker_w(u8 data); - u8 input_r(); -}; - -// handlers - -void mwcbaseb_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - m_display->matrix(grid, m_plate); -} - -void mwcbaseb_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x,R6x: vfd plate - int shift = (offset == 6) ? 12 : (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void mwcbaseb_state::grid_w(u16 data) -{ - // D9-D15: input mux - m_inp_mux = data >> 9 & 0x7f; - - // D0-D7: vfd grid - m_grid = data & 0xff; - update_display(); -} - -void mwcbaseb_state::speaker_w(u8 data) -{ - // R50,R51+R52(tied together): speaker out - m_speaker->level_w(data & 7); -} - -u8 mwcbaseb_state::input_r() -{ - // R4x: multiplexed inputs - return read_inputs(7); -} - -// config - -/* physical button layout and labels are like this: - - (visitor team side) (home team side) - COMP PITCH [SCORE] [INNING] - [1] [2] [3] [1] [2] [3] - NEW PITCHER PINCH HITTER NEW PITCHER PINCH HITTER - - [4] [5] [6] [4] [5] [6] - BACKWARD (pitch) FORWARD BACKWARD (pitch) FORWARD - - [7] [8] [9] [7] [8] [9] - - BUNT NORMAL HR SWING BUNT NORMAL HR SWING - [CLEAR] [0] [ENTER] [CLEAR] [0] [ENTER] - SLOW CURVE FAST SLOW CURVE FAST -*/ - -static INPUT_PORTS_START( mwcbaseb ) // P1 = left/visitor, P2 = right/home - PORT_START("IN.0") // D9 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("P2 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("P2 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("P2 1") - - PORT_START("IN.1") // D10 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P2 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 5") - - PORT_START("IN.2") // D11 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 9") - - PORT_START("IN.3") // D12 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Inning") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Score") - - PORT_START("IN.4") // D13 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P1 Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - - PORT_START("IN.5") // D14 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - - PORT_START("IN.6") // D15 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") -INPUT_PORTS_END - -void mwcbaseb_state::mwcbaseb(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<1>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->read_r<4>().set(FUNC(mwcbaseb_state::input_r)); - m_maincpu->write_r<5>().set(FUNC(mwcbaseb_state::speaker_w)); - m_maincpu->write_r<6>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_d().set(FUNC(mwcbaseb_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 478); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 16); - m_display->set_bri_levels(0.001); // cyan elements strobed very briefly? - config.set_default_layout(layout_mwcbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); - static const double speaker_levels[] = { 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, -1.0, -0.5 }; - m_speaker->set_levels(8, speaker_levels); -} - -// roms - -ROM_START( mwcbaseb ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 178441, "screen", 0) - ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) ) -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 msthawk(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void msthawk_state::update_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); - m_display->matrix(grid, plate); -} - -void msthawk_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void msthawk_state::grid_w(u16 data) -{ - // 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); - update_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, 0) 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, 0) 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, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.5") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - 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_refresh_hz(60); - screen.set_size(1920, 696); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 21); - 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, "screen", 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 - * cyan/red/green/darkgreen VFD display Itron CP5137 - -***************************************************************************/ - -class pbqbert_state : public hh_hmcs40_state -{ -public: - pbqbert_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void pbqbert(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void pbqbert_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D8): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<32>(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; - m_display->matrix(m_grid, plate); -} - -void pbqbert_state::grid_w(u16 data) -{ - // D14: speaker out - m_speaker->level_w(data >> 14 & 1); - - // D0-D7: vfd grid - m_grid = data & 0xff; - - // D8: plate 25 (update display there) - plate_w(7, data >> 8 & 1); -} - -// config - -static INPUT_PORTS_START( pbqbert ) - PORT_START("IN.0") // port D - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // up-left - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) // up-right - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // down-right - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) // down-left - PORT_BIT( 0xe1ff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pbqbert_state::pbqbert(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_d().set(FUNC(pbqbert_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.0"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(603, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 30); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( pbqbert ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 456567, "screen", 0) - ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) ) -ROM_END - - - - - -/*************************************************************************** - - Romtec Pucki & Monsters - * Hitachi HD38750A67 MCU - * cyan/red/green VFD display - -***************************************************************************/ - -class puckimon_state : public hh_hmcs40_state -{ -public: - puckimon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void puckimon(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(u16 data); -}; - -// handlers - -void puckimon_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void puckimon_state::grid_w(offs_t offset, u8 data) -{ - // R1x-R3x: vfd grid - int shift = (offset - 1) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // R13: vfd plate - if (offset == 1) - m_plate = (m_plate & 0x7fff) | (data << 12 & 0x8000); - update_display(); -} - -void puckimon_state::plate_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D15: vfd plate - m_plate = (m_plate & 0x8000) | (data >> 1 & 0x7fff); - update_display(); - -} - -// config - -static INPUT_PORTS_START( puckimon ) - PORT_START("IN.0") // port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void puckimon_state::puckimon(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set_ioport("IN.0").invert(); - m_maincpu->write_r<1>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_r<2>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_r<3>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_d().set(FUNC(puckimon_state::plate_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 16); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( puckimon ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a67", 0x0000, 0x0800, CRC(8b493783) SHA1(6c37e67de5d59889abf8a155654f130218cfc12e) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "puckimon.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Tron (manufactured in Japan) - * PCB label THN-02 2E114E07 - * Hitachi HD38800A88 MCU - * cyan/red/green VFD display NEC FIP10AM24T no. 2-8 1 - -***************************************************************************/ - -class tmtron_state : public hh_hmcs40_state -{ -public: - tmtron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void tmtron(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void tmtron_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0); - u32 plate = bitswap<24>(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15); - m_display->matrix(grid, plate); -} - -void tmtron_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtron_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3,D5: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x2f0000); - update_display(); -} - -void tmtron_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( tmtron ) - PORT_START("IN.0") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void tmtron_state::tmtron(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_d().set(FUNC(tmtron_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 662); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 23); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmtron ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 384174, "screen", 0) - ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Kingman (manufactured in Japan) - * PCB label THF-01II 2E138E01/2E128E02 - * Hitachi HD38800B23 MCU - * cyan/red/blue VFD display Futaba DM-65ZK 3A - - known releases: - - World: Kingman, published by Tomy - - USA: Kingman, published by Tandy - -***************************************************************************/ - -class kingman_state : public hh_hmcs40_state -{ -public: - kingman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void kingman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void kingman_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u32 plate = bitswap<24>(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12); - m_display->matrix(grid, plate); -} - -void kingman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void kingman_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D4: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); - update_display(); -} - -void kingman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( kingman ) - PORT_START("IN.0") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void kingman_state::kingman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_d().set(FUNC(kingman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(374, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 23); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( kingman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 396320, "screen", 0) - ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Bombman (Portable 6000 series) - * Hitachi HD38800B29 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class bombman_state : public hh_hmcs40_state -{ -public: - bombman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bombman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bombman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void bombman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bombman_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D4: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); - update_display(); -} - -void bombman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bombman ) - PORT_START("IN.0") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) -INPUT_PORTS_END - -void bombman_state::bombman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_d().set(FUNC(bombman_state::grid_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 21); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bombman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b29", 0x0000, 0x1000, CRC(f99ebd3f) SHA1(5016d4e35efa1353d26e60f98d8a027773d571a0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "bombman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - VTech Invaders (manufactured in Taiwan) - * Hitachi HD38750A45 MCU - * cyan/red VFD display Futaba DM-26Z 1G, with bezel - - known releases: - - USA: Invaders/Sonic Invader, published by VTech - - UK: Cosmic Invader, published by Grandstand - - UK: Galactic Invaders, published by Prinztronic - -***************************************************************************/ - -class vinvader_state : public hh_hmcs40_state -{ -public: - vinvader_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void vinvader(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void vinvader_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x(,D4-D6): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); - m_display->matrix(m_grid, plate); -} - -void vinvader_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D4-D6: more plates (update display there) - plate_w(3 + 1, data >> 4 & 7); -} - -// config - -static INPUT_PORTS_START( vinvader ) - PORT_START("IN.0") // port R0x - 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.1") // port D - PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0002, "2" ) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0xfff5, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void vinvader_state::vinvader(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 300000); // approximation - m_maincpu->read_r<0>().set_ioport("IN.0"); - m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_d().set(FUNC(vinvader_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(233, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( vinvader ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a45", 0x0000, 0x0800, CRC(32de6056) SHA1(70238c6c40c3d513f8eced1cb81bdd4dbe12f16c) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 166379, "screen", 0) - ROM_LOAD( "vinvader.svg", 0, 166379, CRC(b75c448e) SHA1(40d546f9fbdb446883e3ab0e3f678f1be8105159) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1982, wantgman, 0, 0, wantgman, wantgman, wantgman_state, empty_init, "Actronics / Hanzawa", "Wanted G-Man", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1979, bambball, 0, 0, bambball, bambball, bambball_state, empty_init, "Bambino", "Dribble Away Basketball", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_init, "Bambino", "Knock-Em Out Boxing", MACHINE_SUPPORTS_SAVE ) - -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, 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 ) -CONS( 1983, bbtime, 0, 0, bbtime, bbtime, bbtime_state, empty_init, "Bandai", "Burger Time (Bandai)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, ktparman, 0, 0, ktparman, ktparman, ktparman_state, empty_init, "Bandai", "Kiteyo Parman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1983, bdoramon, 0, 0, bdoramon, bdoramon, bdoramon_state, empty_init, "Bandai", "Dokodemo Dorayaki Doraemon", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, tkjmaru, 0, 0, tkjmaru, tkjmaru, tkjmaru_state, empty_init, "Bandai", "Toukon Juohmaru", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1983, bultrman, 0, 0, bultrman, bultrman, bultrman_state, empty_init, "Bandai", "Ultraman Monster Battle", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, ggdman, 0, 0, ggdman, ggdman, ggdman_state, empty_init, "Bandai", "Go Go Dynaman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_init, "Bandai", "Machine Man", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, cmspacmn_state, empty_init, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, epacman2, 0, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, einvader2, 0, 0, einvader2, einvader2, einvader2_state, empty_init, "Entex", "Super Space Invader 2 (Entex, black version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, eturtles, 0, 0, eturtles, eturtles, eturtles_state, empty_init, "Entex", "Turtles (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, gscobra, 0, 0, gscobra, gscobra, gscobra_state, empty_init, "Gakken", "Super Cobra (Gakken, green version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, gdefender, 0, 0, gdefender, gdefender, gdefender_state, empty_init, "Gakken", "Defender (Gakken)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -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 Electronics", "World Championship Baseball", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel Electronics", "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 ) - -CONS( 1982, puckimon, 0, 0, puckimon, puckimon, puckimon_state, empty_init, "Romtec", "Pucki & Monsters", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1982, tmtron, 0, 0, tmtron, tmtron, tmtron_state, empty_init, "Tomy", "Tron (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, kingman, 0, 0, kingman, kingman, kingman_state, empty_init, "Tomy", "Kingman", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, bombman, 0, 0, bombman, bombman, bombman_state, empty_init, "Tomy", "Bombman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1981, vinvader, 0, 0, vinvader, vinvader, vinvader_state, empty_init, "VTech", "Invaders (VTech)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_melps4.cpp b/src/mame/handheld/hh_melps4.cpp deleted file mode 100644 index 060ddba845b..00000000000 --- a/src/mame/handheld/hh_melps4.cpp +++ /dev/null @@ -1,381 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/*************************************************************************** - -Mitsubishi MELPS 4 MCU tabletops/handhelds or other simple devices, -most of them are VFD electronic games/toys. - -TODO: -- dump/add Gakken version of Frogger -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/melps4/m58846.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -//#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_melps4_state : public driver_device -{ -public: - hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<4> m_inputs; // max 4 - - // misc common - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u32 m_plate = 0; // VFD current column data - - u8 read_inputs(int columns); -}; - - -// machine start/reset - -void hh_melps4_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_melps4_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_melps4_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button) -{ - // for when reset button is directly tied to MCU reset pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Coleco Frogger (manufactured in Japan, licensed from Sega) - * PCB label Coleco Frogger Code No. 01-81543, KS-003282 Japan - * Mitsubishi M58846-701P MCU - * cyan/red/green VFD display Itron CP5090GLR R1B, with partial color overlay - - Gakken / Konami Frogger - * PCB label Konami Gakken KH-8201D - * Mitsubishi M58846-700P MCU (Konami logo on it) - * cyan/red/green VFD display, with partial color overlay - -***************************************************************************/ - -class cfrogger_state : public hh_melps4_state -{ -public: - cfrogger_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_melps4_state(mconfig, type, tag) - { } - - void cfrogger(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - DECLARE_WRITE_LINE_MEMBER(speaker_w); - u16 input_r(); -}; - -// handlers - -void cfrogger_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11); - u16 plate = bitswap<16>(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8); - m_display->matrix(grid, plate); -} - -void cfrogger_state::plate_w(offs_t offset, u8 data) -{ - // F0,F1: input mux - if (offset == MELPS4_PORTF) - m_inp_mux = data & 3; - - // Sx,Fx,Gx: vfd plate - int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit - int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; - m_plate = (m_plate & ~(mask << shift)) | (data << shift); - update_display(); -} - -void cfrogger_state::grid_w(u16 data) -{ - // D0-D11: vfd grid - m_grid = data; - update_display(); -} - -WRITE_LINE_MEMBER(cfrogger_state::speaker_w) -{ - // T: speaker out - m_speaker->level_w(state); -} - -u16 cfrogger_state::input_r() -{ - // K0,K1: multiplexed inputs - // K2: N/C - // K3: fixed input - return (m_inputs[2]->read() & 8) | (read_inputs(2) & 3); -} - -// config - -static INPUT_PORTS_START( cfrogger ) - PORT_START("IN.0") // F0 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // F1 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // K3 - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) -INPUT_PORTS_END - -void cfrogger_state::cfrogger(machine_config &config) -{ - // basic machine hardware - M58846(config, m_maincpu, 600_kHz_XTAL); - m_maincpu->read_k().set(FUNC(cfrogger_state::input_r)); - m_maincpu->write_s().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_f().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_g().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_d().set(FUNC(cfrogger_state::grid_w)); - m_maincpu->write_t().set(FUNC(cfrogger_state::speaker_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(500, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cfrogger ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) ) - - ROM_REGION( 786255, "screen", 0) - ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken / Konami Jungler (manufactured in Japan) - * PCB label Konami Gakken GR503 - * Mitsubishi M58846-702P MCU - * cyan/red/green VFD display Itron CP5143GLR SGA, with light-yellow color overlay - -***************************************************************************/ - -class gjungler_state : public hh_melps4_state -{ -public: - gjungler_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_melps4_state(mconfig, type, tag) - { } - - void gjungler(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - DECLARE_WRITE_LINE_MEMBER(speaker_w); - u16 input_r(); -}; - -// handlers - -void gjungler_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000; - m_display->matrix(grid, plate); -} - -void gjungler_state::plate_w(offs_t offset, u8 data) -{ - // G0,G1: input mux - if (offset == MELPS4_PORTG) - m_inp_mux = data & 3; - - // Sx,Fx,Gx,U: vfd plate - int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit - int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; - m_plate = (m_plate & ~(mask << shift)) | (data << shift); - update_display(); -} - -void gjungler_state::grid_w(u16 data) -{ - // D0-D11: vfd grid - m_grid = data; - update_display(); -} - -WRITE_LINE_MEMBER(gjungler_state::speaker_w) -{ - // T: speaker out - m_speaker->level_w(state); -} - -u16 gjungler_state::input_r() -{ - // K0,K1: multiplexed inputs - // K2,K3: fixed inputs - return (m_inputs[2]->read() & 0xc) | (read_inputs(2) & 3); -} - -// config - -static INPUT_PORTS_START( gjungler ) - PORT_START("IN.0") // G0 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // G1 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.2") // K2,K3 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x08, 0x00, "Game Mode" ) - PORT_CONFSETTING( 0x00, "A" ) - PORT_CONFSETTING( 0x08, "B" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) -INPUT_PORTS_END - -void gjungler_state::gjungler(machine_config &config) -{ - // basic machine hardware - M58846(config, m_maincpu, 600_kHz_XTAL); - m_maincpu->read_k().set(FUNC(gjungler_state::input_r)); - m_maincpu->write_s().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_f().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_g().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_u().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_d().set(FUNC(gjungler_state::grid_w)); - m_maincpu->write_t().set(FUNC(gjungler_state::speaker_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(481, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gjungler ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m58846-702p", 0x0000, 0x1000, CRC(94ab7060) SHA1(3389bc115d1df8d01a30611fa9e95a900d32b29b) ) - - ROM_REGION( 419696, "screen", 0) - ROM_LOAD( "gjungler.svg", 0, 419696, CRC(c5f6d1f2) SHA1(5032f35326ca689c8e329f760e380cdc9f5dff86) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1982, cfrogger, 0, 0, cfrogger, cfrogger, cfrogger_state, empty_init, "Coleco / Konami", "Frogger (Coleco)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, gjungler, 0, 0, gjungler, gjungler, gjungler_state, empty_init, "Gakken / Konami", "Jungler (Gakken)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_pic16.cpp b/src/mame/handheld/hh_pic16.cpp deleted file mode 100644 index 3a35e746c8c..00000000000 --- a/src/mame/handheld/hh_pic16.cpp +++ /dev/null @@ -1,1965 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -GI PIC 16xx-driven dedicated handhelds or other simple devices. - -known chips: - - serial device etc. ------------------------------------------------------------ - *020 1650 19??, GI Economega IV TV PPL Tuning System Control - *021 1650 1978, GI AY-3-8910 demo board - @024 1655 1979, Toytronic? Football - @033 1655A 1979, Toytronic Football (newer) - @036 1655A 1979, Ideal Maniac - @043 1655A 1979, Caprice Pro-Action Baseball - @049 1655A 1980, Kingsford Match Me(?)/Mini Match Me - @051 1655A 1979, Kmart Dr. Dunk/Tandy Electronic Basketball - @053 1655A 1979, Atari Touch Me - @0?? 1655A 1979, Tiger Half Court Computer Basketball/Sears Electronic Basketball (custom label) - @061 1655A 1980, Lakeside Le Boom - @078 1655A 1980, Ideal Flash - *081 1655A 1981, Ramtex Space Invaders/Block Buster - *085 1655A 1980, VTech Soccer 2/Grandstand Match of the Day Soccer - @094 1655A 1980, GAF Melody Madness - @110 1650A 1979, Tiger/Tandy Rocket Pinball - *123 1655A? 1980, Kingsford Match Me/Mini Match Me - @133 1650A 1981, U.S. Games Programmable Baseball/Tandy 2-Player Baseball - @144 1650A 1981, U.S. Games/Tandy 2-Player Football - *192 1650 19??, phone dialer (have dump) - *255 1655 19??, talking clock (have dump) - *518 1650A 19??, GI Teleview Control Chip (features differ per program) - *519 1650A 19??, " - *532 1650A 19??, " - *533 1650A 19??, " - *536 1650 1982, GI Teleview Autodialer/Terminal Identifier - - (* means undumped unless noted, @ denotes it's in this driver) - -ROM source notes when dumped from another publisher, but confident it's the same: -- drdunk: Tandy Electronic Basketball -- flash: Radio Shack Sound Effects Chassis -- hccbaskb: Sears Electronic Basketball -- us2pfball: Tandy 2-Player Football -- uspbball: Tandy 2-Player Baseball - -TODO: -- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.) -- ttfball: discrete sound part, for volume gating? -- what's the relation between drdunk and hccbaskb? Probably made by the same - Hong Kong subcontractor? I presume Toytronic. -- uspbball and pabball internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/pic16c5x/pic16c5x.h" -#include "video/pwm.h" -#include "machine/clock.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "drdunk.lh" -#include "flash.lh" // clickable -#include "hccbaskb.lh" -#include "leboom.lh" // clickable -#include "maniac.lh" // clickable -#include "melodym.lh" // clickable -#include "matchme.lh" // clickable -#include "rockpin.lh" -#include "touchme.lh" // clickable -#include "ttfball.lh" -#include "us2pfball.lh" - -#include "hh_pic16_test.lh" // common test-layout - use external artwork - - -class hh_pic16_state : public driver_device -{ -public: - hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_a = 0; // MCU port A write data - u8 m_b = 0; // " B - u8 m_c = 0; // " C - u8 m_d = 0; // " D - u16 m_inp_mux = ~0; // multiplexed inputs mask - - u16 read_inputs(int columns, u16 colmask = ~0); - u8 read_rotated_inputs(int columns, u8 rowmask = ~0); -}; - - -// machine start/reset - -void hh_pic16_state::machine_start() -{ - // register for savestates - save_item(NAME(m_a)); - save_item(NAME(m_b)); - save_item(NAME(m_c)); - save_item(NAME(m_d)); - save_item(NAME(m_inp_mux)); -} - -void hh_pic16_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_pic16_state::read_inputs(int columns, u16 colmask) -{ - // active low - u16 ret = ~0 & colmask; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (~m_inp_mux >> i & 1) - ret &= m_inputs[i]->read(); - - return ret; -} - -u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask) -{ - u8 ret = 0; - u16 colmask = (1 << columns) - 1; - - // read selected input columns - for (int i = 0; i < 8; i++) - if (1 << i & rowmask && ~m_inputs[i]->read() & ~m_inp_mux & colmask) - ret |= 1 << i; - - // active low - return ~ret & rowmask; -} - -INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button) -{ - // when an input is directly wired to MCU MCLR pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Atari Touch Me - * PIC 1655A-053 - * 2 7seg LEDs + 4 other LEDs, 1-bit sound - - This is the handheld version of the 1974 arcade game. - - known revisions: - - Model BH-100 GI C013233 Rev 2 Atari W 1979: PIC 1655A-053 - - Model BH-100 C013150 Rev 6 Atari 1979: AMI C10745 (custom ASIC) - -***************************************************************************/ - -class touchme_state : public hh_pic16_state -{ -public: - touchme_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void touchme(machine_config &config); - -private: - void update_display(); - void update_speaker(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void touchme_state::update_display() -{ - m_display->matrix(~m_b & 0x7b, m_c); -} - -void touchme_state::update_speaker() -{ - m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); -} - -u8 touchme_state::read_a() -{ - // A: multiplexed inputs - return read_inputs(3, 0xf); -} - -void touchme_state::write_b(u8 data) -{ - // B0-B2: input mux - m_inp_mux = data & 7; - - // B0,B1: digit select - // B3-B6: leds - m_b = data; - update_display(); - - // B7: speaker lead 1 - update_speaker(); -} - -void touchme_state::write_c(u8 data) -{ - // C0-C6: digit segments - m_c = data; - update_display(); - - // C7: speaker lead 2 - update_speaker(); -} - -// config - -static INPUT_PORTS_START( touchme ) - PORT_START("IN.0") // B0 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("High") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Skill") - - PORT_START("IN.1") // B1 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green Button") - - PORT_START("IN.2") // B2 port A - PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select" ) - PORT_CONFSETTING( 0x01^0x07, "1" ) - PORT_CONFSETTING( 0x02^0x07, "2" ) - PORT_CONFSETTING( 0x04^0x07, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void touchme_state::touchme(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 300000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->read_a().set(FUNC(touchme_state::read_a)); - m_maincpu->write_b().set(FUNC(touchme_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(touchme_state::write_c)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 300000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_touchme); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( touchme ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) ) -ROM_END - - - - - -/*************************************************************************** - - Caprice Pro-Action Baseball (manufactured by Calfax) - * PIC 1655A-043 - * 1 7seg LED + 36 other LEDs, CD4028, 1-bit sound - -***************************************************************************/ - -class pabball_state : public hh_pic16_state -{ -public: - pabball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void pabball(machine_config &config); - -private: - void update_display(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void pabball_state::update_display() -{ - // CD4028 BCD to decimal decoder - // CD4028 0-8: led select, 9: 7seg - u16 sel = m_c & 0xf; - if (sel & 8) sel &= 9; - sel = 1 << sel; - - m_display->matrix(sel, m_b); -} - -void pabball_state::write_b(u8 data) -{ - // B: led data - m_b = ~data; - update_display(); -} - -void pabball_state::write_c(u8 data) -{ - // C2: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 2 & 1); - - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C3: CD4028 A-D - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( pabball ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Straight") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port C - PORT_BIT( 0xcf, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Hit") - PORT_CONFNAME( 0x20, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x20, "2" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, 0) PORT_NAME("P1 Reset") -INPUT_PORTS_END - -void pabball_state::pabball(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1200000); // approximation - RC osc. R=18K, C=27pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(pabball_state::write_b)); - m_maincpu->read_c().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(pabball_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x200, 0xff); - config.set_default_layout(layout_hh_pic16_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( pabball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) ) -ROM_END - - - - - -/*************************************************************************** - - GAF Melody Madness - * PIC 1655A-094 - * 2 lamps under tube, 1-bit sound - - Melody Madness is a tabletop music memory game, shaped like a jukebox. - It can also be played as a simple electronic piano. - -***************************************************************************/ - -class melodym_state : public hh_pic16_state -{ -public: - melodym_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void melodym(machine_config &config); - -private: - void write_b(u8 data); - u8 read_c(); - void write_c(u8 data); -}; - -// handlers - -void melodym_state::write_b(u8 data) -{ - // B2-B6: input mux - m_inp_mux = data >> 2 & 0x1f; -} - -u8 melodym_state::read_c() -{ - // C0-C4: multiplexed inputs - return read_inputs(5, 0x1f) | 0xe0; -} - -void melodym_state::write_c(u8 data) -{ - // C6: both lamps - m_display->matrix(1, ~data >> 6 & 1); - - // C7: speaker out - m_speaker->level_w(~data >> 7 & 1); -} - -// config - -static INPUT_PORTS_START( melodym ) - PORT_START("IN.0") // B2 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") - - PORT_START("IN.1") // B3 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 6") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 8") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 9") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Button 10") - - PORT_START("IN.2") // B4 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 11") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 12") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // there is no button 13 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 14") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Button 15") - - PORT_START("IN.3") // B5 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 16") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 17") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 18") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 19") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button 20") - - PORT_START("IN.4") // B6 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Button 21") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Button 22") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Button 23") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Button 24") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Button 25") - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Novice") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Whiz") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Pro") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Note") -INPUT_PORTS_END - -void melodym_state::melodym(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - m_maincpu->read_a().set_ioport("IN.5"); - m_maincpu->write_b().set(FUNC(melodym_state::write_b)); - m_maincpu->read_c().set(FUNC(melodym_state::read_c)); - m_maincpu->write_c().set(FUNC(melodym_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - m_display->set_bri_levels(0.9); - config.set_default_layout(layout_melodym); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( melodym ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Maniac, by Ralph Baer - * PIC 1655A-036 - * 2 7seg LEDs, 1-bit sound - - Maniac is a reflex game for 2-4 players. There are 4 challenges: - 1: Musical Maniac: Press the button as soon as the music stops. - 2: Sounds Abound: Count the number of tones in the song, then press the button - after the same amount of beeps. - 3: Look Twice: Press the button after the game repeats the first pattern. - 4: Your Time Is Up: Press the button after estimating the duration of the tone. - -***************************************************************************/ - -class maniac_state : public hh_pic16_state -{ -public: - maniac_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void maniac(machine_config &config); - -private: - void update_display(); - void update_speaker(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void maniac_state::update_display() -{ - m_display->write_row(0, ~m_b & 0x7f); - m_display->write_row(1, ~m_c & 0x7f); -} - -void maniac_state::update_speaker() -{ - m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); -} - -void maniac_state::write_b(u8 data) -{ - // B0-B6: left 7seg - m_b = data; - update_display(); - - // B7: speaker lead 1 - update_speaker(); -} - -void maniac_state::write_c(u8 data) -{ - // C0-C6: right 7seg - m_c = data; - update_display(); - - // C7: speaker lead 2 - update_speaker(); -} - -// config - -static INPUT_PORTS_START( maniac ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // top button, increment clockwise - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) -INPUT_PORTS_END - -void maniac_state::maniac(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - RC osc. R=~13.4K, C=470pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(maniac_state::write_b)); - m_maincpu->write_c().set(FUNC(maniac_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_maniac); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( maniac ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Flash - * PCB label 25-600321, REV C, TCI-A3H / 94HB - * PIC 1655A-078 - * 2 7seg LEDs + 8 other LEDs, 1-bit sound with volume decay - - Flash is a wall-mounted game, players throw beanbags to activate the buttons. - It's described in patent US4333657 as an electronic dart game. - - BTANB: In games 4 and 5 it's easy to lock up the program by pressing the - buttons repeatedly and causing a score overflow. Although that wouldn't be - possible by properly throwing beanbags at it. This bug is warned about in - the manual. - - This could also be purchased as a bare PCB from Radio Shack under the Archer - brand, catalog number 277-1013. It was named "Sound Effects Chassis" but - clearly it's nothing like that. The instruction leaflet that came with the - PCB says to attach a speaker and a 9V power source. It actually takes 5V, - 9V would break it. The only thing it has to say about the game itself is - "Your module will produce blinking lights and several different sounds." - -***************************************************************************/ - -class flash_state : public hh_pic16_state -{ -public: - flash_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void flash(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - void update_display(); - void write_b(u8 data); - u8 read_c(); - void write_c(u8 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void flash_state::machine_start() -{ - hh_pic16_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void flash_state::speaker_update() -{ - if (~m_b & 0x40) - m_speaker_volume = 50.0; - - // it takes a bit before it actually starts fading - m_volume->flt_volume_set_volume(std::min(m_speaker_volume, 1.0)); -} - -TIMER_DEVICE_CALLBACK_MEMBER(flash_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.0075; -} - -void flash_state::update_display() -{ - m_display->matrix(~m_b >> 4 & 3, (~m_c >> 1 & 0x7f) | (~m_b << 7 & 0x780)); -} - -void flash_state::write_b(u8 data) -{ - // B0-B3: led data - // B4,B5: led select - m_b = data; - update_display(); - - // B7: speaker out - m_speaker->level_w(BIT(data, 7)); - - // B6: speaker on - speaker_update(); -} - -u8 flash_state::read_c() -{ - // C1-C7: buttons - return (m_c & 1) ? 0xff : m_inputs[1]->read(); -} - -void flash_state::write_c(u8 data) -{ - // C0: enable buttons - // C1-C7: digit segments - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( flash ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // top button, increment clockwise - PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) -INPUT_PORTS_END - -void flash_state::flash(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1050000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(flash_state::write_b)); - m_maincpu->read_c().set(FUNC(flash_state::read_c)); - m_maincpu->write_c().set(FUNC(flash_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 7+4); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_flash); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(flash_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( flash ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-078", 0x0000, 0x0400, CRC(bf780733) SHA1(57ac4620d87492280ab8cf69c148f98e38ecedc4) ) -ROM_END - - - - - -/*************************************************************************** - - Kingsford Match Me - * PIC 1655A-049 - * 8 lamps, 1-bit sound - - Known releases: - - USA(1): Match Me/Mini Match Me, published by Kingsford - - USA(2): Me Too, published by Talbot - - Hong Kong: Gotcha!/Encore/Follow Me, published by Toytronic - - Match Me is the tabletop version, Mini Match Me is the handheld. - The original is probably by Toytronic, Kingsford's version being licensed from them. - - Known revisions: - - PIC 1655A-049 (this one, dumped from a Mini Match Me) - - PIC 1655A-123 (seen in Match Me and Mini Match Me) - -***************************************************************************/ - -class matchme_state : public hh_pic16_state -{ -public: - matchme_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void matchme(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void write_b(u8 data); - void write_c(u8 data); - u8 read_c(); -}; - -void matchme_state::machine_reset() -{ - hh_pic16_state::machine_reset(); - set_clock(); -} - -// handlers - -void matchme_state::set_clock() -{ - // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a - // 10pF cap to speed it up by about 7.5%. - m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 1300000 : 1200000); -} - -void matchme_state::write_b(u8 data) -{ - // B0-B7: lamps - m_display->matrix(1, data); -} - -u8 matchme_state::read_c() -{ - // C0-C3: multiplexed inputs from C4-C6 - m_inp_mux = m_c >> 4 & 7; - u8 lo = read_inputs(3, 0xf); - - // C4-C6: multiplexed inputs from C0-C3 - m_inp_mux = m_c & 0xf; - u8 hi = read_rotated_inputs(4, 7); - - return lo | hi << 4 | 0x80; -} - -void matchme_state::write_c(u8 data) -{ - // C0-C6: input mux - m_c = data; - - // C7: speaker out + RTCC pin - m_speaker->level_w(data >> 7 & 1); - m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 7 & 1); -} - -// config - -static INPUT_PORTS_START( matchme ) - PORT_START("IN.0") // C4 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // purple - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pink - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // yellow - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // blue - - PORT_START("IN.1") // C5 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) // red - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) // cyan - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) // orange - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) // green - - PORT_START("IN.2") // C6 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x03) // Last/Auto - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Long") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // port A - PORT_CONFNAME( 0x07, 0x00^0x07, "Game" ) - PORT_CONFSETTING( 0x00^0x07, "1" ) - PORT_CONFSETTING( 0x01^0x07, "2" ) - PORT_CONFSETTING( 0x02^0x07, "3" ) - PORT_CONFSETTING( 0x04^0x07, "4" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "Amateur" ) // AM - PORT_CONFSETTING( 0x00, "Professional" ) // PRO - - PORT_START("IN.4") // another fake - PORT_CONFNAME( 0x01, 0x00, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, matchme_state, speed_switch, 0) - PORT_CONFSETTING( 0x00, DEF_STR( Low ) ) - PORT_CONFSETTING( 0x01, DEF_STR( High ) ) - - PORT_START("FAKE") // Last/Auto are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Last") - PORT_CONFNAME( 0x02, 0x02, "Music" ) - PORT_CONFSETTING( 0x02, "Manual" ) - PORT_CONFSETTING( 0x00, "Auto" ) -INPUT_PORTS_END - -void matchme_state::matchme(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1200000); // see set_clock - m_maincpu->read_a().set_ioport("IN.3"); - m_maincpu->write_b().set(FUNC(matchme_state::write_b)); - m_maincpu->read_c().set(FUNC(matchme_state::read_c)); - m_maincpu->write_c().set(FUNC(matchme_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 8); - config.set_default_layout(layout_matchme); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( matchme ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) ) -ROM_END - - - - - -/*************************************************************************** - - Kmart Dr. Dunk (manufactured in Hong Kong) - * PIC 1655A-51 - * 2 7seg LEDs + 21 other LEDs, 1-bit sound - - It is a clone of Mattel Basketball, but at lower speed. - The ROM is nearly identical to hccbaskb, the housing/overlay is similar to - U.S. Games/Tandy Trick Shot Basketball. - - known releases: - - USA(1): Dr. Dunk, published by Kmart - - USA(2): Electronic Basketball (model 60-2146), published by Tandy - -***************************************************************************/ - -class drdunk_state : public hh_pic16_state -{ -public: - drdunk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void drdunk(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void drdunk_state::update_display() -{ - m_display->matrix(m_b, m_c); -} - -u8 drdunk_state::read_a() -{ - // A2: skill switch, A3: multiplexed inputs - return m_inputs[5]->read() | read_inputs(5, 8) | 3; -} - -void drdunk_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0-B4: input mux - m_inp_mux = ~data & 0x1f; - - // B0-B3: led select - // B4,B5: digit select - m_b = data; - update_display(); -} - -void drdunk_state::write_c(u8 data) -{ - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C6: led data - m_c = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( drdunk ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // B2 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // B4 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) - - PORT_START("IN.5") // port A2 - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void drdunk_state::drdunk(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=18K, C=47pF - m_maincpu->read_a().set(FUNC(drdunk_state::read_a)); - m_maincpu->write_b().set(FUNC(drdunk_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(drdunk_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 7); - m_display->set_segmask(0x30, 0x7f); - m_display->set_bri_levels(0.01, 0.2); // player led is brighter - config.set_default_layout(layout_drdunk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( drdunk ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) ) -ROM_END - - - - - -/*************************************************************************** - - Lakeside Le Boom - * PIC 1655A-061 - * 1 led, 1-bit sound with RC circuit for volume decay - - This is a tabletop timebomb defusion game. It's shaped like an aerial bomb, - colored black on USA version, yellow on dual-language Canadian version. - The game starts 'ticking' when the player opens the keypad door. To begin, - select the game mode, rows(keypad size), and fuse duration. - - Game modes as described on the box: - 1: Eliminate the buttons one by one in the order set out by the computer. Press - one twice and you'll be sorry! - 2: For 2 or more players. Take turns pressing the buttons, remember which ones. - Press a button a second time and watch out, it's all over. - 3: The computer picks one secret button that stops the fuse. You must press it - on your 5th turn. Listen to the clues and you'll do fine. - 4: The computer picks a secret combination. Find it first by listening to the - clues. Find the right order and you'll get it to fizzle out. - -***************************************************************************/ - -class leboom_state : public hh_pic16_state -{ -public: - leboom_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void leboom(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void leboom_state::machine_start() -{ - hh_pic16_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void leboom_state::speaker_update() -{ - if (~m_c & 0x80) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(leboom_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.005; -} - -u8 leboom_state::read_a() -{ - // A: multiplexed inputs - return read_inputs(6, 0xf); -} - -void leboom_state::write_b(u8 data) -{ - // B0-B5: input mux - m_inp_mux = data & 0x3f; -} - -void leboom_state::write_c(u8 data) -{ - // C4: single led - m_display->matrix(1, BIT(data, 4)); - - // C6: speaker out - m_speaker->level_w(BIT(data, 6)); - - // C7: speaker on - m_c = data; - speaker_update(); -} - -// config - -static INPUT_PORTS_START( leboom ) - PORT_START("IN.0") // B0 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Red Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Red Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Red Button 4") - - PORT_START("IN.1") // B1 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Red-Red Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Red-Green Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Red-Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Red-Blue Button") - - PORT_START("IN.2") // B2 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Shortest") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Short") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Long") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Longest") - - PORT_START("IN.3") // B3 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Yellow Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Yellow Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Yellow Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Yellow Button 4") - - PORT_START("IN.4") // B4 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Blue Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Blue Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Blue Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Blue Button 4") - - PORT_START("IN.5") // B5 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Blue Button 5") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Blue Button 6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Blue Button 7") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Blue Button 8") -INPUT_PORTS_END - -void leboom_state::leboom(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - m_maincpu->read_a().set(FUNC(leboom_state::read_a)); - m_maincpu->write_b().set(FUNC(leboom_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(leboom_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_leboom); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(leboom_state::speaker_decay_sim), attotime::from_msec(5)); -} - -// roms - -ROM_START( leboom ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Rocket Pinball (model 7-460) - * PIC 1650A-110, 69-11397 - * 3 7seg LEDs + 44 other LEDs, 1-bit sound - - known releases: - - Hong Kong(1): Rocket Pinball, published by Tiger - - Hong Kong(2): Spaceship Pinball, published by Toytronic - - USA(1): Rocket Pinball (model 60-2140), published by Tandy - - USA(2): Cosmic Pinball (model 49-65456), published by Sears - -***************************************************************************/ - -class rockpin_state : public hh_pic16_state -{ -public: - rockpin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void rockpin(machine_config &config); - -private: - void update_display(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void rockpin_state::update_display() -{ - // 3 7seg leds from ports A and B - m_display->matrix_partial(0, 3, m_a, m_b); - - // 44 leds from ports C and D - m_display->matrix_partial(3, 6, m_d, m_c); -} - -void rockpin_state::write_a(u8 data) -{ - // A3,A4: speaker out - m_speaker->level_w(data >> 3 & 3); - - // A0-A2: select digit - m_a = ~data & 7; - update_display(); -} - -void rockpin_state::write_b(u8 data) -{ - // B0-B6: digit segments - m_b = data & 0x7f; - update_display(); -} - -void rockpin_state::write_c(u8 data) -{ - // C0-C7: led data - m_c = ~data; - update_display(); -} - -void rockpin_state::write_d(u8 data) -{ - // D0-D5: led select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( rockpin ) - PORT_START("IN.0") // port A - PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Ball") -INPUT_PORTS_END - -void rockpin_state::rockpin(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_a().set(FUNC(rockpin_state::write_a)); - m_maincpu->read_b().set_constant(0xff); - m_maincpu->write_b().set(FUNC(rockpin_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(rockpin_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(rockpin_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 450000/4).signal_handler().set_inputline(m_maincpu, PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3+6, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_rockpin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( rockpin ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Half Court Computer Basketball (model 7-470) - * PIC 1655A(no serial), 69-11557 - * 2 7seg LEDs + 26 other LEDs, 1-bit sound - - known releases: - - Hong Kong: Half Court Computer Basketball, published by Tiger - - USA: Electronic Basketball (model 49-65453), published by Sears - -***************************************************************************/ - -class hccbaskb_state : public hh_pic16_state -{ -public: - hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void hccbaskb(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void hccbaskb_state::update_display() -{ - m_display->matrix(m_b, m_c); -} - -u8 hccbaskb_state::read_a() -{ - // A2: skill switch, A3: multiplexed inputs - return m_inputs[5]->read() | read_inputs(5, 8) | 3; -} - -void hccbaskb_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0-B4: input mux - m_inp_mux = ~data & 0x1f; - - // B7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // B0-B4: led select - // B5,B6: digit select - m_b = data; - update_display(); -} - -void hccbaskb_state::write_c(u8 data) -{ - // C0-C6: led data - m_c = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( hccbaskb ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // B2 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // B4 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) - - PORT_START("IN.5") // port A2 - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void hccbaskb_state::hccbaskb(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=15K, C=47pF - m_maincpu->read_a().set(FUNC(hccbaskb_state::read_a)); - m_maincpu->write_b().set(FUNC(hccbaskb_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(hccbaskb_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x60, 0x7f); - m_display->set_bri_levels(0.01, 0.2); // player led is brighter - config.set_default_layout(layout_hccbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( hccbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) ) -ROM_END - - - - - -/*************************************************************************** - - Toytronic Football (set 1) - * PIC 1655A-033 - * 4511 7seg BCD decoder, 7 7seg LEDs + 27 other LEDs, 1-bit sound - - (no brand) Football (set 2) - * PIC 1655-024 - * rest same as above, 1 less button - - Hello and welcome to another Mattel Football clone, there are so many of these. - The 1655-024 one came from an unbranded handheld, but comparison suggests that - it's the 'prequel' of 1655A-033. - - The 1655-024 version looks and sounds the same as Conic "Electronic Football". - -***************************************************************************/ - -class ttfball_state : public hh_pic16_state -{ -public: - ttfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void ttfball(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void ttfball_state::update_display() -{ - // C0-C2: led data - // C0-C3: 4511 A-D, C4: digit segment DP - // C5: select digits or led matrix - const u8 _4511_map[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0,0,0,0,0,0 }; - u16 led_data = (m_c & 0x20) ? (_4511_map[m_c & 0xf] | (~m_c << 3 & 0x80)) : (~m_c << 8 & 0x700); - - m_display->matrix(m_b | (m_c << 1 & 0x100), led_data); -} - -u8 ttfball_state::read_a() -{ - // A3: multiplexed inputs, A0-A2: other inputs - return m_inputs[5]->read() | read_inputs(5, 8); -} - -void ttfball_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0,B1,B3,B7: input mux low - m_inp_mux = (m_inp_mux & 0x10) | (~data & 3) | (~data >> 1 & 4) | (~data >> 4 & 8); - - // B0-B7: led select (see above) - m_b = data; - update_display(); -} - -void ttfball_state::write_c(u8 data) -{ - // C6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // C7: input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); - - // C0-C7: led data/select (see above) - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( ttfball ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.2") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // C7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick") - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( ttfballa ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Forward") - - PORT_START("IN.2") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.3") // B7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.4") // C7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void ttfball_state::ttfball(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 600000); // approximation - RC osc. R=27K(set 1) or 33K(set 2), C=68pF - m_maincpu->read_a().set(FUNC(ttfball_state::read_a)); - m_maincpu->write_b().set(FUNC(ttfball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(ttfball_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x7f, 0xff); - m_display->set_bri_levels(0.003, 0.03); // player led is brighter - config.set_default_layout(layout_ttfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ttfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) ) -ROM_END - -ROM_START( ttfballa ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Programmable Baseball - * PIC 1650A-133 - * 3 7seg LEDs + 36 other LEDs, 1-bit sound - - known releases: - - USA(1): Programmable Baseball, published by U.S. Games - - USA(2): Electronic 2-Player Baseball (model 60-2157), published by Tandy - -***************************************************************************/ - -class uspbball_state : public hh_pic16_state -{ -public: - uspbball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void uspbball(machine_config &config); - -private: - void update_display(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void uspbball_state::update_display() -{ - m_display->matrix(m_d, m_c << 8 | m_b); -} - -void uspbball_state::write_a(u8 data) -{ - // A0: speaker out - m_speaker->level_w(data & 1); -} - -void uspbball_state::write_b(u8 data) -{ - // B: digit segment data - m_b = bitswap<8>(data,0,1,2,3,4,5,6,7); - update_display(); -} - -void uspbball_state::write_c(u8 data) -{ - // C: led data - m_c = ~data; - update_display(); -} - -void uspbball_state::write_d(u8 data) -{ - // D0-D2: digit select - // D3-D5: led select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( uspbball ) - PORT_START("IN.0") // port A - PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Fast") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Change Up/Fielder") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - - PORT_START("IN.1") // port D - PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_CONFNAME( 0x80, 0x80, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x80, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void uspbball_state::uspbball(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 900000); // approximation - RC osc. R=22K, C=47pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_a().set(FUNC(uspbball_state::write_a)); - m_maincpu->read_b().set_constant(0xff); - m_maincpu->write_b().set(FUNC(uspbball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(uspbball_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(uspbball_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 900000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 16); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_hh_pic16_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( uspbball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Electronic 2-Player Football - * PIC 1650A-144 - * 8 7seg LEDs + 2 other LEDs, 1-bit sound - - known releases: - - USA(1): Electronic 2-Player Football, published by U.S. Games - - USA(2): Electronic 2-Player Football (model 60-2156), published by Tandy - -***************************************************************************/ - -class us2pfball_state : public hh_pic16_state -{ -public: - us2pfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void us2pfball(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void us2pfball_state::update_display() -{ - m_display->matrix(m_d | (m_a << 6 & 0x300), m_c); -} - -u8 us2pfball_state::read_a() -{ - // A0,A1: multiplexed inputs, A4-A7: other inputs - return read_inputs(4, 3) | (m_inputs[4]->read() & 0xf0) | 0x0c; -} - -void us2pfball_state::write_a(u8 data) -{ - // A2,A3: leds - m_a = data; - update_display(); -} - -void us2pfball_state::write_b(u8 data) -{ - // B0-B3: input mux - m_inp_mux = data & 0xf; -} - -void us2pfball_state::write_c(u8 data) -{ - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C6: digit segments - m_c = data; - update_display(); -} - -void us2pfball_state::write_d(u8 data) -{ - // D0-D7: digit select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( us2pfball ) - PORT_START("IN.0") // B0 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.1") // B1 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.2") // B2 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.3") // B3 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.4") // port A high - PORT_CONFNAME( 0x10, 0x10, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x10, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x20, "1" ) // college - PORT_CONFSETTING( 0x00, "2" ) // pro - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") // K/P - - PORT_START("IN.5") // port B - PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Status/Score") // S -INPUT_PORTS_END - -void us2pfball_state::us2pfball(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 800000); // approximation - RC osc. R=39K, C=75pF - m_maincpu->read_a().set(FUNC(us2pfball_state::read_a)); - m_maincpu->write_a().set(FUNC(us2pfball_state::write_a)); - m_maincpu->read_b().set_ioport("IN.5"); - m_maincpu->write_b().set(FUNC(us2pfball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(us2pfball_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(us2pfball_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 800000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0xff, 0x7f); - m_display->set_bri_levels(0.01, 0.17); // player led is brighter - config.set_default_layout(layout_us2pfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( us2pfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Caprice / Calfax", "Pro-Action Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, drdunk, 0, 0, drdunk, drdunk, drdunk_state, empty_init, "Kmart", "Dr. Dunk", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, rockpin, 0, 0, rockpin, rockpin, rockpin_state, empty_init, "Tiger Electronics", "Rocket Pinball", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, hccbaskb, 0, 0, hccbaskb, hccbaskb, hccbaskb_state, empty_init, "Tiger Electronics", "Half Court Computer Basketball", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, ttfball, 0, 0, ttfball, ttfball, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -CONS( 1979, ttfballa, ttfball, 0, ttfball, ttfballa, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 2)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, uspbball, 0, 0, uspbball, uspbball, uspbball_state, empty_init, "U.S. Games", "Programmable Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1981, us2pfball, 0, 0, us2pfball, us2pfball, us2pfball_state, empty_init, "U.S. Games", "Electronic 2-Player Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_pps41.cpp b/src/mame/handheld/hh_pps41.cpp deleted file mode 100644 index 2521f355b0d..00000000000 --- a/src/mame/handheld/hh_pps41.cpp +++ /dev/null @@ -1,1617 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -Rockwell PPS-4/1 MCU series handhelds - -ROM source notes when dumped from another publisher, but confident it's the same: -- memoquiz: Mattel Mind Boggler - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/pps41/mm75.h" -#include "cpu/pps41/mm76.h" -#include "cpu/pps41/mm78.h" -#include "cpu/pps41/mm78la.h" -#include "video/pwm.h" -#include "sound/beep.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "brainbaf.lh" -#include "dunksunk.lh" -#include "ftri1.lh" -#include "horocomp.lh" -#include "mastmind.lh" -#include "memoquiz.lh" -#include "mfootb2.lh" -#include "mwcfootb.lh" -#include "rdqa.lh" -#include "scrabsen.lh" -#include "smastmind.lh" - -//#include "hh_pps41_test.lh" // common test-layout - use external artwork - - -class hh_pps41_state : public driver_device -{ -public: - hh_pps41_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override { update_int(); } - virtual void device_post_load() override { update_int(); } - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<11> m_inputs; // max 11 - - u16 m_inp_mux = 0; - u32 m_grid = 0; - u32 m_plate = 0; - - // MCU output pin state - u16 m_d = 0; - u16 m_r = 0; - - u8 read_inputs(int columns); - virtual void update_int() { ; } -}; - - -// machine start - -void hh_pps41_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); - save_item(NAME(m_d)); - save_item(NAME(m_r)); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_pps41_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_pps41_state::reset_button) -{ - // when an input is directly wired to MCU PO pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Fonas Tri-1 - * PCB label: CASSIA CA010-F - * MM78 MCU variant with 40 pins (no label, die label A7859) - * 4 7seg leds, 41 other leds, 1-bit sound - - The game only uses 1.5KB ROM and seems it doesn't use all the RAM either, - as if it was programmed for MM77L. - - Hold all 4 buttons at boot (not counting RESET) for a led test. - Cassia was Eric White/Ken Cohen's company, later named CXG, known for - their chess computers. - -***************************************************************************/ - -class ftri1_state : public hh_pps41_state -{ -public: - ftri1_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void ftri1(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); -}; - -// handlers - -void ftri1_state::update_display() -{ - m_display->matrix(m_d, bitswap<8>(~m_r, 0,7,6,5,4,3,2,1)); -} - -void ftri1_state::write_d(u16 data) -{ - // DIO0-DIO8: digit/led select - m_d = data; - update_display(); - - // DIO9: speaker out - m_speaker->level_w(BIT(data, 9)); -} - -void ftri1_state::write_r(u16 data) -{ - // RIO1-RIO8: digit/led data - m_r = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( ftri1 ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0c, 0x04, "Game Select" ) - PORT_CONFSETTING( 0x08, "Star Chase" ) - PORT_CONFSETTING( 0x04, "All Star Baseball" ) - PORT_CONFSETTING( 0x00, "Batting Champs" ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Score / S1 H") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Steal / S1 V") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pitch / S2 H") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Swing / S2 V") - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pps41_state, reset_button, 0) PORT_CODE(KEYCODE_F1) PORT_NAME("Game Reset") -INPUT_PORTS_END - -void ftri1_state::ftri1(machine_config &config) -{ - // basic machine hardware - MM78(config, m_maincpu, 300000); // approximation - VC osc. R=68K - m_maincpu->write_d().set(FUNC(ftri1_state::write_d)); - m_maincpu->write_r().set(FUNC(ftri1_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1e0, 0x7f); - config.set_default_layout(layout_ftri1); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ftri1 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "a7859", 0x0000, 0x0800, CRC(3c957f1d) SHA1(42db81a78bbef971a84e61a26d91f7411980d79c) ) -ROM_END - - - - - -/*************************************************************************** - - Invicta Electronic Master Mind - * MM75 MCU (label MM75 A7525-11, die label A7525) - * 9-digit 7seg VFD display (Futaba 9-ST) - - Invicta Super-Sonic Electronic Master Mind - * MM75 MCU (label A7539-12, die label A7539) - * same base hardware, added beeper - - Invicta Plastics is the owner of the Mastermind game rights. The back of the - Master Mind unit says (C) 1977, but this electronic handheld version came - out in 1979. Or maybe there's an older revision. - -***************************************************************************/ - -class mastmind_state : public hh_pps41_state -{ -public: - mastmind_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag), - m_beeper(*this, "beeper") - { } - - void mastmind(machine_config &config); - void smastmind(machine_config &config); - -private: - optional_device m_beeper; - - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void mastmind_state::update_display() -{ - m_display->matrix(m_inp_mux, ~m_r); -} - -void mastmind_state::write_d(u16 data) -{ - // DIO0-DIO7: digit select (DIO7 N/C on mastmind) - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8: beeper on smastmind - if (m_beeper) - m_beeper->set_state(BIT(data, 8)); -} - -void mastmind_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 mastmind_state::read_p() -{ - // PI1-PI4: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( mastmind ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Try") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fail") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test on mastmind? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") -INPUT_PORTS_END - -void mastmind_state::mastmind(machine_config &config) -{ - // basic machine hardware - MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mastmind_state::write_d)); - m_maincpu->write_r().set(FUNC(mastmind_state::write_r)); - m_maincpu->read_p().set(FUNC(mastmind_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_mastmind); - - // no sound! -} - -void mastmind_state::smastmind(machine_config &config) -{ - mastmind(config); - - config.set_default_layout(layout_smastmind); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2400); // approximation - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mastmind ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm75_a7525-11", 0x0000, 0x0200, CRC(39dbdd50) SHA1(72fa5781e9df62d91d57437ded2931fab8253c3c) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) -ROM_END - -ROM_START( smastmind ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a7539-12", 0x0000, 0x0200, CRC(b63c453f) SHA1(f47a540fd90eed7514ed03864be2121f641c1154) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_smastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) -ROM_END - - - - - -/*************************************************************************** - - Kmart Dunk 'n Sunk (manufactured in Hong Kong) - * MM76EL MCU (label GE-E 1V2280, die label B8617) - * 4 7seg leds, 31 other leds, 1-bit sound - - It's by the same Hong Kong company that did Kmart Dr. Dunk/Tandy Electronic - Basketball (PIC16 MCU), Grandstand Pocket Match of the Day (MOS MPS765x MCU) - among others. - - known releases: - - USA(1): Dunk 'n Sunk, published by Kmart - - USA(2): Electronic Basketball / Submarine Warfare, published by U.S. Games - -***************************************************************************/ - -class dunksunk_state : public hh_pps41_state -{ -public: - dunksunk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void dunksunk(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { update_int(); } - DECLARE_INPUT_CHANGED_MEMBER(game_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); -}; - -// handlers - -void dunksunk_state::update_int() -{ - // 2 of the switches are tied to MCU interrupt pins - m_maincpu->set_input_line(0, (m_inputs[1]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(1, (m_inputs[2]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void dunksunk_state::update_display() -{ - m_display->matrix(m_d >> 1, ~m_r); -} - -void dunksunk_state::write_d(u16 data) -{ - // DIO0: speaker out - m_speaker->level_w(data & 1); - - // DIO1-DIO5: led select - // DIO6-DIO9: digit select - m_d = data; - update_display(); -} - -void dunksunk_state::write_r(u16 data) -{ - // RIO1-RIO7: led data - m_r = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( dunksunk ) - PORT_START("IN.0") // PI - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x03, EQUALS, 0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, difficulty_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // INT0 - PORT_CONFSETTING( 0x01, "2" ) // PI4 - PORT_CONFSETTING( 0x03, "3" ) - - PORT_START("IN.2") // INT1 - PORT_CONFNAME( 0x01, 0x01, "Game Select" ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, game_switch, 0) - PORT_CONFSETTING( 0x01, "Basketball" ) - PORT_CONFSETTING( 0x00, "Submarine Chase" ) -INPUT_PORTS_END - -void dunksunk_state::dunksunk(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 390000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(dunksunk_state::write_d)); - m_maincpu->write_r().set(FUNC(dunksunk_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1e0, 0x7f); - m_display->set_bri_levels(0.015, 0.2); // player led is brighter - config.set_default_layout(layout_dunksunk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( dunksunk ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "ge-e_1v2280", 0x0000, 0x0400, CRC(90f17191) SHA1(80c3708af99c9db7afe17254fa4df2080aa9f145) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_dunksunk_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) -ROM_END - - - - - -/*************************************************************************** - - M.E.M. Belgium Memoquiz - * PCB label: MEMOQUIZ MO3 - * MM75 MCU (label M7505 A7505-12, die label A7505) - * 9-digit 7seg VFD display, no sound - - It's a Mastermind game, not as straightforward as Invicta's version. - To start, press the "?" button to generate a new code, then try to guess it, - confirming with the "=" button. CD reveals the answer, PE is for player entry. - - known releases: - - Europe: Memoquiz, published by M.E.M. Belgium - - UK: Memoquiz, published by Polymark - - USA: Mind Boggler (model 2626), published by Mattel - -***************************************************************************/ - -class memoquiz_state : public hh_pps41_state -{ -public: - memoquiz_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void memoquiz(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(digits_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void memoquiz_state::update_int() -{ - // digits switch is tied to MCU interrupt pins - u8 inp = m_inputs[4]->read(); - m_maincpu->set_input_line(0, (inp & 1) ? CLEAR_LINE : ASSERT_LINE); - m_maincpu->set_input_line(1, (inp & 2) ? ASSERT_LINE : CLEAR_LINE); -} - -void memoquiz_state::update_display() -{ - m_display->matrix(m_inp_mux, (m_inp_mux << 2 & 0x80) | (~m_r & 0x7f)); -} - -void memoquiz_state::write_d(u16 data) -{ - // DIO0-DIO7: digit select, DIO5 is also DP segment - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8: N/C, looks like they planned to add sound, but didn't -} - -void memoquiz_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 memoquiz_state::read_p() -{ - // PI1-PI4: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( memoquiz ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("AC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("PE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CD") - - PORT_START("IN.4") - PORT_CONFNAME( 0x03, 0x01, "Digits" ) PORT_CHANGED_MEMBER(DEVICE_SELF, memoquiz_state, digits_switch, 0) - PORT_CONFSETTING( 0x01, "3" ) // INT0, Vdd when closed, pulled to GND when open - PORT_CONFSETTING( 0x02, "4" ) // INT1, GND when closed, pulled to Vdd when open - PORT_CONFSETTING( 0x00, "5" ) -INPUT_PORTS_END - -void memoquiz_state::memoquiz(machine_config &config) -{ - // basic machine hardware - MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(memoquiz_state::write_d)); - m_maincpu->write_r().set(FUNC(memoquiz_state::write_r)); - m_maincpu->read_p().set(FUNC(memoquiz_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_memoquiz); - - // no sound! -} - -// roms - -ROM_START( memoquiz ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "m7505_a7505-12", 0x0000, 0x0200, CRC(47223508) SHA1(97b62e0c453ae2e65d48e039ad65857dae2d4d76) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_memoquiz_output.pla", 0, 314, CRC(a5799b50) SHA1(9b4923b37c9ba8221ecece5a3370c605a880a453) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Football 2 (model 1050) - * PCB label: MATTEL, 1050-4369D - * MM77LA MCU (label B8000-12, die label B8000) - * 7 7seg leds, 30 other leds, 2-bit sound - - Through its production run, it was released as "Football 2" and "Football II". - -***************************************************************************/ - -class mfootb2_state : public hh_pps41_state -{ -public: - mfootb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void mfootb2(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - void write_spk(u8 data); -}; - -// handlers - -void mfootb2_state::update_display() -{ - m_display->matrix(m_d, (m_r << 1 & 0x700) | (m_d >> 4 & 0x80) | (m_r & 0x7f)); -} - -void mfootb2_state::write_d(u16 data) -{ - // DIO0-DIO2, DIO6-DIO9: digit select - // DIO3-DIO5: led select - // DIO10: 4th digit DP - m_d = data; - update_display(); -} - -void mfootb2_state::write_r(u16 data) -{ - // RO01-RO10: led data - m_r = data; - update_display(); -} - -void mfootb2_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -static INPUT_PORTS_START( mfootb2 ) - PORT_START("IN.0") // PI - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // DIO11 - PORT_CONFNAME( 0x400, 0x000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x000, "1" ) // PRO 1 - PORT_CONFSETTING( 0x400, "2" ) // PRO 2 -INPUT_PORTS_END - -void mfootb2_state::mfootb2(machine_config &config) -{ - // basic machine hardware - MM77LA(config, m_maincpu, 380000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mfootb2_state::write_d)); - m_maincpu->read_d().set_ioport("IN.1"); - m_maincpu->write_r().set(FUNC(mfootb2_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - m_maincpu->write_spk().set(FUNC(mfootb2_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 11); - m_display->set_segmask(0x3c7, 0x7f); - m_display->set_segmask(0x002, 0xff); // only one digit has DP - m_display->set_bri_levels(0.015, 0.2); // ball led is brighter - config.set_default_layout(layout_mfootb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( mfootb2 ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b8000-12", 0x0000, 0x0600, CRC(5b65fc38) SHA1(4fafc9deb5609b16f09b18b7346ea96ffe8bf9e0) ) - - ROM_REGION( 317, "maincpu:opla", 0 ) - ROM_LOAD( "mm77la_mfootb2_output.pla", 0, 317, CRC(11c0bbfa) SHA1(939a0a6adeace8ca0f9e17290306a2e7ced21db3) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Brain Baffler (model 1080) - * PCB label: OLYMPOS KOREA, CM04-D102-001 REV D - * MM78LA MCU (label MM95 B9000-12, die label B9000) - * 8-digit 14seg LED display, 2-bit sound - - It includes 8 word games, most of them are meant for 2 players. - -***************************************************************************/ - -class brainbaf_state : public hh_pps41_state -{ -public: - brainbaf_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void brainbaf(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); - void write_spk(u8 data); -}; - -// handlers - -void brainbaf_state::update_display() -{ - m_display->matrix(m_inp_mux, bitswap<14>(m_r, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); -} - -void brainbaf_state::write_d(u16 data) -{ - // DIO0-DIO9: input mux - // DIO0-DIO7: digit select - m_inp_mux = data; - update_display(); -} - -void brainbaf_state::write_r(u16 data) -{ - // RO01-RO14: digit segment data - m_r = data; - update_display(); -} - -u8 brainbaf_state::read_p() -{ - // PI5-PI8: multiplexed inputs - return read_inputs(10) << 4; -} - -void brainbaf_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -static INPUT_PORTS_START( brainbaf ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J-0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_NAME("Player / Bonus R") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Player / Bonus L") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Game") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C-3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_NAME("Go") - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D-4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Entry") - - PORT_START("IN.5") // DIO5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E-5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - - PORT_START("IN.6") // DIO6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_NAME("Refresh") - - PORT_START("IN.7") // DIO7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G-7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_NAME("Buy") - - PORT_START("IN.8") // DIO8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H-8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_NAME("Give-Up") - - PORT_START("IN.9") // DIO9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I-9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CODE(KEYCODE_F11) PORT_NAME("Stop") // both STOP keys - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_NAME("Score") -INPUT_PORTS_END - -void brainbaf_state::brainbaf(machine_config &config) -{ - // basic machine hardware - MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K - m_maincpu->write_d().set(FUNC(brainbaf_state::write_d)); - m_maincpu->write_r().set(FUNC(brainbaf_state::write_r)); - m_maincpu->read_p().set(FUNC(brainbaf_state::read_p)); - m_maincpu->write_spk().set(FUNC(brainbaf_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_brainbaf); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( brainbaf ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm95_b9000-12", 0x0000, 0x0800, CRC(f7a4829c) SHA1(12f789d8264a969777764d31ea67067cc330a73c) ) - - ROM_REGION( 605, "maincpu:opla", 0 ) - ROM_LOAD( "mm78la_brainbaf_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Horoscope Computer (model 1081) - * PCB label: DET. CM05-D102-001 REV D - * MM78LA MCU (label MM95 B9001-13, die label B9001) - * 8-digit 14seg LED display, 2-bit sound - - This is not a toy, but a fortune forecast. Date format is mm-dd-yy, it is - valid only from June 1 1979 until December 31 1987 - -***************************************************************************/ - -class horocomp_state : public hh_pps41_state -{ -public: - horocomp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void horocomp(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); - void write_spk(u8 data); -}; - -// handlers - -void horocomp_state::update_display() -{ - // 14seg display is upside-down - u16 flip = m_r << 7 | m_r >> 7; - m_display->matrix(m_inp_mux, bitswap<14>(flip, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); -} - -void horocomp_state::write_d(u16 data) -{ - // DIO0-DIO9: input mux - // DIO0-DIO7: digit select - m_inp_mux = data; - update_display(); -} - -void horocomp_state::write_r(u16 data) -{ - // RO01-RO14: digit segment data - m_r = data; - update_display(); -} - -u8 horocomp_state::read_p() -{ - // PI4: mode switch - // PI5-PI8: multiplexed inputs - return read_inputs(10) << 4 | (m_inputs[10]->read() & 8); -} - -void horocomp_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -/* physical button layout and labels are like this: - - CAP. - AQU. [ ] SAG. - [ ] 9 [ ] - PIS. 8 SCO. - [ ] 7[ ] - -ARI.[ ]0 6[ ]LIB. - - [ ]1 5[ ] [ ] [ ] [ ] [ ] - TAU. 2 4 VIR. LOVE CAREER TRAVEL MONEY - [ ] 3 [ ] - GEM. [ ] LEO [ ] [ ] [ ] [ ] - CAN. FRIENDS SPIRIT FAMILY CREATIVE -*/ - -static INPUT_PORTS_START( horocomp ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Love") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Friends") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Aries") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Career") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Spirit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Taurus") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Travel") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Family") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Gemini") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Money") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Creative") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Cancer") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Leo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Aquarius / Reset") - - PORT_START("IN.5") // DIO5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Virgo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Pisces") - - PORT_START("IN.6") // DIO6 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Libra") - - PORT_START("IN.7") // DIO7 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Scorpio") - - PORT_START("IN.8") // DIO8 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Sagittarius") - - PORT_START("IN.9") // DIO9 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Capricorn") - - PORT_START("IN.10") // PI4 - PORT_CONFNAME( 0x08, 0x00, "Mode" ) - PORT_CONFSETTING( 0x08, "C" ) // compatibility - PORT_CONFSETTING( 0x00, "P" ) // personal -INPUT_PORTS_END - -void horocomp_state::horocomp(machine_config &config) -{ - // basic machine hardware - MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K - m_maincpu->write_d().set(FUNC(horocomp_state::write_d)); - m_maincpu->write_r().set(FUNC(horocomp_state::write_r)); - m_maincpu->read_p().set(FUNC(horocomp_state::read_p)); - m_maincpu->write_spk().set(FUNC(horocomp_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_horocomp); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( horocomp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm95_b9001-13", 0x0000, 0x0800, CRC(d284a837) SHA1(02092db2a29b4bb7e9f86286601b67b2e9556476) ) - - ROM_REGION( 605, "maincpu:opla", 0 ) - ROM_LOAD( "mm78la_horocomp_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel World Championship Football (model 3202) - * MM78 MCU (MM78L pinout) (label MM78 A78C6-12, die label A78C6) - * MM78 MCU (MM78L pinout) (label MM78 A78C7-12, die label A78C7) - * 8-digit 7seg VFD, cyan/red/green VFD Itron CP5023, 1-bit sound - - It was patented under US4422639. Like the Baseball counterpart (mwcbaseb in - hh_hmcs40.cpp), this handheld is a complex game. - -***************************************************************************/ - -class mwcfootb_state : public hh_pps41_state -{ -public: - mwcfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag), - m_subcpu(*this, "subcpu") - { } - - void mwcfootb(machine_config &config); - -private: - required_device m_subcpu; - - void update_display(); - - void main_write_d(u16 data); - u16 main_read_d(); - void main_write_r(u16 data); - u8 main_read_p(); - - void sub_write_d(u16 data); - void sub_write_r(u16 data); -}; - -// handlers - -void mwcfootb_state::update_display() -{ - m_display->matrix(m_grid, bitswap<19>(m_plate, 19,18,17,16, 11,10,9,8,15,14,13,12, 2,3,1,0,6,5,4)); -} - -// maincpu side - -void mwcfootb_state::main_write_d(u16 data) -{ - // DIO0-DIO7: vfd grid - // DIO0-DIO2: input mux - m_grid = m_inp_mux = data; - update_display(); - - // DIO8: subcpu INT0 - m_subcpu->set_input_line(0, (data & 0x100) ? ASSERT_LINE : CLEAR_LINE); -} - -u16 mwcfootb_state::main_read_d() -{ - // DIO9: subcpu DIO9 - return m_subcpu->d_output_r() & 0x200; -} - -void mwcfootb_state::main_write_r(u16 data) -{ - // RIO1-RIO7: vfd plate 0-6 - m_plate = (m_plate & 0xfff00) | (~data & 0x7f); - update_display(); - - // RIO8: speaker out - m_speaker->level_w(BIT(~data, 7)); -} - -u8 mwcfootb_state::main_read_p() -{ - // PI1-PI8: multiplexed inputs - return ~read_inputs(3); -} - -// subcpu side - -void mwcfootb_state::sub_write_d(u16 data) -{ - // DIO0-DIO3: vfd plate 15-18 - m_plate = (m_plate & 0x0ffff) | (data << 16 & 0xf0000); - update_display(); - - // DIO9: maincpu INT0 (+DIO9) - m_maincpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); -} - -void mwcfootb_state::sub_write_r(u16 data) -{ - // RIO1-RIO8: vfd plate 7-14 - m_plate = (m_plate & 0xf00ff) | (~data << 8 & 0xff00); - update_display(); -} - -// config - -/* physical button layout and labels are like this: - - (home team side) (visitor team side) - [1] RECEIVERS [2] [1] RECEIVERS [2] - - [1] [1] - [4] [PAUSE] [2] [4] [PAUSE] [2] - [3] [3] - DOWN QUARTER - [ENTER] YDS. TO GO TIME LEFT POSITION SCORE [ENTER] - [KICK] [TIME] [ ] [ ] [ ] [ ] [TIME] [KICK] - - [^] [^] - [<] [P/C] [>] [<] [P/C] [>] - [v] [v] -*/ - -static INPUT_PORTS_START( mwcfootb ) // P1 = left/home, P2 = right/visitor - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("Position") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 P/C/Pause") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Quarter Time Left") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Down / Yards To Go") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Kick") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 P/C/Pause") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Time") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Enter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Time") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Enter") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 1") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Left/4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Right/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Down/3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Up/1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Left/4") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Right/2") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Down/3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Up/1") -INPUT_PORTS_END - -void mwcfootb_state::mwcfootb(machine_config &config) -{ - // basic machine hardware - MM78(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mwcfootb_state::main_write_d)); - m_maincpu->read_d().set(FUNC(mwcfootb_state::main_read_d)); - m_maincpu->write_r().set(FUNC(mwcfootb_state::main_write_r)); - m_maincpu->read_p().set(FUNC(mwcfootb_state::main_read_p)); - m_maincpu->read_sdi().set(m_subcpu, FUNC(pps41_base_device::sdo_r)); - m_maincpu->write_ssc().set(m_subcpu, FUNC(pps41_base_device::ssc_w)); - - MM78(config, m_subcpu, 360000); // osc. from maincpu - m_subcpu->write_d().set(FUNC(mwcfootb_state::sub_write_d)); - m_subcpu->write_r().set(FUNC(mwcfootb_state::sub_write_r)); - m_subcpu->read_sdi().set(m_maincpu, FUNC(pps41_base_device::sdo_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 571); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - m_display->set_segmask(0x7f, 0x7f); - config.set_default_layout(layout_mwcfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mwcfootb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm78_a78c6-12", 0x0000, 0x0800, CRC(91cf0d9b) SHA1(8d778b441eb26fcff50e8532c142f368c0dd5818) ) - - ROM_REGION( 0x0800, "subcpu", 0 ) - ROM_LOAD( "mm78_a78c7-12", 0x0000, 0x0800, CRC(b991d06e) SHA1(1f801b5cd7214f7378ae3f19799b84a9dc5bba4e) ) - - ROM_REGION( 248486, "screen", 0) - ROM_LOAD( "mwcfootb.svg", 0, 248486, CRC(03d17b85) SHA1(c877316c0c7923432235655d810fea8d714a4b31) ) -ROM_END - - - - - -/*************************************************************************** - - Selchow & Righter Scrabble Sensor - * MM76EL MCU (label B8610-11, die label B8610) - * 16 leds, 1-bit sound - - The game concept is similar to Mastermind. Enter a word (or press AUTO.) - to start the game, then try to guess it. - -***************************************************************************/ - -class scrabsen_state : public hh_pps41_state -{ -public: - scrabsen_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void scrabsen(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void scrabsen_state::update_int() -{ - // players switch is tied to MCU INT0 - m_maincpu->set_input_line(0, (m_inputs[5]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void scrabsen_state::update_display() -{ - m_display->matrix(m_inp_mux >> 6 & 3, ~m_r); -} - -void scrabsen_state::write_d(u16 data) -{ - // DIO0-DIO4: input mux - // DIO6,DIO7: led select - m_inp_mux = data; - update_display(); - - // DIO8: speaker out - m_speaker->level_w(BIT(data, 8)); -} - -void scrabsen_state::write_r(u16 data) -{ - // RIO1-RIO8: led data - m_r = data; - update_display(); -} - -u8 scrabsen_state::read_p() -{ - // PI1-PI7: multiplexed inputs - return ~read_inputs(5); -} - -// config - -static INPUT_PORTS_START( scrabsen ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("Space") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME("Auto.") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - - PORT_START("IN.5") // INT0 - PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, scrabsen_state, players_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) // single - PORT_CONFSETTING( 0x00, "2" ) // double -INPUT_PORTS_END - -void scrabsen_state::scrabsen(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 380000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(scrabsen_state::write_d)); - m_maincpu->write_r().set(FUNC(scrabsen_state::write_r)); - m_maincpu->read_p().set(FUNC(scrabsen_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 8); - config.set_default_layout(layout_scrabsen); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( scrabsen ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "b8610-11", 0x0000, 0x0400, CRC(97c8a466) SHA1(ed5d2cddd2761ed6e3ddc47d97b2ed19a2aaeee9) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) // unused - ROM_LOAD( "mm76_scrabsen_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) -ROM_END - - - - - -/*************************************************************************** - - Selchow & Righter Reader's Digest Q&A - * MM76EL MCU (label MM76EL B8654-11, die label B8654) - * 9-digit 7seg LED display(4 unused), 2-bit sound - - The game requires question books. The player inputs a 3-digit code and - answers 20 multiple-choice questions from the page. - -***************************************************************************/ - -class rdqa_state : public hh_pps41_state -{ -public: - rdqa_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void rdqa(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void rdqa_state::update_int() -{ - // players switch is tied to MCU INT0 - m_maincpu->set_input_line(0, (m_inputs[4]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void rdqa_state::update_display() -{ - m_display->matrix(m_inp_mux, ~m_r); -} - -void rdqa_state::write_d(u16 data) -{ - // DIO0-DIO4: digit select - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8,DIO9: speaker out - m_speaker->level_w(data >> 8 & 3); -} - -void rdqa_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 rdqa_state::read_p() -{ - // PI1-PI5: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( rdqa ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.4") // INT0 - PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rdqa_state, players_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) // single - PORT_CONFSETTING( 0x00, "2" ) // double -INPUT_PORTS_END - -void rdqa_state::rdqa(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 400000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(rdqa_state::write_d)); - m_maincpu->write_r().set(FUNC(rdqa_state::write_r)); - m_maincpu->read_p().set(FUNC(rdqa_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 7); - m_display->set_segmask(0x1f, 0x7f); - config.set_default_layout(layout_rdqa); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( rdqa ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mm76el_b8654-11", 0x0000, 0x0400, CRC(95c00eee) SHA1(1537626df03a7131d83a555e557a4528e093a22a) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_rdqa_output.pla", 0, 314, CRC(e024b2d3) SHA1(fc3121e70f22151cf8f3411f9fcbac88002ae330) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -CONS( 1979, smastmind, 0, 0, smastmind, mastmind, mastmind_state, empty_init, "Invicta", "Super-Sonic Electronic Master Mind", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, dunksunk, 0, 0, dunksunk, dunksunk, dunksunk_state, empty_init, "Kmart", "Dunk 'n Sunk", MACHINE_SUPPORTS_SAVE ) - -CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, mfootb2, 0, 0, mfootb2, mfootb2, mfootb2_state, empty_init, "Mattel Electronics", "Football 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, brainbaf, 0, 0, brainbaf, brainbaf, brainbaf_state, empty_init, "Mattel Electronics", "Brain Baffler", MACHINE_SUPPORTS_SAVE ) -COMP( 1979, horocomp, 0, 0, horocomp, horocomp, horocomp_state, empty_init, "Mattel Electronics", "Horoscope Computer", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel Electronics", "World Championship Football", MACHINE_SUPPORTS_SAVE ) - -CONS( 1978, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, rdqa, 0, 0, rdqa, rdqa, rdqa_state, empty_init, "Selchow & Righter", "Reader's Digest Q&A - Computer Question & Answer Game", MACHINE_SUPPORTS_SAVE ) // *** - -// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_rw5000.cpp b/src/mame/handheld/hh_rw5000.cpp deleted file mode 100644 index 0424ccad720..00000000000 --- a/src/mame/handheld/hh_rw5000.cpp +++ /dev/null @@ -1,1109 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -Rockwell A/B5000 MCU series handhelds (before PPS-4/1) -Mostly calculators on these MCUs, but also Mattel's first couple of handhelds. - -ROM source notes when dumped from another model, but confident it's the same: -- rw18r: Rockwell 8R -- rw24k: Rockwell 14RD-II -- misatk: Mattel Space Alert - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/rw5000/a5000.h" -#include "cpu/rw5000/a5500.h" -#include "cpu/rw5000/a5900.h" -#include "cpu/rw5000/b5000.h" -#include "cpu/rw5000/b5500.h" -#include "cpu/rw5000/b6000.h" -#include "cpu/rw5000/b6100.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "autorace.lh" -#include "gravity.lh" -#include "mbaseb.lh" -#include "mfootb.lh" -#include "misatk.lh" -#include "rw10r.lh" -#include "rw24k.lh" -#include "rw30r.lh" - -//#include "hh_rw5000_test.lh" // common test-layout - use external artwork - - -class hh_rw5000_state : public driver_device -{ -public: - hh_rw5000_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(power_button); - template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } - template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<9> m_inputs; // max 9 - - u16 m_inp_mux = 0; - - // MCU output pin state - u16 m_str = 0; - u16 m_seg = 0; - - u8 read_inputs(int columns); - void switch_change(int sel, u32 mask, bool next); -}; - - -// machine start/reset - -void hh_rw5000_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_str)); - save_item(NAME(m_seg)); -} - -void hh_rw5000_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_rw5000_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -void hh_rw5000_state::switch_change(int sel, u32 mask, bool next) -{ - // config switches (for direct control) - ioport_field *inp = m_inputs[sel]->field(mask); - - if (next && inp->has_next_setting()) - inp->select_next_setting(); - else if (!next && inp->has_previous_setting()) - inp->select_previous_setting(); -} - -INPUT_CHANGED_MEMBER(hh_rw5000_state::power_button) -{ - // power button or switch - bool power = (param) ? (bool(param - 1)) : !newval; - - if (!power && m_display != nullptr) - m_display->clear(); - m_maincpu->set_input_line(INPUT_LINE_RESET, power ? CLEAR_LINE : ASSERT_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Mattel Auto Race (model 9879) - * B6000 MCU (label B6000CA, die label B6000-B) - * 2-digit 7seg display, 21 other leds, 1-bit sound - - This is Mattel's first electronic handheld game, also the first CPU-based - handheld game overall. Hardware design (even the MCU) and programming - was done at Rockwell. - - A European version was released as "Ski Slalom", except it's upside-down. - -***************************************************************************/ - -class autorace_state : public hh_rw5000_state -{ -public: - autorace_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void autorace(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void autorace_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void autorace_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( autorace ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " - PORT_CONFNAME( 0x0c, 0x0c, "Gear" ) - PORT_CONFSETTING( 0x0c, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x00, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("POWER") // power switch - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Start / Reset") - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_prev<0>, 0x0c) PORT_NAME("Gear Switch Down") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_next<0>, 0x0c) PORT_NAME("Gear Switch Up") -INPUT_PORTS_END - -void autorace_state::autorace(machine_config &config) -{ - // basic machine hardware - B6000(config, m_maincpu, 160000); // approximation - m_maincpu->write_str().set(FUNC(autorace_state::write_str)); - m_maincpu->write_seg().set(FUNC(autorace_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.02, 0.2); // player led is brighter - config.set_default_layout(layout_autorace); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( autorace ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "b6000ca", 0x000, 0x200, CRC(a112c928) SHA1(aa5d0b46a08e2460081d4148cf254dc5ec53817e) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Missile Attack (model 2048) / Space Alert (model 2448) - * B6000 MCU (label B6001CA/EA, die label B6001) - * 2-digit 7seg display, 21 other leds, 1-bit sound - - The initial release was called Missile Attack, it didn't sell well (Mattel - blamed it on NBC for refusing to air their commercial). They changed the - title/setting and rereleased it as "Space Alert" (aka "Battlestar Galactica: - Space Alert"). In 1980, they advertised another rerelease, this time as - "Flash Gordon", but that didn't come out. - -***************************************************************************/ - -class misatk_state : public hh_rw5000_state -{ -public: - misatk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void misatk(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void misatk_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void misatk_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( misatk ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("POWER") // power switch - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Arm / Off") -INPUT_PORTS_END - -void misatk_state::misatk(machine_config &config) -{ - // basic machine hardware - B6000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(misatk_state::write_str)); - m_maincpu->write_seg().set(FUNC(misatk_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.015, 0.15); // player led is brighter - config.set_default_layout(layout_misatk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( misatk ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "b6001ea", 0x000, 0x200, CRC(56564b79) SHA1(6f33f57ea312cb2018fb59f72eaff3a9642e74a2) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Football (model 2024) - * B6100 MCU (label B6100EB/-15, die label B6100 A) - * 7-digit 7seg display, 27 other leds, 1-bit sound - - When Football II came out, they renamed this one to Football I. - -***************************************************************************/ - -class mfootb_state : public hh_rw5000_state -{ -public: - mfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void mfootb(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(score_button) { update_display(); } - -private: - void update_display(); - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void mfootb_state::update_display() -{ - // 4th digit DP is from the SCORE button - u8 dp = (m_inputs[1]->read() & 2) ? 0x80 : 0; - m_display->matrix(m_str, (m_seg << 1 & 0x700) | dp | (m_seg & 0x7f)); -} - -void mfootb_state::write_str(u16 data) -{ - m_str = data; - update_display(); -} - -void mfootb_state::write_seg(u16 data) -{ - m_seg = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( mfootb ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // PRO 1 - PORT_CONFSETTING( 0x00, "2" ) // PRO 2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") PORT_CHANGED_MEMBER(DEVICE_SELF, mfootb_state, score_button, 0) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void mfootb_state::mfootb(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 280000); // approximation - m_maincpu->write_str().set(FUNC(mfootb_state::write_str)); - m_maincpu->write_seg().set(FUNC(mfootb_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x7f, 0x7f); - m_display->set_segmask(0x08, 0xff); // only one digit has DP - m_display->set_bri_levels(0.02, 0.2); // player led is brighter - config.set_default_layout(layout_mfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mfootb ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6100eb", 0x000, 0x300, CRC(5b27620f) SHA1(667ff6cabced89ef4ad848b73d66a06526edc5e6) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Baseball (model 2942) - * B6100 MCU (label B6101-12, die label B6101 A) - * 4-digit 7seg display, 28 other leds, 1-bit sound - -***************************************************************************/ - -class mbaseb_state : public hh_rw5000_state -{ -public: - mbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void mbaseb(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void mbaseb_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void mbaseb_state::write_seg(u16 data) -{ - m_display->write_mx(bitswap<10>(data,7,8,9,6,5,4,3,2,1,0)); -} - -// config - -static INPUT_PORTS_START( mbaseb ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pitch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // PRO 1 - PORT_CONFSETTING( 0x00, "2" ) // PRO 2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Run") - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void mbaseb_state::mbaseb(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 280000); // approximation - m_maincpu->write_str().set(FUNC(mbaseb_state::write_str)); - m_maincpu->write_seg().set(FUNC(mbaseb_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 10); - m_display->set_segmask(0x170, 0x7f); - m_display->set_segmask(0x110, 0xff); // 2 digits have DP - config.set_default_layout(layout_mbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mbaseb ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6101-12", 0x000, 0x300, CRC(7720ddcc) SHA1(cd43126db7c6262f659f325aa58420e1a8a1a659) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Gravity (model 8291) - * B6100 MCU (label B6102-11, die label B6102 A) - * 3-digit 7seg display, 27 other leds, 1-bit sound - - It was advertised as "Catastrophe", but went unreleased. It got sold later - as "Gravity", with a less catastrophic setting. - - The game is basically 3 mini games in 1: - - Juggling (Rumbling Rocks in Catastrophe) - - Coin Drop (Quake Shock in Catastrophe) - - Docking (Meteorite Shower in Catstrophe) - -***************************************************************************/ - -class gravity_state : public hh_rw5000_state -{ -public: - gravity_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void gravity(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void gravity_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void gravity_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( gravity ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void gravity_state::gravity(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(gravity_state::write_str)); - m_maincpu->write_seg().set(FUNC(gravity_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 10); - m_display->set_segmask(0x1c0, 0x7f); - config.set_default_layout(layout_gravity); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gravity ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6102-11", 0x000, 0x300, CRC(532f332e) SHA1(593224d3a2a5b6022f0d73b6e6fb9093d2d54f68) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 10R - * A5000 MCU (label A5000PA, die label A5000) - * 8-digit 7seg LED display - - Rockwell 12R "Square Root" - * A5000 MCU (label A5001, die label A5001) - * rest is same as 10R - - 12R supports square root by pressing × after ÷ (or the other way around). - -***************************************************************************/ - -class rw10r_state : public hh_rw5000_state -{ -public: - rw10r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw10r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw10r_state::write_str(u16 data) -{ - // STR0-STR7: digit select - // STR4-STR7: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw10r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw10r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( rw10r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") -INPUT_PORTS_END - -void rw10r_state::rw10r(machine_config &config) -{ - // basic machine hardware - A5000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw10r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw10r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw10r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_rw10r); -} - -// roms - -ROM_START( rw10r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5000pa", 0x000, 0x0c0, CRC(db6cbbea) SHA1(3757f303a84e412e8763c4ec2170c9badc172454) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - -ROM_START( rw12r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5001", 0x000, 0x0c0, CRC(4337a46b) SHA1(70f4683eac0afa31a6cd9dd44fdf1b6680575f67) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 8R "Automatic Percent", Rockwell 18R "Memory" - * B5000 MCU (label B5000CC, die label B5000) - * 8-digit 7seg LED display - - This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by - Tandy (Radio Shack) as EC-220. - - 8R/9TR doesn't have the memory store/recall buttons. - -***************************************************************************/ - -class rw18r_state : public hh_rw5000_state -{ -public: - rw18r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw18r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw18r_state::write_str(u16 data) -{ - // STR0-STR7: digit select - // STR4-STR8: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw18r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw18r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( rw18r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.4") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("STO") // unpopulated on 8R - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("RCL") // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void rw18r_state::rw18r(machine_config &config) -{ - // basic machine hardware - B5000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw18r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw18r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw18r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_rw10r); -} - -// roms - -ROM_START( rw18r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b5000cc", 0x000, 0x0c0, CRC(ace32614) SHA1(23cf11acf2e73ce2dfc165cb87f86fab15f69ff7) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 30R "Slide Rule Memory" - * B5500 MCU (label B5500PA, die label B5500) - * 9-digit 7seg LED display - - Rockwell 31R "Slide Rule Memory" - * A5500 MCU (label A5502PA, die label A5500) - * rest is same as 30R - - 30R and 31R have the exact same functionality, even though they are on - different MCUs. There's also a 30R version on an A4600 MCU. - -***************************************************************************/ - -class rw30r_state : public hh_rw5000_state -{ -public: - rw30r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw30r(machine_config &config); - void rw31r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw30r_state::write_str(u16 data) -{ - // STR0-STR8: digit select - // STR4-STR8: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw30r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw30r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( rw30r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(". / +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F / CF") // function - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / M+") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / M-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / x" UTF8_POW_2) - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / 1/x") - - PORT_START("IN.4") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("C / MC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("X\xe2\x86\x94Y / X\xe2\x86\x94M") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% / " UTF8_SQUAREROOT "x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / MR") -INPUT_PORTS_END - -void rw30r_state::rw30r(machine_config &config) -{ - // basic machine hardware - B5500(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_rw30r); -} - -void rw30r_state::rw31r(machine_config &config) -{ - rw30r(config); - - // basic machine hardware - A5500(config.replace(), m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); -} - -// roms - -ROM_START( rw30r ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b5500pa", 0x000, 0x280, CRC(937dd695) SHA1(bc286209943f49e9acccbf319b87c6ec24386894) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - -ROM_START( rw31r ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5502pa", 0x000, 0x280, CRC(6ee0b30a) SHA1(42e5d1e29bdef4b4faaafee3592cacc0e66b982f) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 24K aka "the 24K" (see below for more) - * A5900 MCU (label A5901CA/A5903CB, die label A59__) - * 9-digit 7seg VFD - - This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and - probably also in 14RD, 24RD, 22K. - - 14RD has 6 less buttons than 24RD, the non-II versions have LED(s) instead - of a 9th digit for minus sign and memory status. 24K has an extra button - for register exchange. The difference between 24K and 24K II is unknown. - -***************************************************************************/ - -class rw24k_state : public hh_rw5000_state -{ -public: - rw24k_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw24k(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw24k_state::write_str(u16 data) -{ - // STR0-STR8: digit select, input mux - m_display->write_my(data); - m_inp_mux = data; -} - -void rw24k_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw24k_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(9); -} - -// config - -static INPUT_PORTS_START( rw24k ) - PORT_START("IN.0") // STR0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // unpopulated on 14RD - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("M+") // " - - PORT_START("IN.1") // STR1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M-") // " - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // STR2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // STR3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("MC") // " - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("MR") // " - - PORT_START("IN.4") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.5") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.6") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.7") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.8") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("\xe2\x86\x94") // register exchange - unpopulated on 14RD/24RD - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void rw24k_state::rw24k(machine_config &config) -{ - // basic machine hardware - A5900(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw24k_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw24k_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw24k_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_rw24k); -} - -// roms - -ROM_START( rw24k ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "a5901ca", 0x000, 0x200, CRC(00de7764) SHA1(0f24add4b6d2660aad63ddd4d0003d59a0e39df6) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1976, autorace, 0, 0, autorace, autorace, autorace_state, empty_init, "Mattel Electronics", "Auto Race", MACHINE_SUPPORTS_SAVE ) -CONS( 1977, misatk, 0, 0, misatk, misatk, misatk_state, empty_init, "Mattel Electronics", "Missile Attack / Space Alert", MACHINE_SUPPORTS_SAVE ) -CONS( 1977, mfootb, 0, 0, mfootb, mfootb, mfootb_state, empty_init, "Mattel Electronics", "Football (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mbaseb, 0, 0, mbaseb, mbaseb, mbaseb_state, empty_init, "Mattel Electronics", "Baseball (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gravity, 0, 0, gravity, gravity, gravity_state, empty_init, "Mattel Electronics", "Gravity (Mattel)", MACHINE_SUPPORTS_SAVE ) - -COMP( 1974, rw10r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "10R (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw12r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "12R: Square Root", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw18r, 0, 0, rw18r, rw18r, rw18r_state, empty_init, "Rockwell", "18R: Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1974, rw30r, 0, 0, rw30r, rw30r, rw30r_state, empty_init, "Rockwell", "30R: Slide Rule Memory (B5500 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw31r, rw30r, 0, rw31r, rw30r, rw30r_state, empty_init, "Rockwell", "31R: Slide Rule Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, rw24k, 0, 0, rw24k, rw24k, rw24k_state, empty_init, "Rockwell", "24K (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/handheld/hh_sm510.cpp b/src/mame/handheld/hh_sm510.cpp deleted file mode 100644 index 298bbdec48d..00000000000 --- a/src/mame/handheld/hh_sm510.cpp +++ /dev/null @@ -1,10093 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Henrik Algestam -// thanks-to:Sean Riddle, Igor, Lee Robson, Milan Galcik -/*************************************************************************** - -Sharp SM5xx family handhelds. -List of child drivers: -- rzone: Tiger R-Zone - -The LCD screen graphics are provided internally with an SVG file. -MAME external artwork is recommended for the backgrounds inlays. - -Most of these LCD games are meant to stay powered on 24/7. There is no -RTC or NVRAM. Quitting MAME is akin to removing the handheld's battery. -Use -autosave to at least make them remember the highscores. - -TODO: -- improve display decay simulation? but SVG doesn't support setting brightness - per segment, adding pwm_display_device right now has no added value -- add nstarfox sound effect chip emulation -- add svg screen for nsmb3, nsmw -- confirm gnw_bfight rom (assumed to be the same as gnw_bfightn) -- confirm gnw_climber rom (assumed to be the same as gnw_climbern) -- confirm gnw_smb rom (assumed to be the same as gnw_smbn) -- Currently there is no accurate way to dump the SM511/SM512 melody ROM - electronically. For the ones that weren't decapped, they were read by - playing back all melody data and reconstructing it to ROM. Visual(decap) - verification is wanted for: bassmate, gnw_bfightn, gnw_bjack, gnw_bsweep, - gnw_climbern, gnw_dkcirc, gnw_dkhockey, gnw_dkjrp, gnw_dkong3, gnw_gcliff, - gnw_mariocmt, gnw_mariocmta, gnw_mariotj, gnw_mbaway, gnw_mmousep, - gnw_pinball, gnw_popeyep, gnw_sbuster, gnw_snoopyp, gnw_zelda - -**************************************************************************** - -Misc Nintendo Game & Watch notes: - -Trivia: Most of the Nintendo G&W have built-in cheats, likely kept in by -Nintendo to test the game. These were not accessible to users of course, -but for the sake of fun they're available on MAME. - -BTANB: On some of the earlier G&W games, eg. gnw_fire, gnw_mmouse, gnw_pchute, -gnw_popeye, the controls still work after game over, this happens on the real -thing too. - -Game list (* denotes not emulated yet) - -Serial Series MCU Title ---------------------------------------------- -AC-01 s SM5A Ball (aka Toss-Up) -FL-02 s SM5A Flagman (aka Flag Man) -MT-03 s SM5A Vermin (aka The Exterminator) -RC-04 s SM5A Fire (aka Fireman Fireman) -IP-05 s SM5A Judge -MH-06 g SM5A Manhole -CN-07 g SM5A Helmet (aka Headache) -LN-08 g SM5A Lion -PR-21 ws SM5A Parachute -OC-22 ws SM5A Octopus -PP-23 ws SM5A Popeye -FP-24 ws SM5A Chef -MC-25 ws SM5A Mickey Mouse -EG-26 ws SM5A Egg (same ROM as MC-25, but LCD differs) -FR-27 ws SM5A Fire -TL-28 ws SM510 Turtle Bridge -ID-29 ws SM510 Fire Attack -SP-30 ws SM510 Snoopy Tennis -OP-51 ms SM510 Oil Panic -DK-52 ms SM510 Donkey Kong -DM-53 ms SM510 Mickey & Donald -GH-54 ms SM510 Green House -JR-55 ms SM510 Donkey Kong II -MW-56 ms SM510 Mario Bros. -LP-57 ms SM510 Rain Shower -TC-58 ms SM510 Life Boat -PB-59 ms SM511 Pinball -BJ-60 ms SM512 Black Jack -MG-61 ms SM510 Squish -BD-62 ms SM512 Bomb Sweeper -JB-63 ms SM511 Safe Buster -MV-64 ms SM512 Gold Cliff -ZL-65 ms SM512 Zelda -CJ-71* tt SM511? Donkey Kong Jr. -CM-72 tt SM511 Mario's Cement Factory -SM-73* tt SM511? Snoopy -PG-74* tt SM511? Popeye -SM-91 p SM511 Snoopy (assume same ROM & LCD as tabletop version) -PG-92 p SM511 Popeye " -CJ-93 p SM511 Donkey Kong Jr. " -TB-94 p SM511 Mario's Bombs Away -DC-95 p SM511 Mickey Mouse -MK-96 p SM511 Donkey Kong Circus (same ROM as DC-95, LCD is different) -DJ-101 nws SM510 Donkey Kong Jr. -ML-102 nws SM510 Mario's Cement Factory -NH-103 nws SM510 Manhole -TF-104 nws SM510 Tropical Fish -YM-105 nws SM511 Super Mario Bros. -DR-106 nws SM511 Climber -BF-107 nws SM511 Balloon Fight -MB-108 nws SM511 Mario The Juggler -BU-201 sc SM510 Spitball Sparky -UD-202 sc SM510 Crab Grab -BX-301 mvs SM511 Boxing (aka Punch Out) -AK-302 mvs SM511 Donkey Kong 3 -HK-303 mvs SM511 Donkey Kong Hockey -YM-801 cs SM511 Super Mario Bros. (assume same ROM as nws version) -DR-802 cs SM511 Climber " -BF-803 cs SM511 Balloon Fight " -YM-901-S* x SM511 Super Mario Bros. " - -RGW-001 (2010 Ball remake) is on different hardware, ATmega169PV MCU. -The "Mini Classics" keychains are by Stadlbauer, not Nintendo. -The "Game Watch" wristwatches are by Nelsonic, not Nintendo. - -Bassmate Computer (BM-501) is on identical hardware as G&W Multi Screen, -but it's not part of the game series. - -**************************************************************************** - -Regarding Электроника (Elektronika, translated: Electronics): It is not -actually a company. It was a USSR brand name for consumer electronics, -produced by factories belonging to the Ministry of Electronic Industry -(Minelektronprom, МЭП). - -The LCD games were produced by: Angstrem, Mikron, Voschod (Russia), Billur -(Azerbaijan), Kamerton, Evistor (Belarus), Severodonetsk Instrument-Making -Plant (Ukraine), PO Proton and more. Their most popular LCD game (Nu, pogodi!), -is known to be initially produced by Evistor. - -Most of the games are marked "bootleg" in MAME, because the ROM contents are -a 1:1 copy of Nintendo Game & Watch games. Known G&W cloned by Elektronika: -Fire(FR-27), Octopus, Chef, Egg/Mickey Mouse, Donkey Kong Jr.(CJ-93), -Spitball Sparky. - -The MCUs used were not imported from Sharp, but cloned by USSR, renamed to -КБ1013ВК1-2 for SM5A and КБ1013ВК4-2 for SM510. - -***************************************************************************/ - -#include "emu.h" -#include "hh_sm510.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "gnw_dualv.lh" -#include "gnw_dualh.lh" - -//#include "hh_sm510_test.lh" // common test-layout - use external artwork -#include "hh_sm500_test.lh" // " - - -// machine start/reset - -void hh_sm510_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - - // determine number of input lines (set it in the subclass constructor if different) - if (m_inp_lines == 0 && m_inp_fixed < 0) - { - for (; m_inputs[m_inp_lines] != nullptr; m_inp_lines++) { ; } - - // when last input line is fixed(GND) - if (m_inp_fixed == -2) - { - m_inp_lines--; - m_inp_fixed = m_inp_lines; - } - } - - // 1kHz display decay ticks - m_display_decay_timer = timer_alloc(FUNC(hh_sm510_state::display_decay_tick), this); - m_display_decay_timer->adjust(attotime::from_hz(1024), 0, attotime::from_hz(1024)); - - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_inp_lines)); - save_item(NAME(m_inp_fixed)); - save_item(NAME(m_speaker_data)); - save_item(NAME(m_s)); - save_item(NAME(m_r)); - - save_item(NAME(m_display_x_len)); - save_item(NAME(m_display_y_len)); - save_item(NAME(m_display_z_len)); - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_decay_pivot)); - save_item(NAME(m_decay_len)); -} - -void hh_sm510_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// lcd panel - on lcd handhelds, usually not a generic x/y screen device -// deflicker here, especially needed for SM500/SM5A with the active shift register - -TIMER_CALLBACK_MEMBER(hh_sm510_state::display_decay_tick) -{ - u8 z_mask = (1 << m_display_z_len) - 1; - u8 zx_len = 1 << (m_display_x_len + m_display_z_len); - - for (int zx = 0; zx < zx_len; zx++) - { - for (int y = 0; y < m_display_y_len; y++) - { - // delay lcd segment on/off state - if (m_display_state[zx] >> y & 1) - { - if (m_display_decay[y][zx] < (m_decay_pivot + m_decay_len)) - m_display_decay[y][zx]++; - } - else if (m_display_decay[y][zx] > 0) - m_display_decay[y][zx]--; - u8 active_state = (m_display_decay[y][zx] < m_decay_pivot) ? 0 : 1; - - // SM510 series: output to x.y.z, where: - // x = group a/b/bs/c (0/1/2/3) - // y = segment 1-16 (0-15) - // z = common H1-H4 (0-3) - - // SM500/SM530 series: output to x.y.z, where: - // x = O group (0-*) - // y = O segment 1-4 (0-3) - // z = common H1/H2 (0/1) - m_out_x[zx >> m_display_z_len][y][zx & z_mask] = active_state; - } - } -} - -void hh_sm510_state::set_display_size(u8 x, u8 y, u8 z) -{ - // x = groups(in bits) - // y = number of segments per group - // z = commons(in bits) - m_display_x_len = x; - m_display_y_len = y; - m_display_z_len = z; -} - -void hh_sm510_state::sm510_lcd_segment_w(offs_t offset, u16 data) -{ - set_display_size(2, 16, 2); - m_display_state[offset] = data; -} - -void hh_sm510_state::sm500_lcd_segment_w(offs_t offset, u16 data) -{ - set_display_size(4, 4, 1); - m_display_state[offset] = data; -} - - -// generic input handlers - usually S output is input mux, and K input for buttons - -u8 hh_sm510_state::read_inputs(int columns, int fixed) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - if (fixed >= 0) - ret |= m_inputs[fixed]->read(); - - return ret; -} - -void hh_sm510_state::update_k_line() -{ - // this is necessary because the MCU can wake up on K input activity - m_maincpu->set_input_line(0, input_r() ? ASSERT_LINE : CLEAR_LINE); -} - -INPUT_CHANGED_MEMBER(hh_sm510_state::input_changed) -{ - update_k_line(); -} - -void hh_sm510_state::input_w(u8 data) -{ - m_inp_mux = data; - update_k_line(); -} - -u8 hh_sm510_state::input_r() -{ - return read_inputs(m_inp_lines, m_inp_fixed); -} - -INPUT_CHANGED_MEMBER(hh_sm510_state::acl_button) -{ - // ACL button is directly tied to MCU ACL pin - m_maincpu->set_input_line(SM510_INPUT_LINE_ACL, newval ? ASSERT_LINE : CLEAR_LINE); -} - - -// other generic output handlers - -void hh_sm510_state::piezo_r1_w(u8 data) -{ - // R1 to piezo (SM511 R pin is melody output) - m_speaker->level_w(data & 1); -} - -void hh_sm510_state::piezo_r2_w(u8 data) -{ - // R2 to piezo - m_speaker->level_w(data >> 1 & 1); -} - -void hh_sm510_state::piezo_input_w(u8 data) -{ - // R1 to piezo, other to input mux - piezo_r1_w(data & 1); - input_w(data >> 1); -} - -void hh_sm510_state::piezo2bit_r1_w(u8 data) -{ - // R1(+S1) to piezo - m_speaker_data = (m_speaker_data & ~1) | (data & 1); - m_speaker->level_w(m_speaker_data); -} - -void hh_sm510_state::piezo2bit_input_w(u8 data) -{ - // S1(+R1) to piezo, other to input mux - m_speaker_data = (m_speaker_data & ~2) | (data << 1 & 2); - m_speaker->level_w(m_speaker_data); - input_w(data >> 1); -} - - - -/*************************************************************************** - - Common Machine Configurations - -***************************************************************************/ - -// building blocks - -void hh_sm510_state::mcfg_cpu_common(machine_config &config) -{ - m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r)); - m_maincpu->read_ba().set([this] () { return m_io_ba.read_safe(1); }); - m_maincpu->read_b().set([this] () { return m_io_b.read_safe(1); }); -} - -void hh_sm510_state::mcfg_cpu_sm5a(machine_config &config) -{ - SM5A(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); -} - -void hh_sm510_state::mcfg_cpu_kb1013vk12(machine_config &config) -{ - KB1013VK12(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); -} - -void hh_sm510_state::mcfg_cpu_sm510(machine_config &config) -{ - SM510(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(2); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm511(machine_config &config) -{ - SM511(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm512(machine_config &config) -{ - SM512(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm530(machine_config &config) -{ - SM530(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) -{ - screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(width, height); - screen.set_visarea_full(); -} - -void hh_sm510_state::mcfg_sound_r1(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w)); -} - - -// common presets - -void hh_sm510_state::sm5a_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm5a(config); - mcfg_sound_r1(config); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::kb1013vk12_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_kb1013vk12(config); - mcfg_sound_r1(config); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm510_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm510(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm511_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm511(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm530_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm530(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - - -// deviations - -// multi-screen - -void hh_sm510_state::sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight) -{ - mcfg_cpu_sm510(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, leftwidth, leftheight, "screen_left"); - mcfg_svg_screen(config, rightwidth, rightheight, "screen_right"); - - config.set_default_layout(layout_gnw_dualh); -} - -void hh_sm510_state::dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_sound_r1(config); - mcfg_svg_screen(config, topwidth, topheight, "screen_top"); - mcfg_svg_screen(config, botwidth, botheight, "screen_bottom"); - - config.set_default_layout(layout_gnw_dualv); -} - -void hh_sm510_state::sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm510(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - -void hh_sm510_state::sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm511(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - -void hh_sm510_state::sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm512(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - - -// Tiger (SM510 R mask is direct, BA/B pins always connected) - -void hh_sm510_state::sm510_tiger(machine_config &config, u16 width, u16 height) -{ - sm510_common(config, width, height); - - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->read_ba().set_ioport("BA"); - m_maincpu->read_b().set_ioport("B"); -} - -void hh_sm510_state::sm511_tiger1bit(machine_config &config, u16 width, u16 height) -{ - sm511_common(config, width, height); - - m_maincpu->read_ba().set_ioport("BA"); - m_maincpu->read_b().set_ioport("B"); -} - -void hh_sm510_state::sm511_tiger2bit(machine_config &config, u16 width, u16 height) -{ - sm511_tiger1bit(config, width, height); - - m_maincpu->write_s().set(FUNC(hh_sm510_state::piezo2bit_input_w)); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo2bit_r1_w)); - - // R via 120K resistor, S1 via 39K resistor (eg. tsonic, tsonic2, tbatmana) - static const double speaker_levels[] = { 0.0, 1.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(4, speaker_levels); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Nintendo Game & Watch: Ball (model AC-01) - * PCB label AC-01 - * Sharp SM5A label AC-01 5009 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as Toss-Up by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_ball_state : public hh_sm510_state -{ -public: - gnw_ball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_ball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ball ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_ball_state::gnw_ball(machine_config &config) -{ - sm5a_common(config, 1671, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ball ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ac-01", 0x0000, 0x0740, CRC(ac94e6e4) SHA1(8270cb61f9fbff252eafec411b4c67f0171f8687) ) - - ROM_REGION( 71748, "screen", 0) - ROM_LOAD( "gnw_ball.svg", 0, 71748, CRC(7c116eaf) SHA1(578882af492b8a9f1eb72e06a547c8b574255fb9) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Flagman (model FL-02) - * PCB label FL-02 - * Sharp SM5A label FL-02 2005 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as Flag Man by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_flagman_state : public hh_sm510_state -{ -public: - gnw_flagman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_flagman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_flagman ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("4") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_flagman_state::gnw_flagman(machine_config &config) -{ - sm5a_common(config, 1511, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_flagman ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fl-02", 0x0000, 0x0740, CRC(cc7a99e4) SHA1(d03d9a6b278bc11df7839708831241b5fa805f69) ) - - ROM_REGION( 56163, "screen", 0) - ROM_LOAD( "gnw_flagman.svg", 0, 56163, CRC(3aa97c65) SHA1(a363e71d371e5c85835cb3a0679760d0aedc75d5) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Vermin (model MT-03) - * PCB label MT-03 - * Sharp SM5A label MT-03 5012 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as The Exterminator by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_vermin_state : public hh_sm510_state -{ -public: - gnw_vermin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_vermin(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_vermin ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_vermin_state::gnw_vermin(machine_config &config) -{ - sm5a_common(config, 1650, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_vermin ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mt-03", 0x0000, 0x0740, CRC(f8493177) SHA1(d629432ef8e9fbd7bbdc3fbeb45d9bd70d9d571b) ) - - ROM_REGION( 105603, "screen", 0) - ROM_LOAD( "gnw_vermin.svg", 0, 105603, CRC(1bd59ef4) SHA1(099120105e80d4753838ea513ffa784c4690cf5f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire (model RC-04) - * PCB label RC-04 - * Sharp SM5A label RC-04 5103 (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the silver version, there's also a wide screen version. - - In the USA, it was distributed as Fireman Fireman by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_fires_state : public hh_sm510_state -{ -public: - gnw_fires_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_fires(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fires ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_fires_state::gnw_fires(machine_config &config) -{ - sm5a_common(config, 1646, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fires ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "rc-04", 0x0000, 0x0740, CRC(154ef27d) SHA1(fb65826dfd405ad05fe0f5f947c213214bbd61c0) ) - - ROM_REGION( 102678, "screen", 0) - ROM_LOAD( "gnw_fires.svg", 0, 102678, CRC(4f61f2f8) SHA1(2873629f0e36d3170bc284fa031a9c6181021495) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Judge (model IP-05) - * PCB label IP-05 - * Sharp SM5A label IP-05 5010, or IP-15 5012 (no decap) - * lcd screen with custom segments, 1-bit sound - - The first (green) issue of the game contains a bug where the players are - scored differently when wrongly dodging a win. This issue is fixed in the - second (purple) issue. - -***************************************************************************/ - -class gnw_judge_state : public hh_sm510_state -{ -public: - gnw_judge_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_judge(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_judge ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Dodge") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Hit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Dodge") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Hit") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") // 2-Player - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") // 1-Player - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Increase Computer's Operation Time (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_judge_state::gnw_judge(machine_config &config) -{ - sm5a_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_judge ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ip-15", 0x0000, 0x0740, CRC(f6ed6f62) SHA1(97bc1b5c383fb4077d982cfdc5a7d7603a0b5e2f) ) - - ROM_REGION( 105108, "screen", 0) - ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) -ROM_END - -ROM_START( gnw_judgeo ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ip-05", 0x0000, 0x0740, CRC(1b28a834) SHA1(cb8dbbf678ba22c4484d18cc1a6b99c1d34d1951) ) - - ROM_REGION( 105108, "screen", 0) - ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Manhole (model MH-06) - * PCB label MH-06 - * Sharp SM5A label MH-06 5104 (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the Gold Series version, there's also a new wide screen version - (NH-103) - -***************************************************************************/ - -class gnw_manholeg_state : public hh_sm510_state -{ -public: - gnw_manholeg_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_manholeg(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_manholeg ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_manholeg_state::gnw_manholeg(machine_config &config) -{ - sm5a_common(config, 1667, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_manholeg ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mh-06", 0x0000, 0x0740, CRC(ae52c425) SHA1(8da8a714ecbdde7d0f257b52a5014993675a5f3f) ) - - ROM_REGION( 125607, "screen", 0) - ROM_LOAD( "gnw_manholeg.svg", 0, 125607, CRC(4b281ff2) SHA1(18f212ab5738756e0841d6afa401a03f7aaddf7b) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Helmet (model CN-07) - * PCB label CN-07 - * Sharp SM5A label CN-07 5102, or CN-17 21ZA (no decap) - * lcd screen with custom segments, 1-bit sound - - In the UK, it was distributed as Headache by CGL. - - MCU label CN-07 is the first version, CN-17 is a bugfix release. - -***************************************************************************/ - -class gnw_helmet_state : public hh_sm510_state -{ -public: - gnw_helmet_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_helmet(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_helmet ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_helmet_state::gnw_helmet(machine_config &config) -{ - sm5a_common(config, 1657, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_helmet ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "cn-17", 0x0000, 0x0740, CRC(6d251e2e) SHA1(c61f591514de36fb2270038a6505945564c9f90e) ) - - ROM_REGION( 109404, "screen", 0) - ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) -ROM_END - -ROM_START( gnw_helmeto ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "cn-07", 0x0000, 0x0740, CRC(30c8bc90) SHA1(f5ac0fe7a09ee1ad6f6e4bd096b4be20f65d73db) ) - - ROM_REGION( 109404, "screen", 0) - ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Lion (model LN-08) - * PCB label LN-08 - * Sharp SM5A label LN-08 519A (no decap) - * lcd screen with custom segments, 1-bit sound - - BTANB: The game doesn't support simultaneous button presses for the controls, - it's the same as in eg. gnw_mmouse but in this game it doesn't make much sense - with the 2 separate guys. More likely a bad game design choice than bug. - -***************************************************************************/ - -class gnw_lion_state : public hh_sm510_state -{ -public: - gnw_lion_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_lion(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_lion ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Increase Speed (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_lion_state::gnw_lion(machine_config &config) -{ - sm5a_common(config, 1646, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_lion ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ln-08", 0x0000, 0x0740, CRC(9677681d) SHA1(6f7c960e04b63f1b7d926b598413f4c818b8fe53) ) - - ROM_REGION( 155863, "screen", 0) - ROM_LOAD( "gnw_lion.svg", 0, 155863, CRC(b5a5a4dc) SHA1(49d894d6e1d1fb35cd11f08c7ce30518be89dd0f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Parachute (model PR-21) - * PCB label PR-21Y - * Sharp SM5A label PR-21 52XC (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_pchute_state : public hh_sm510_state -{ -public: - gnw_pchute_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_pchute(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_pchute ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_pchute_state::gnw_pchute(machine_config &config) -{ - sm5a_common(config, 1602, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_pchute ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "pr-21", 0x0000, 0x0740, CRC(392b545e) SHA1(e71940cd4cee07ba1e62c1c7d9e9b19410e7232d) ) - - ROM_REGION( 169640, "screen", 0) - ROM_LOAD( "gnw_pchute.svg", 0, 169640, CRC(f30a0b31) SHA1(676989a418ae0dfe6bb1b097640422219c930453) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Octopus (model OC-22) - * PCB label OC-22Y A - * Sharp SM5A label OC-22 204A (no decap) - * lcd screen with custom segments, 1-bit sound - - Also cloned in 1989 by Elektronika(USSR) as Тайны океана (Tayny okeana, export - version: Mysteries of the Ocean), ROM is identical, graphics as well except - for the AM/PM/GAME segments. - -***************************************************************************/ - -class gnw_octopus_state : public hh_sm510_state -{ -public: - gnw_octopus_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_octopus(machine_config &config); - void taynyoke(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_octopus ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_octopus_state::gnw_octopus(machine_config &config) -{ - sm5a_common(config, 1586, 1080); // R mask option confirmed -} - -void gnw_octopus_state::taynyoke(machine_config &config) -{ - kb1013vk12_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_octopus ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "oc-22", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) - - ROM_REGION( 119827, "screen", 0) - ROM_LOAD( "gnw_octopus.svg", 0, 119827, CRC(efbdaa65) SHA1(42c746bef282176d59f57ddf7328f8d034f4ca02) ) -ROM_END - -ROM_START( taynyoke ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-03.bin", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) - - ROM_REGION( 93910, "screen", 0) - ROM_LOAD( "taynyoke.svg", 0, 93910, CRC(da7a835e) SHA1(1fe427a60bbf78fdf29ea401ec86b225098b68bb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Popeye (model PP-23) - * PCB label PP-23 Y - * Sharp SM5A label PP-23 52YD (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the wide screen version, there's also tabletop and panorama versions. - -***************************************************************************/ - -class gnw_popeye_state : public hh_sm510_state -{ -public: - gnw_popeye_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_popeye(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_popeye ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_popeye_state::gnw_popeye(machine_config &config) -{ - sm5a_common(config, 1604, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_popeye ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "pp-23", 0x0000, 0x0740, CRC(49987769) SHA1(ad90659a3ce7169a4df16367c5307435d9f9d956) ) - - ROM_REGION( 218587, "screen", 0) - ROM_LOAD( "gnw_popeye.svg", 0, 218587, CRC(4740bcd5) SHA1(a46ab455f2dd41caabd6c85cfa7dfde70805f157) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Chef (model FP-24) - * PCB label FP-24 - * Sharp SM5A label FP-24 51YB (die label CMS646, ROM ID 74) - * lcd screen with custom segments, 1-bit sound - - In 1989, Elektronika(USSR) released a clone: Весёлый повар (Vesyolyy povar, - export version: Merry Cook). This game shares the same ROM, though the graphics - are slightly different. - -***************************************************************************/ - -class gnw_chef_state : public hh_sm510_state -{ -public: - gnw_chef_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void vespovar(machine_config &config); - void gnw_chef(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_chef ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_chef_state::gnw_chef(machine_config &config) -{ - sm5a_common(config, 1666, 1080); // assuming same R mask option as merry cook -} - -void gnw_chef_state::vespovar(machine_config & config) -{ - kb1013vk12_common(config, 1679, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_chef ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fp-24", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) - - ROM_REGION( 199518, "screen", 0) - ROM_LOAD( "gnw_chef.svg", 0, 199518, CRC(ecc18d28) SHA1(1c0b7dfff71faa4d4395c19a84454870e403f927) ) -ROM_END - -ROM_START( vespovar ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-04.bin", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) - - ROM_REGION( 144128, "screen", 0) - ROM_LOAD( "vespovar.svg", 0, 144128, CRC(dcd1c073) SHA1(e15bf643f17b7ead37407c985e053e6434683d7c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey Mouse (model MC-25), Egg (model EG-26) - * PCB label MC-25 EG-26 (yes, both listed) - * Sharp SM5A label MC-25 51YD (Mickey Mouse), MC-25 519D (Egg) (no decap) - * lcd screen with custom segments, 1-bit sound - - MC-25 and EG-26 are the same game, it's assumed that the latter was for - regions where Nintendo wasn't able to license from Disney. - - In 1984, Электроника (Elektronika, USSR) released an unlicensed clone: - Ну, погоди! (Nu, pogodi!). This was followed by several other titles that - were the same under the hood, only differing in graphics. They also made a - slightly modified version, adding a new game mode (by pressing A+B) where the - player/CPU roles are reversed. This version is known as Разведчики космоса - (Razvedchiki kosmosa, export version: Explorers of Space). - - The following Mickey Mouse Elektronika clones are emulated in MAME: - - Model Title Transliteration Export version Note - --------------------------------------------------------------------------------- - ИМ-02 Ну, погоди! Nu, pogodi! - - - ИМ-10 Хоккей Hockey (Khokkey) Ice Hockey Export version manufactured by PO Proton - ИМ-13 Разведчики космоса Razvedchiki kosmosa Explorers of Space Modified ROM (see note above) - ИМ-16 Охота Okhota Fowling - - ИМ-19 Биатлон Biathlon (Biatlon) - - - ИМ-22 Весёлые футболисты Vesyolye futbolisty Monkey Goalkeeper - - ИМ-32 Кот-рыболов Kot-rybolov - - - ИМ-33 Квака-задавака Kvaka-zadavaka Frogling - - ИМ-49 Ночные воришки Nochnye vorishki Night Burglars - - ИМ-50 Космический полёт Kosmicheskiy polyot Space Flight The Model ID is the same as Весёлая арифметика (Vesyolaya arithmetika, export version: Amusing Arithmetic) (not emulated in MAME) - ИМ-51 Морская атака Morskaya ataka - - - ИМ-53 Атака астероидов Ataka asteroidov - Graphics are very similar to ИМ-50 - - Цирк Circus (Tsirk) - Unknown Model ID - -***************************************************************************/ - -class gnw_mmouse_state : public hh_sm510_state -{ -public: - gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mmouse(machine_config &config); - void gnw_egg(machine_config &config); - void nupogodi(machine_config &config); - void ehockey(machine_config &config); - void rkosmosa(machine_config &config); - void okhota(machine_config &config); - void biathlon(machine_config &config); - void vfutbol(machine_config &config); - void krybolov(machine_config &config); - void kvakazad(machine_config &config); - void nochnyev(machine_config &config); - void kosmicpt(machine_config &config); - void morataka(machine_config &config); - void atakaast(machine_config &config); - void ecircus(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mmouse ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -static INPUT_PORTS_START( rkosmosa ) - PORT_INCLUDE( gnw_mmouse ) - - PORT_MODIFY("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void gnw_mmouse_state::gnw_mmouse(machine_config &config) -{ - sm5a_common(config, 1684, 1080); // R mask option confirmed -} - -void gnw_mmouse_state::gnw_egg(machine_config &config) -{ - sm5a_common(config, 1690, 1080); // R mask option confirmed -} - -void gnw_mmouse_state::nupogodi(machine_config &config) -{ - kb1013vk12_common(config, 1715, 1080); // R mask option ? -} - -void gnw_mmouse_state::ehockey(machine_config &config) -{ - kb1013vk12_common(config, 1782, 1080); // R mask option ? -} - -void gnw_mmouse_state::rkosmosa(machine_config &config) -{ - kb1013vk12_common(config, 1646, 1080); // R mask option ? -} - -void gnw_mmouse_state::okhota(machine_config &config) -{ - kb1013vk12_common(config, 1632, 1080); // R mask option ? -} - -void gnw_mmouse_state::biathlon(machine_config &config) -{ - kb1013vk12_common(config, 1633, 1080); // R mask option ? -} - -void gnw_mmouse_state::vfutbol(machine_config &config) -{ - kb1013vk12_common(config, 1655, 1080); // R mask option ? -} - -void gnw_mmouse_state::krybolov(machine_config &config) -{ - kb1013vk12_common(config, 1638, 1080); // R mask option ? -} - -void gnw_mmouse_state::kvakazad(machine_config &config) -{ - kb1013vk12_common(config, 1660, 1080); // R mask option ? -} - -void gnw_mmouse_state::nochnyev(machine_config &config) -{ - kb1013vk12_common(config, 1641, 1080); // R mask option ? -} - -void gnw_mmouse_state::kosmicpt(machine_config &config) -{ - kb1013vk12_common(config, 1658, 1080); // R mask option ? -} - -void gnw_mmouse_state::morataka(machine_config &config) -{ - kb1013vk12_common(config, 1648, 1080); // R mask option ? -} - -void gnw_mmouse_state::atakaast(machine_config &config) -{ - kb1013vk12_common(config, 1620, 1080); // R mask option ? -} - -void gnw_mmouse_state::ecircus(machine_config &config) -{ - kb1013vk12_common(config, 1657, 1080); // R mask option ? -} - -// roms - -ROM_START( gnw_mmouse ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 181706, "screen", 0) - ROM_LOAD( "gnw_mmouse.svg", 0, 181706, CRC(60cdc76a) SHA1(09755abd16222c1a0fe6c7ebb902706440d3e369) ) -ROM_END - -ROM_START( gnw_egg ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 193119, "screen", 0) - ROM_LOAD( "gnw_egg.svg", 0, 193119, CRC(1e469fe5) SHA1(bc80114337feefca590e48c823e8488f6b63f896) ) -ROM_END - -ROM_START( nupogodi ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-02.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 154233, "screen", 0) - ROM_LOAD( "nupogodi.svg", 0, 154233, CRC(42cfb84a) SHA1(249ca7ec78066b57f9a18e48ada64712c944e461) ) -ROM_END - -ROM_START( ehockey ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-10.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 94977, "screen", 0) - ROM_LOAD( "ehockey.svg", 0, 94977, CRC(98cf43b0) SHA1(4353505709612344cd3b597c3b4e9f6b441ddb66) ) -ROM_END - -ROM_START( rkosmosa ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-13.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) ) - - ROM_REGION( 81420, "screen", 0) - ROM_LOAD( "rkosmosa.svg", 0, 81420, CRC(dc6632be) SHA1(0906d933f4cda39ee1e57b502651a821e61e95ef) ) -ROM_END - -ROM_START( okhota ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-16.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 117838, "screen", 0) - ROM_LOAD( "okhota.svg", 0, 117838, CRC(7de707c6) SHA1(c876ea16bd8af033086e2e20860d2e1d09296d59) ) -ROM_END - -ROM_START( biathlon ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-19.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 116377, "screen", 0) - ROM_LOAD( "biathlon.svg", 0, 116377, CRC(fadf729e) SHA1(671f9496e2bfe7b4800ee7bad039485e19958428) ) -ROM_END - -ROM_START( vfutbol ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-22.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 131901, "screen", 0) - ROM_LOAD( "vfutbol.svg", 0, 131901, CRC(85811308) SHA1(288aa41bade08c61e0d346b9c1109179564e34ed) ) -ROM_END - -ROM_START( krybolov ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-32.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 132804, "screen", 0) - ROM_LOAD( "krybolov.svg", 0, 132804, CRC(4e3e70d3) SHA1(18f1300afa601deb6ac01dcf7dca88187b7940a3) ) -ROM_END - -ROM_START( kvakazad ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-33.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 131961, "screen", 0) - ROM_LOAD( "kvakazad.svg", 0, 131961, CRC(37b27420) SHA1(25d9e273f056c10e3a5bc4476ce980bfdb8095e1) ) -ROM_END - -ROM_START( nochnyev ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-49.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 136498, "screen", 0) - ROM_LOAD( "nochnyev.svg", 0, 136498, CRC(24a287cd) SHA1(2d14aa9b55b42c634df141fe4037ae286549b17b) ) -ROM_END - -ROM_START( kosmicpt ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-50.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 110214, "screen", 0) - ROM_LOAD( "kosmicpt.svg", 0, 110214, CRC(ccef6d27) SHA1(71f3cf49a5797ed9296f1e86ec4575ffefab67dd) ) -ROM_END - -ROM_START( morataka ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-51.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 105057, "screen", 0) - ROM_LOAD( "morataka.svg", 0, 105057, CRC(c235c56c) SHA1(b6ef74ba7826221683243e23513270d0f0f2cfda) ) -ROM_END - -ROM_START( atakaast ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-53.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 105570, "screen", 0) - ROM_LOAD( "atakaast.svg", 0, 105570, CRC(3d79aacc) SHA1(bc25969f4d6fa75b320130c920ac0bdc8fb44cbd) ) -ROM_END - -ROM_START( ecircus ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ecircus.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 124643, "screen", 0) - ROM_LOAD( "ecircus.svg", 0, 124643, CRC(079f25db) SHA1(defa784c80e01ce6affbb424930674114275bea1) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire (model FR-27) - * PCB label FR-27 - * Sharp SM5A label FR-27 523B (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the wide screen version, there's also a silver version. Doing a - hex-compare between the two, this one seems to be a complete rewrite. - FR-27 is the last G&W on SM5A, they were followed with SM51x. - - In 1989 Elektronika(USSR) released a clone: Космический мост (Kosmicheskiy most, - export version: Space Bridge). This game shares the same ROM, though the - graphics are different. - -***************************************************************************/ - -class gnw_fire_state : public hh_sm510_state -{ -public: - gnw_fire_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kosmicmt(machine_config &config); - void gnw_fire(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fire ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // lcd test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_fire_state::gnw_fire(machine_config &config) -{ - sm5a_common(config, 1624, 1080); // R mask option confirmed -} - -void gnw_fire_state::kosmicmt(machine_config & config) -{ - kb1013vk12_common(config, 1673, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fire ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fr-27", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) - - ROM_REGION( 163920, "screen", 0) - ROM_LOAD( "gnw_fire.svg", 0, 163920, CRC(be8a9f05) SHA1(644d8bed6228fa7e2f541b60fcfc1a0d97df0df6) ) -ROM_END - -ROM_START( kosmicmt ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-09.bin", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) - - ROM_REGION( 124578, "screen", 0) - ROM_LOAD( "kosmicmt.svg", 0, 124578, CRC(913324ef) SHA1(6e72f7f517da754075af11283d71fc8d24ac0529) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Turtle Bridge (model TL-28) - * PCB label TL-28 - * Sharp SM510 label TL-28 523C (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_tbridge_state : public hh_sm510_state -{ -public: - gnw_tbridge_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: unwanted segments light up - m_decay_pivot = 25; - m_decay_len = 25; - } - - void gnw_tbridge(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_tbridge ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_tbridge_state::gnw_tbridge(machine_config &config) -{ - sm510_common(config, 1587, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_tbridge ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tl-28", 0x0000, 0x1000, CRC(284e7224) SHA1(b50d7f3a527ffe50771ef55fdf8214929bfa2253) ) - - ROM_REGION( 242944, "screen", 0) - ROM_LOAD( "gnw_tbridge.svg", 0, 242944, CRC(bf66cb38) SHA1(3f19d1e6584062944e56107d47ebe26335d50f42) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire Attack (model ID-29) - * PCB label ID-29 - * Sharp SM510 label ID-29 524B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_fireatk_state : public hh_sm510_state -{ -public: - gnw_fireatk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_fireatk(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fireatk ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_fireatk_state::gnw_fireatk(machine_config &config) -{ - sm510_common(config, 1655, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fireatk ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "id-29", 0x0000, 0x1000, CRC(5f6e8042) SHA1(63afc3acd8a2a996095fa8ba2dfccd48e5214478) ) - - ROM_REGION( 267914, "screen", 0) - ROM_LOAD( "gnw_fireatk.svg", 0, 267914, CRC(f9eea340) SHA1(1fbc224dac447fe3902920ee3f1afc11150b5962) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Snoopy Tennis (model SP-30) - * PCB label SP-30 - * Sharp SM510 label SP-30 525B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_stennis_state : public hh_sm510_state -{ -public: - gnw_stennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_stennis(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_stennis ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_stennis_state::gnw_stennis(machine_config &config) -{ - sm510_common(config, 1581, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_stennis ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "sp-30", 0x0000, 0x1000, CRC(ba1d9504) SHA1(ff601765d88564b1570a59f5b1a4005c7b0fd66c) ) - - ROM_REGION( 228125, "screen", 0) - ROM_LOAD( "gnw_stennis.svg", 0, 228125, CRC(1134ef9a) SHA1(6f35a4d610c952663761f7ccb74c6650752cac77) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Oil Panic (model OP-51) - * PCB label OP-51A - * Sharp SM510 label OP-51 28ZB (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_opanic_state : public hh_sm510_state -{ -public: - gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_opanic(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_opanic ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_opanic_state::gnw_opanic(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1292/2, 1920/2, 1230/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_opanic ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) ) - - ROM_REGION( 79771, "screen_top", 0) - ROM_LOAD( "gnw_opanic_top.svg", 0, 79771, CRC(0e1e6485) SHA1(15d5ec48cad65759a50ed624e4161a8f2513f704) ) - - ROM_REGION( 112962, "screen_bottom", 0) - ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112962, CRC(ae4f4f1f) SHA1(97907bea3ca92759a0ea889e80d60d25a701027a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong (model DK-52) - * PCB label DK-52C - * Sharp SM510 label DK-52 52ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong_state : public hh_sm510_state -{ -public: - gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong_state::gnw_dkong(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1266/2, 1920/2, 1266/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkong ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) ) - - ROM_REGION( 176843, "screen_top", 0) - ROM_LOAD( "gnw_dkong_top.svg", 0, 176843, CRC(16c16b84) SHA1(fa2e54c04366a30b51de024296b9f94c1cb76d68) ) - - ROM_REGION( 145516, "screen_bottom", 0) - ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145516, CRC(2b711e9d) SHA1(0e263020cbe0e8b88bb68e3176630639b518935e) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey & Donald (model DM-53) - * PCB label DM-53 - * Sharp SM510 label DM-53 52ZC (die label CMS54C, CMS565) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mickdon_state : public hh_sm510_state -{ -public: - gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mickdon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mickdon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mickdon_state::gnw_mickdon(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1281/2, 1920/2, 1236/2); // R mask option confirmed - - m_maincpu->write_r().set(FUNC(gnw_mickdon_state::piezo_r2_w)); -} - -// roms - -ROM_START( gnw_mickdon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) - - ROM_REGION( 126477, "screen_top", 0) - ROM_LOAD( "gnw_mickdon_top.svg", 0, 126477, CRC(11e02fce) SHA1(fe2700711c73940a9488a6d223db4c4e92df4188) ) - - ROM_REGION( 122915, "screen_bottom", 0) - ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122915, CRC(b8cf63c2) SHA1(2406c9826f94a345ca9641e51fb26088f434960c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Green House (model GH-54) - * PCB label GH-54 - * Sharp SM510 label GH-54 52ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - - After the 20,000,000th G&W, Nintendo made a special edition of Green House - (still model GH-54), with the box art showing all the released games so far. - -***************************************************************************/ - -class gnw_ghouse_state : public hh_sm510_state -{ -public: - gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_ghouse(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ghouse ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Spray - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_ghouse_state::gnw_ghouse(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1303/2, 1920/2, 1274/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ghouse ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) ) - - ROM_REGION( 159258, "screen_top", 0) - ROM_LOAD( "gnw_ghouse_top.svg", 0, 159258, CRC(308c9c86) SHA1(e83d114e702b6da3cba4e45bd48edfe9882afac1) ) - - ROM_REGION( 149922, "screen_bottom", 0) - ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149922, CRC(c07c6bb8) SHA1(7a0d6f38ecdbfcd09ab967417fa9d06b5c5c21e4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong II (model JR-55) - * PCB label JR-55 - * Sharp SM510 label JR-55 53YC (die label CMS54C, KMS560) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong2_state : public hh_sm510_state -{ -public: - gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong2_state::gnw_dkong2(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1241/2, 1920/2, 1237/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkong2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) ) - - ROM_REGION( 267462, "screen_top", 0) - ROM_LOAD( "gnw_dkong2_top.svg", 0, 267462, CRC(41bb5414) SHA1(20c7af7c64e12273320029eecc5a33ec65d15bc5) ) - - ROM_REGION( 390601, "screen_bottom", 0) - ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390601, CRC(3f85bb01) SHA1(8964f02e8372f5d8dd5e8edfe0b79dae31b59b3a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario Bros. (model MW-56) - * PCB label MW-56-M-I (left), MW-56-S (right) - * Sharp SM510 label MW-56 533C (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mario_state : public hh_sm510_state -{ -public: - gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mario(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mario ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mario_state::gnw_mario(machine_config &config) -{ - sm510_dualh(config, 2258/2, 1440/2, 2261/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_mario ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) ) - - ROM_REGION( 154916, "screen_left", 0) - ROM_LOAD( "gnw_mario_left.svg", 0, 154916, CRC(8ea82355) SHA1(ad286039a215dfa0f02bb1caf875d55dedb9b71e) ) - - ROM_REGION( 202902, "screen_right", 0) - ROM_LOAD( "gnw_mario_right.svg", 0, 202902, CRC(cfe8c0ba) SHA1(87cd54a8104e9bb4f266b137b043e32a0c1d9772) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Rain Shower (model LP-57) - * PCB labels: LP-57-M-I (left), LP-57-S (right) - * Sharp SM510 label LP-57 538A (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_rshower_state : public hh_sm510_state -{ -public: - gnw_rshower_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_rshower(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_rshower ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // L/R - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_rshower_state::gnw_rshower(machine_config &config) -{ - sm510_dualh(config, 2126/2, 1440/2, 2146/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_rshower ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "lp-57", 0x0000, 0x1000, CRC(51a2c5c4) SHA1(d60542e6785ba7b6a44153a66c739787cf670816) ) - - ROM_REGION( 135868, "screen_left", 0) - ROM_LOAD( "gnw_rshower_left.svg", 0, 135868, CRC(806493f1) SHA1(0287fba2c2962aced8156c2ebc4f299c4703acf2) ) - - ROM_REGION( 140445, "screen_right", 0) - ROM_LOAD( "gnw_rshower_right.svg", 0, 140445, CRC(bead097a) SHA1(a3929e0043ff5132fb4cf7a41edece96926f50d2) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Life Boat (model TC-58) - * PCB labels: TC-58-M (left), TC-58-S (right) - * Sharp SM510 label TC-58 281D (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_lboat_state : public hh_sm510_state -{ -public: - gnw_lboat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_lboat(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_lboat ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_lboat_state::gnw_lboat(machine_config &config) -{ - sm510_dualh(config, 2116/2, 1440/2, 2057/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_lboat ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tc-58", 0x0000, 0x1000, CRC(1f88f6a2) SHA1(22fd62127dda43a0ada2fe89b0518eec8cbe2a25) ) - - ROM_REGION( 156441, "screen_left", 0) - ROM_LOAD( "gnw_lboat_left.svg", 0, 156441, CRC(a1727890) SHA1(b1dd24f99496d215a3083a138fc3fff923303d34) ) - - ROM_REGION( 155258, "screen_right", 0) - ROM_LOAD( "gnw_lboat_right.svg", 0, 155258, CRC(76619ad3) SHA1(b44d57e2f4a2cecf98e402adf802d16c5934d301) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Pinball (model PB-59) - * PCB label PB-59 - * Sharp SM511 label PB-59 53ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_pinball_state : public hh_sm510_state -{ -public: - gnw_pinball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_pinball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_pinball ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB -- this one multiplies scoring factor - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_pinball_state::gnw_pinball(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1271/2, 1920/2, 1286/2); -} - -// roms - -ROM_START( gnw_pinball ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "pb-59.program", 0x0000, 0x1000, CRC(d29dab34) SHA1(69ac9ee63eda67360c21627b7d625093709b5cd9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "pb-59.melody", 0x000, 0x100, BAD_DUMP CRC(5c9ccb55) SHA1(1bada6caf3609f969421087219e6635f4c135282) ) // decap needed for verification - - ROM_REGION( 83191, "screen_top", 0) - ROM_LOAD( "gnw_pinball_top.svg", 0, 83191, CRC(abe3edd9) SHA1(b32327b81b788896150e709ab8dc4a2155ae0995) ) - - ROM_REGION( 63618, "screen_bottom", 0) - ROM_LOAD( "gnw_pinball_bottom.svg", 0, 63618, CRC(1db44191) SHA1(73f73d246630d0b9efeb8dc72f37a2b88f735ceb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Black Jack (model BJ-60) - * PCB label BJ-60 - * Sharp SM512 label BJ-60 564D (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_bjack_state : public hh_sm510_state -{ -public: - gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bjack(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bjack ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Double Down") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x10 / Hit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x1 / Stand") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Enter") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_bjack_state::gnw_bjack(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1290/2, 1920/2, 1297/2); -} - -// roms - -ROM_START( gnw_bjack ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // decap needed for verification - - ROM_REGION( 75366, "screen_top", 0) - ROM_LOAD( "gnw_bjack_top.svg", 0, 75366, CRC(d36fb4e4) SHA1(7f2a0256d78eb01e757208ead0fd52ee63ce8efa) ) - - ROM_REGION( 112599, "screen_bottom", 0) - ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112599, CRC(04880ae1) SHA1(60f3723f81965fe4891f25a3522351872f338389) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Squish (model MG-61) - * PCB label MG-61 - * Sharp SM510 label MG-61 8841B (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_squish_state : public hh_sm510_state -{ -public: - gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: unwanted segments light up - m_decay_pivot = 17; - } - - void gnw_squish(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_squish ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Bonus Life (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_squish_state::gnw_squish(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1285/2, 1920/2, 1287/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_squish ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) ) - - ROM_REGION( 70456, "screen_top", 0) - ROM_LOAD( "gnw_squish_top.svg", 0, 70456, CRC(8d10b94e) SHA1(33854e7ea8f02adceb597c9ba259aa553953e698) ) - - ROM_REGION( 279739, "screen_bottom", 0) - ROM_LOAD( "gnw_squish_bottom.svg", 0, 279739, CRC(7f4bd704) SHA1(e625910101896cf3a6d41e28ccda77f902f71c7a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Bomb Sweeper (model BD-62) - * PCB label BD-62 - * Sharp SM512 label BD-62 8727 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_bsweep_state : public hh_sm510_state -{ -public: - gnw_bsweep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bsweep(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bsweep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Controller keys skips level when activated - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_bsweep_state::gnw_bsweep(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1291/2, 1920/2, 1239/2); -} - -// roms - -ROM_START( gnw_bsweep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bd-62.program", 0x0000, 0x1000, CRC(f3ac66ea) SHA1(3fbf444ade5bc96cf0073ca72f1d583cb0f48fc5) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bd-62.melody", 0x000, 0x100, BAD_DUMP CRC(addc0368) SHA1(fc488bdf1c2ea5ca84cc66762126bb5874659d8f) ) // decap needed for verification - - ROM_REGION( 218174, "screen_top", 0) - ROM_LOAD( "gnw_bsweep_top.svg", 0, 218174, CRC(b2c8e895) SHA1(9f7d5973a5f920845c83d30f7ebbbec93232c41e) ) - - ROM_REGION( 277420, "screen_bottom", 0) - ROM_LOAD( "gnw_bsweep_bottom.svg", 0, 277420, CRC(8a9786cb) SHA1(48390a77b0e436ec7d7e8835923faef787e163d4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Safe Buster (model JB-63) - * PCB label JB-63 - * Sharp SM511 label JB-63 8841 B (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_sbuster_state : public hh_sm510_state -{ -public: - gnw_sbuster_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_sbuster(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_sbuster ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_sbuster_state::gnw_sbuster(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1246/2, 1920/2, 1269/2); -} - -// roms - -ROM_START( gnw_sbuster ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "jb-63.program", 0x0000, 0x1000, CRC(231d358d) SHA1(c748788da125e77b9d0fe1228f64de71f41af42b) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "jb-63.melody", 0x000, 0x100, BAD_DUMP CRC(28cb2914) SHA1(52d34265611f786b597653193752d16563dd5e82) ) // decap needed for verification - - ROM_REGION( 221903, "screen_top", 0) - ROM_LOAD( "gnw_sbuster_top.svg", 0, 221903, CRC(adb9b67f) SHA1(902998ead1a13d3c26854393283ab622e1fd3f70) ) - - ROM_REGION( 282593, "screen_bottom", 0) - ROM_LOAD( "gnw_sbuster_bottom.svg", 0, 282593, CRC(12542c5e) SHA1(fb05b8f4a2cbeeb566ae111cd27ff486c1478d7b) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Gold Cliff (model MV-64) - * PCB label MV-64 - * Sharp SM512 label MV-64 9027 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_gcliff_state : public hh_sm510_state -{ -public: - gnw_gcliff_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_gcliff(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_gcliff ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Left or right skips level when activated - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_gcliff_state::gnw_gcliff(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1257/2, 1920/2, 1239/2); -} - -// roms - -ROM_START( gnw_gcliff ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mv-64.program", 0x0000, 0x1000, CRC(2448a3bf) SHA1(bfb1a1b500321f8ee0b6f07ef8503e64fe6d37c0) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mv-64.melody", 0x000, 0x100, BAD_DUMP CRC(cb938709) SHA1(516dcc8a1edffe02f50d349389caac0676de1eba) ) // decap needed for verification - - ROM_REGION( 530731, "screen_top", 0) - ROM_LOAD( "gnw_gcliff_top.svg", 0, 530731, CRC(3bb60d8f) SHA1(e7dac1fcbe7b682c9d988443c1446e5ad28d3baa) ) - - ROM_REGION( 519321, "screen_bottom", 0) - ROM_LOAD( "gnw_gcliff_bottom.svg", 0, 519321, CRC(1117041e) SHA1(0f87167614c1ba65915fa7205a6bb44778e443a8) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Zelda (model ZL-65) - * PCB label ZL-65 - * Sharp SM512 label ZL-65 8935 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_zelda_state : public hh_sm510_state -{ -public: - gnw_zelda_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_zelda(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_zelda ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Water of Life - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " -- Invincibility when playing on bottom screen only - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_zelda_state::gnw_zelda(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1346/2, 1920/2, 1291/2); -} - -// roms - -ROM_START( gnw_zelda ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "zl-65.program", 0x0000, 0x1000, CRC(b96aa64e) SHA1(d1f0c64104eb3ecbf370674d5078a3a85b2b7227) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "zl-65.melody", 0x000, 0x100, BAD_DUMP CRC(3a281b0f) SHA1(7a236775557939050bbcd6f9d0a598d219a032f2) ) // decap needed for verification - - ROM_REGION( 283029, "screen_top", 0) - ROM_LOAD( "gnw_zelda_top.svg", 0, 283029, CRC(aaab1d7e) SHA1(fe01e8a92e6dcf457da87afe6bf39fcf511da9db) ) - - ROM_REGION( 424886, "screen_bottom", 0) - ROM_LOAD( "gnw_zelda_bottom.svg", 0, 424886, CRC(09f00d09) SHA1(33045028bd7e0df4e976e79dc180028c6886359a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Cement Factory (model CM-72) - * PCB labels: CM-72 M (main board) - CM-72 C (joystick controller board) - CM-72 S (buttons controller board) - * Sharp SM511 label CM-72 534A, or CM-72A 536C (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the tabletop version. There's also a new wide screen version which is - a different game. Unlike the other tabletop games, there is no panorama version. - There are two known versions, distinguished by the startup jingle. The first - version sounds like Queen's "Another One Bites the Dust". - -***************************************************************************/ - -class gnw_mariocmt_state : public hh_sm510_state -{ -public: - gnw_mariocmt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariocmt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariocmt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariocmt_state::gnw_mariocmt(machine_config &config) -{ - sm511_common(config, 1920, 1046); -} - -// roms - -ROM_START( gnw_mariocmt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cm-72.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cm-72.melody", 0x000, 0x100, BAD_DUMP CRC(db4f0fc1) SHA1(e386df3e3e88fa36a73bcd0649feb904180493c8) ) // decap needed for verification - - ROM_REGION( 293317, "screen", 0) - ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) -ROM_END - -ROM_START( gnw_mariocmta ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cm-72a.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cm-72a.melody", 0x000, 0x100, BAD_DUMP CRC(b6d72560) SHA1(9d7c23f94b7f894ba1b7881f68824949702a37f2) ) // decap needed for verification - - ROM_REGION( 293317, "screen", 0) - ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Snoopy (model SM-91) - * PCB labels: SM-91 M (main board), SM-91C (controller board) - * Sharp SM511 label SM-91 538A (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD. - -***************************************************************************/ - -class gnw_snoopyp_state : public hh_sm510_state -{ -public: - gnw_snoopyp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_snoopyp(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_snoopyp ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_snoopyp_state::gnw_snoopyp(machine_config &config) -{ - sm511_common(config, 1920, 1020); -} - -// roms - -ROM_START( gnw_snoopyp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "sm-91.program", 0x0000, 0x1000, CRC(893bd7e3) SHA1(94e218f464b2ec8c81bd4c0f13f3a3049c4effe9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "sm-91.melody", 0x000, 0x100, BAD_DUMP CRC(09360aaf) SHA1(906eff1d2eaf7ff040d833b4513a995e7026279b) ) // decap needed for verification - - ROM_REGION( 353488, "screen", 0) - ROM_LOAD( "gnw_snoopyp.svg", 0, 353488, CRC(30cfa42e) SHA1(2abe74299db7241c66f9631b01d0ea336ec411ad) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Popeye (model PG-92) - * PCB labels: PG-92 M (main board), SM-91C (controller board) - * Sharp SM511 label PG-92 538A (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD, and a new wide screen version which is - a different game. - - The PCB design for the controller board is shared with the panorama version - of Snoopy (SM-91). - -***************************************************************************/ - -class gnw_popeyep_state : public hh_sm510_state -{ -public: - gnw_popeyep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_popeyep(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_popeyep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Punch - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives and Stronger Punch (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_popeyep_state::gnw_popeyep(machine_config &config) -{ - sm511_common(config, 1920, 1043); -} - -// roms - -ROM_START( gnw_popeyep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "pg-92.program", 0x0000, 0x1000, CRC(f9a2f181) SHA1(f97969abe63285964ef9585660e82590014bbece) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "pg-92.melody", 0x000, 0x100, BAD_DUMP CRC(ce2a0e03) SHA1(cb7e4c64639579349aa944e4bfff7b05cf49ce0e) ) // decap needed for verification - - ROM_REGION( 541218, "screen", 0) - ROM_LOAD( "gnw_popeyep.svg", 0, 541218, CRC(ad93aa24) SHA1(b02c1fec1d8388878b5f21887f19aa5007b8ae43) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong Jr. (model CJ-93) - * PCB labels: CJ-93 M (main board), CJ-93C (controller board) - * Sharp SM511 label CJ-93 539D (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD, and a new wide screen version which is - a different game. - - The tabletop version was also licensed to Coleco. - -***************************************************************************/ - -class gnw_dkjrp_state : public hh_sm510_state -{ -public: - gnw_dkjrp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkjrp(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkjrp ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkjrp_state::gnw_dkjrp(machine_config &config) -{ - sm511_common(config, 1920, 1049); -} - -// roms - -ROM_START( gnw_dkjrp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cj-93.program", 0x0000, 0x1000, CRC(a2cd5a91) SHA1(33f6fd1530e5522491851f16d7c9f928b2dbdc3b) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cj-93.melody", 0x000, 0x100, BAD_DUMP CRC(99fbf76a) SHA1(15ba1af51bebc316146eb9a0a3d58d28f644d45f) ) // decap needed for verification - - ROM_REGION( 340751, "screen", 0) - ROM_LOAD( "gnw_dkjrp.svg", 0, 340751, CRC(eb3cb98b) SHA1(5b148557d3ade2e2050ddde879a6cc05e119b446) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Bombs Away (model TB-94) - * PCB labels: TB-94 M (main board), SM-91C (controller board) - * Sharp SM511 label TB-94 537C (no decap) - * inverted lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mbaway_state : public hh_sm510_state -{ -public: - gnw_mbaway_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mbaway(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mbaway ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Up/Down - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mbaway_state::gnw_mbaway(machine_config &config) -{ - sm511_common(config, 1920, 1031); -} - -// roms - -ROM_START( gnw_mbaway ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tb-94.program", 0x0000, 0x1000, CRC(11d18a48) SHA1(afccfa19dace7c4fcc15a84ecfcfb9d7ae3861e4) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "tb-94.melody", 0x000, 0x100, BAD_DUMP CRC(60d98353) SHA1(8789d7cd39111fe01848a89748ab91731de5caef) ) // decap needed for verification - - ROM_REGION( 514643, "screen", 0) - ROM_LOAD( "gnw_mbaway.svg", 0, 514643, CRC(2ec2f18b) SHA1(8e2fd20615d867aac97e443fb977513ff98138b4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey Mouse (model DC-95), - Nintendo Game & Watch: Donkey Kong Circus (model MK-96) - * PCB labels: DC-95M (main board), DC-95C (controller board) - * Sharp SM511 - - label DC-95 284C (Mickey Mouse) (no decap) - - label DC-95 541D (Donkey Kong Circus) (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version of Mickey Mouse. There's also a wide screen - version which is a different game. - - DC-95 and MK-96 are the same game, it's assumed that the latter was for - regions where Nintendo wasn't able to license from Disney. - -***************************************************************************/ - -class gnw_mmousep_state : public hh_sm510_state -{ -public: - gnw_mmousep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mmousep(machine_config &config); - void gnw_dkcirc(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mmousep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mmousep_state::gnw_mmousep(machine_config &config) -{ - sm511_common(config, 1920, 1122); -} - -void gnw_mmousep_state::gnw_dkcirc(machine_config &config) -{ - sm511_common(config, 1920, 1107); -} - -// roms - -ROM_START( gnw_mmousep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dc-95.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dc-95.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification - - ROM_REGION( 275609, "screen", 0) - ROM_LOAD( "gnw_mmousep.svg", 0, 275609, CRC(bac13689) SHA1(3ddcb4416bc5b8615b2854434ef78acac204a583) ) -ROM_END - -ROM_START( gnw_dkcirc ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk-96.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mk-96.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification - - ROM_REGION( 367718, "screen", 0) - ROM_LOAD( "gnw_dkcirc.svg", 0, 367718, CRC(f8571437) SHA1(bc000267deab83dfd460aea5c4102a23ac51f169) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong Jr. (model DJ-101) - * Sharp SM510 label DJ-101 52ZA (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a tabletop version that - plays more like the arcade game. - -***************************************************************************/ - -class gnw_dkjr_state : public hh_sm510_state -{ -public: - gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkjr(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkjr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkjr_state::gnw_dkjr(machine_config &config) -{ - sm510_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkjr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) ) - - ROM_REGION( 281202, "screen", 0) - ROM_LOAD( "gnw_dkjr.svg", 0, 281202, CRC(f8b18d58) SHA1(fa8321b3d8f81685da763d66fc148d339e6bcd55) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Cement Factory (model ML-102) - * Sharp SM510 label ML-102 298D (die label CMS54C, KMS577) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a tabletop version. - -***************************************************************************/ - -class gnw_mariocm_state : public hh_sm510_state -{ -public: - gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariocm(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariocm ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariocm_state::gnw_mariocm(machine_config &config) -{ - sm510_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_mariocm ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) ) - - ROM_REGION( 302983, "screen", 0) - ROM_LOAD( "gnw_mariocm.svg", 0, 302983, CRC(32ed7941) SHA1(ce7c5ae7a179ec9bcd17db7d7a27780801f7c1cb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Manhole (model NH-103) - * PCB label NH-103 - * Sharp SM510 label NH-103 538A (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a Gold Series version - (MH-06). The two games are using different MCU types so this version seems - to be a complete rewrite. - -***************************************************************************/ - -class gnw_manhole_state : public hh_sm510_state -{ -public: - gnw_manhole_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_manhole(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_manhole ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_manhole_state::gnw_manhole(machine_config &config) -{ - sm510_common(config, 1560, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_manhole ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "nh-103", 0x0000, 0x1000, CRC(ec03acf7) SHA1(b74ae672d8f8a155b2ea4ecee9afbaed95ec0ceb) ) - - ROM_REGION( 223414, "screen", 0) - ROM_LOAD( "gnw_manhole.svg", 0, 223414, CRC(774d806b) SHA1(acb730d8e397eb29988a353e0a9db8ae69913117) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Tropical Fish (model TF-104) - * PCB label TF-104 - * Sharp SM510 label TF-104 8739A (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_tfish_state : public hh_sm510_state -{ -public: - gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_tfish(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_tfish ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_tfish_state::gnw_tfish(machine_config &config) -{ - sm510_common(config, 1572, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_tfish ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) ) - - ROM_REGION( 257396, "screen", 0) - ROM_LOAD( "gnw_tfish.svg", 0, 257396, CRC(6f457a30) SHA1(0b748c9573ff96b99f4fa0adb17d218e89b56d3f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Super Mario Bros. (model: see below) - * PCB label YM-801 (Crystal Screen), YM-105 (New Wide Screen) - * Sharp SM511 - - label YM-801 8034A (crystal screen) (not dumped yet) - - label YM-105 9024B (new wide screen version) (die label ?) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model YM-801), rereleased on - New Wide Screen in 1988 (model YM-105). It was also a prize in a Nintendo - game contest in 1987 (model YM-901-S). In YM-801, Mario looks like the - ones in ML-102 and MW-56. In YM-901-S and YM-105 he looks more detailed. - Until further proof, it's assumed that the ROM is the same for each model. - -***************************************************************************/ - -class gnw_smb_state : public hh_sm510_state -{ -public: - gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_smb(machine_config &config); - void gnw_smbn(machine_config & config); -}; - -// config - -static INPUT_PORTS_START( gnw_smb ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_smb_state::gnw_smb(machine_config &config) -{ - sm511_common(config, 1768, 1080); -} - -void gnw_smb_state::gnw_smbn(machine_config &config) -{ - sm511_common(config, 1677, 1080); -} - -// roms - -ROM_START( gnw_smb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ym-801.program", 0x0000, 0x1000, BAD_DUMP CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ym-801.melody", 0x000, 0x100, BAD_DUMP CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) // dumped from NWS version - - ROM_REGION( 342106, "screen", 0) - ROM_LOAD( "gnw_smb.svg", 0, 342106, CRC(243224ac) SHA1(9b7f41abe4e340e32893ff1ef6e4d696deadc637) ) -ROM_END - -ROM_START( gnw_smbn ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) - - ROM_REGION( 648313, "screen", 0) - ROM_LOAD( "gnw_smbn.svg", 0, 648313, CRC(5808c793) SHA1(06b90993eb9db2a1909509f99ebf00e27c20dcad) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Climber Crystal Screen (model DR-802), - Nintendo Game & Watch: Climber New Wide Screen (model DR-106) - * PCB label DR-802 (Crystal Screen), DR-106 (New Wide Screen) - * Sharp SM511 - - label DR-802 8626A (crystal screen) (not dumped yet) - - label DR-106 9038B (new wide screen version) (no decap) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model DR-802), rereleased on - New Wide Screen in 1988 (model DR-106). The graphic LCD elements look the same - in both versions but the display aspect ratio and the graphical background is - slightly different. Until further proof, it's assumed that the ROM is the same - for both models. - -***************************************************************************/ - -class gnw_climber_state : public hh_sm510_state -{ -public: - gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_climber(machine_config &config); - void gnw_climbern(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_climber ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_climber_state::gnw_climber(machine_config &config) -{ - sm511_common(config, 1756, 1080); -} - -void gnw_climber_state::gnw_climbern(machine_config &config) -{ - sm511_common(config, 1677, 1080); -} - -// roms - -ROM_START( gnw_climber ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dr-802.program", 0x0000, 0x1000, BAD_DUMP CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dr-802.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // dumped from NWS version - - ROM_REGION( 564868, "screen", 0) - ROM_LOAD( "gnw_climber.svg", 0, 564868, CRC(a50ebd1c) SHA1(51047db960c8f110c1b681347cf8efd1d6263b85) ) -ROM_END - -ROM_START( gnw_climbern ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // decap needed for verification - - ROM_REGION( 542453, "screen", 0) - ROM_LOAD( "gnw_climbern.svg", 0, 542453, CRC(2ded966e) SHA1(7e9c99d372b6e547b9b3e789dca9dee60455a427) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Balloon Fight Crystal Screen (model BF-803), - Nintendo Game & Watch: Balloon Fight New Wide Screen (model BF-107) - * PCB labels - - DR-802-2 (Crystal Screen) - - DR-106 (new wide screen version) - * Sharp SM511 - - label BF-803 8646A (crystal screen) (not dumped yet) - - label BF-107 9031B (new wide screen version) (no decap) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model BF-803), rereleased on - New Wide Screen in 1988 (model BF-107). The graphic LCD elements look the same - in both versions but the graphical background is slightly different. - Until further proof, it's assumed that the ROM is the same for both models. - - The PCB design for the different editions seems to be shared with the - corresponding editions of Climber. - -***************************************************************************/ - -class gnw_bfight_state : public hh_sm510_state -{ -public: - gnw_bfight_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bfight(machine_config &config); - void gnw_bfightn(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bfight ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Eject - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_bfight_state::gnw_bfight(machine_config &config) -{ - sm511_common(config, 1771, 1080); -} - -void gnw_bfight_state::gnw_bfightn(machine_config &config) -{ - sm511_common(config, 1549, 1080); -} - -// roms - -ROM_START( gnw_bfight ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bf-803.program", 0x0000, 0x1000, BAD_DUMP CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bf-803.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // dumped from NWS version - - ROM_REGION( 586453, "screen", 0) - ROM_LOAD( "gnw_bfight.svg", 0, 586453, CRC(40d81b65) SHA1(96ed909647229cfde6d733ba10d54ace29e5618a) ) -ROM_END - -ROM_START( gnw_bfightn ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // decap needed for verification - - ROM_REGION( 558496, "screen", 0) - ROM_LOAD( "gnw_bfightn.svg", 0, 558496, CRC(c488000e) SHA1(f9a042799a1489f83b07a91827b8b421238a67e8) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario The Juggler (model MB-108) - * PCB label MB-108 - * Sharp SM511 label MB-108 9209B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mariotj_state : public hh_sm510_state -{ -public: - gnw_mariotj_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariotj(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariotj ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariotj_state::gnw_mariotj(machine_config &config) -{ - sm511_common(config, 1630, 1080); -} - -// roms - -ROM_START( gnw_mariotj ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb-108.program", 0x0000, 0x1000, CRC(f7118bb4) SHA1(c3117fd009e4686a149f85fb65786ddffc091eeb) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mb-108.melody", 0x000, 0x100, BAD_DUMP CRC(d8cc1f74) SHA1(4bbb470ef01777b0c1dbd7b84dc560da6d3b87e7) ) // decap needed for verification - - ROM_REGION( 210391, "screen", 0) - ROM_LOAD( "gnw_mariotj.svg", 0, 210391, CRC(8f1e6118) SHA1(4ecad443142330470384659af1e8dd59bca519e4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Spitball Sparky (model BU-201) - * PCB label BU-201 - * Sharp SM510 label BU-201 542A (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_ssparky_state : public hh_sm510_state -{ -public: - gnw_ssparky_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_ssparky(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ssparky ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Shooter - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_ssparky_state::gnw_ssparky(machine_config &config) -{ - sm510_common(config, 627, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ssparky ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bu-201", 0x0000, 0x1000, CRC(ae0d28e7) SHA1(1427cca1f3aaf3ef6fc3499171a5220428d9894f) ) - - ROM_REGION( 136929, "screen", 0) - ROM_LOAD( "gnw_ssparky.svg", 0, 136929, CRC(66e5d586) SHA1(b666f675abb8edef65ff402e8bc9a5213b630851) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Crab Grab (model UD-202) - * PCB label UD-202 - * Sharp SM510 label UD-202 542B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_cgrab_state : public hh_sm510_state -{ -public: - gnw_cgrab_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_cgrab(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_cgrab ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Do not release crabs (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_cgrab_state::gnw_cgrab(machine_config &config) -{ - sm510_common(config, 609, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_cgrab ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ud-202", 0x0000, 0x1000, CRC(65e97963) SHA1(f6d589fac337e2c4acdaa8f1281912feabc54198) ) - - ROM_REGION( 354770, "screen", 0) - ROM_LOAD( "gnw_cgrab.svg", 0, 354770, CRC(d61478aa) SHA1(8dd44cfb3720740150defdfbebe0bd52a3b3a377) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Boxing (model BX-301) - * Sharp SM511 label BX-301 287C (die label KMS73B, KMS744) - * wide lcd screen with custom segments, 1-bit sound - - Also known as Punch-Out!! in the USA. - -***************************************************************************/ - -class gnw_boxing_state : public hh_sm510_state -{ -public: - gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_boxing(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( microvs_shared ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( gnw_boxing ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "P2 Decrease Health (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Health (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_boxing_state::gnw_boxing(machine_config &config) -{ - sm511_common(config, 1920, 524); -} - -// roms - -ROM_START( gnw_boxing ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) ) - - ROM_REGION( 265217, "screen", 0) - ROM_LOAD( "gnw_boxing.svg", 0, 265217, CRC(306c733e) SHA1(8c80df1295ff0889e16ef9a14e45b27a6ebaa9a2) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Donkey Kong 3 (model AK-302) - * PCB label AK-302M - * Sharp SM511 label AK-302 299D (no decap) - * wide lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong3_state : public hh_sm510_state -{ -public: - gnw_dkong3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong3 ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong3_state::gnw_dkong3(machine_config &config) -{ - sm511_common(config, 1920, 563); -} - -// roms - -ROM_START( gnw_dkong3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ak-302.program", 0x0000, 0x1000, CRC(ed59c15e) SHA1(94f6ce23677d2150c9f86c4b1954f5f531693b21) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ak-302.melody", 0x000, 0x100, BAD_DUMP CRC(8b8f3d55) SHA1(54ebdeff4dd56a8bc2cd39bca1deada14bb90cce) ) // decap needed for verification - - ROM_REGION( 292480, "screen", 0) - ROM_LOAD( "gnw_dkong3.svg", 0, 292480, CRC(980d2486) SHA1(8578bdf4a3814401d9a79867252ee09ed7df253c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Donkey Kong Hockey (model HK-303) - * PCB label HK-303M - * Sharp SM511 label HK-303 57XD (no decap) - * wide lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkhockey_state : public hh_sm510_state -{ -public: - gnw_dkhockey_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkhockey(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkhockey ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Any Goal Scores 10 Points (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P2 Goals Scores No Points (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkhockey_state::gnw_dkhockey(machine_config &config) -{ - sm511_common(config, 1920, 579); -} - -// roms - -ROM_START( gnw_dkhockey ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "hk-303.program", 0x0000, 0x1000, CRC(dc73eec7) SHA1(daaca286de326321335fd26d9b435b444787f609) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "hk-303.melody", 0x000, 0x100, BAD_DUMP CRC(3f61032c) SHA1(b0fd9077fb5e59ca2787c828c78c35116c48c245) ) // decap needed for verification - - ROM_REGION( 263239, "screen", 0) - ROM_LOAD( "gnw_dkhockey.svg", 0, 263239, CRC(3a576c12) SHA1(9a7ca67c35fcfb5858227f3ef2a6027c877c64d3) ) -ROM_END - - - - - -/*************************************************************************** - - Telko Bassmate Computer (model BM-501) - * PCB label BM-501 - * Sharp SM511 label BM-501 556AA (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - - The Bassmate Computer was produced for Telko by Nintendo as an OEM product - and sold under different brands, i.e. Telko, KMV and Probe 2000. - - The hardware is identical as G&W Multi Screen, but it's not part of the game - series. - -***************************************************************************/ - -class bassmate_state : public hh_sm510_state -{ -public: - bassmate_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void bassmate(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( bassmate ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Compute") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Wind") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Cover") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time of Day") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Temp F") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Clarity") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Structure") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Depth(ft)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Season") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Skip Compute Animation (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void bassmate_state::bassmate(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1253/2, 1920/2, 1273/2); -} - -// roms - -ROM_START( bassmate ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bm-501.program", 0x0000, 0x1000, CRC(9bdd0501) SHA1(986b3b84184a987ae383c325700df21d8915f0e2) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bm-501.melody", 0x000, 0x100, BAD_DUMP CRC(fbe15600) SHA1(8be64792fffe5b8913a55b9b2624dd57dc238be7) ) // decap needed for verification - - ROM_REGION( 42305, "screen_top", 0) - ROM_LOAD( "bassmate_top.svg", 0, 42305, CRC(0cc056fe) SHA1(4d0e5b115adf513f5b3148ca7e39e0acbafd925c) ) - - ROM_REGION( 19775, "screen_bottom", 0) - ROM_LOAD( "bassmate_bottom.svg", 0, 19775, CRC(9561d52d) SHA1(903ef3944810c0efdc02f46a619891c1ef17c483) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Double Dribble - * Sharp SM510 under epoxy (die label CMS54C, KMS584) - * lcd screen with custom segments, 1-bit sound - - BTANB: At the basket, the ball goes missing sometimes for 1 frame, or - may show 2 balls at the same time. It's the same on the real handheld. - BTANB: players flicker (increasing LCD delay won't improve it much) - Another BTANB? If a period is over at the same time a defender on the - 2nd column grabs the ball, his arm won't be erased until it's redrawn. - -***************************************************************************/ - -class kdribble_state : public hh_sm510_state -{ -public: - kdribble_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kdribble(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kdribble ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Level Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kdribble_state::kdribble(machine_config &config) -{ - sm510_common(config, 1524, 1080); // R mask option confirmed -} - -// roms - -ROM_START( kdribble ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) ) - - ROM_REGION( 450349, "screen", 0) - ROM_LOAD( "kdribble.svg", 0, 450349, CRC(0ea4153e) SHA1(b5deb398bb9f5e56e5bbcbe477d54528fb989487) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Top Gun - * PCB label BH003 - * Sharp SM510 under epoxy (die label CMS54C, KMS598) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ktopgun_state : public hh_sm510_state -{ -public: - ktopgun_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void ktopgun(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ktopgun ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void ktopgun_state::ktopgun(machine_config &config) -{ - sm510_common(config, 1515, 1080); // R mask option confirmed -} - -// roms - -ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) - - ROM_REGION( 425839, "screen", 0) - ROM_LOAD( "ktopgun.svg", 0, 425839, CRC(f0eb200f) SHA1(cbdc7cfaf1785b393c806dabd1a355d325bddc3f) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Contra - * PCB label BH002 - * Sharp SM511 under epoxy (die label KMS73B, KMS773) - * lcd screen with custom segments, 1-bit sound - - Contra handheld is titled simply "C" in the USA. - -***************************************************************************/ - -class kcontra_state : public hh_sm510_state -{ -public: - kcontra_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: score digit flickers - m_decay_len = 20; - } - - void kcontra(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kcontra ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kcontra_state::kcontra(machine_config &config) -{ - sm511_common(config, 1505, 1080); -} - -// roms - -ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) ) - - ROM_REGION( 721055, "screen", 0) - ROM_LOAD( "kcontra.svg", 0, 721055, CRC(f1ce8d19) SHA1(7d8f2fac40605a3fd6f1386c945a53412b2f2b15) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Teenage Mutant Ninja Turtles - * PCB label BH005 - * Sharp SM511 under epoxy (die label KMS73B, KMS774) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ktmnt_state : public hh_sm510_state -{ -public: - ktmnt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void ktmnt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ktmnt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void ktmnt_state::ktmnt(machine_config &config) -{ - sm511_common(config, 1505, 1080); -} - -// roms - -ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) ) - - ROM_REGION( 610309, "screen", 0) - ROM_LOAD( "ktmnt.svg", 0, 610309, CRC(9f48c50d) SHA1(917c0ed8e83d949e5115c897cacda8d60e42d74d) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Gradius - * PCB label BH004 - * Sharp SM511 under epoxy (die label KMS73B, KMS774) - * lcd screen with custom segments, 1-bit sound - - Known in Japan as Nemesis. - -***************************************************************************/ - -class kgradius_state : public hh_sm510_state -{ -public: - kgradius_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kgradius(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kgradius ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kgradius_state::kgradius(machine_config &config) -{ - sm511_common(config, 1420, 1080); -} - -// roms - -ROM_START( kgradius ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) ) - - ROM_REGION( 638136, "screen", 0) - ROM_LOAD( "kgradius.svg", 0, 638136, CRC(85dd296e) SHA1(bd75d0c08387a69bbcf4fd100252846499a261b3) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Lone Ranger - * PCB label BH009 - * Sharp SM511 under epoxy (die label KMS73B, KMS781) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kloneran_state : public hh_sm510_state -{ -public: - kloneran_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kloneran(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kloneran ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kloneran_state::kloneran(machine_config &config) -{ - sm511_common(config, 1497, 1080); -} - -// roms - -ROM_START( kloneran ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) ) - - ROM_REGION( 633161, "screen", 0) - ROM_LOAD( "kloneran.svg", 0, 633161, CRC(1fb937ff) SHA1(9e5841dc67e50b789f0161693ebbd75f79915980) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Blades of Steel - * PCB label BH011 - * Sharp SM511 under epoxy (die label KMS73B, KMS782) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kblades_state : public hh_sm510_state -{ -public: - kblades_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 25; - } - - void kblades(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kblades ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kblades_state::kblades(machine_config &config) -{ - sm511_common(config, 1516, 1080); -} - -// roms - -ROM_START( kblades ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) ) - - ROM_REGION( 455154, "screen", 0) - ROM_LOAD( "kblades.svg", 0, 455154, CRC(f17ec8ba) SHA1(ed999ef4b3f0ae94c243219ea8ea1eedd7179c26) ) -ROM_END - - - - - -/*************************************************************************** - - Konami NFL Football - * Sharp SM511 under epoxy (die label KMS73B, KMS786) - * lcd screen with custom segments, 1-bit sound - - This is the 1989 version. It was rereleased in 1992, assumed to be the same - game underneath. - -***************************************************************************/ - -class knfl_state : public hh_sm510_state -{ -public: - knfl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 35; - } - - void knfl(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( knfl ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void knfl_state::knfl(machine_config &config) -{ - sm511_common(config, 1449, 1080); -} - -// roms - -ROM_START( knfl ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) ) - - ROM_REGION( 571173, "screen", 0) - ROM_LOAD( "knfl.svg", 0, 571173, CRC(406c5bed) SHA1(1f3a704f091b78c89c06108ba11310f4072cc178) ) -ROM_END - - - - - -/*************************************************************************** - - Konami The Adventures of Bayou Billy - * Sharp SM511 under epoxy (die label KMS73B, KMS788) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kbilly_state : public hh_sm510_state -{ -public: - kbilly_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kbilly(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kbilly ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kbilly_state::kbilly(machine_config &config) -{ - sm511_common(config, 1490, 1080); -} - -// roms - -ROM_START( kbilly ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) ) - - ROM_REGION( 598317, "screen", 0) - ROM_LOAD( "kbilly.svg", 0, 598317, CRC(fec67ddf) SHA1(3e5f520733e8b720966028ed6a72062be5381f27) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Bucky O'Hare - * Sharp SM511 under epoxy (die label KMS73B, N58) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kbucky_state : public hh_sm510_state -{ -public: - kbucky_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kbucky(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kbucky ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kbucky_state::kbucky(machine_config &config) -{ - sm511_common(config, 1490, 1080); -} - -// roms - -ROM_START( kbucky ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) ) - - ROM_REGION( 727879, "screen", 0) - ROM_LOAD( "kbucky.svg", 0, 727879, CRC(64cde7e6) SHA1(60c0120c7955a694bb07eb013e42c7a71757ab9f) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Garfield - * Sharp SM511 under epoxy (die label KMS73B, N62) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kgarfld_state : public hh_sm510_state -{ -public: - kgarfld_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 30; - } - - void kgarfld(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kgarfld ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kgarfld_state::kgarfld(machine_config &config) -{ - sm511_common(config, 1500, 1080); -} - -// roms - -ROM_START( kgarfld ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) ) - - ROM_REGION( 581147, "screen", 0) - ROM_LOAD( "kgarfld.svg", 0, 581147, CRC(ef2e5a61) SHA1(fbf0236cd0d4228403823d2623c6fd2d68349f7a) ) -ROM_END - - - - - -/*************************************************************************** - - Nelsonic Game Watches on SM530*, wristwatch with an LCD game on it. - *: Older games are on a different MCU, several seen with OKI MSM5055. - Newer ones: to be investigated, maybe SM5x. - - Hardware notes: - * Sharp SM530 under epoxy (die label KAS600 + ROM serial, see romdefs) - * lcd screen with custom segments, 1-bit sound - - Currently emulated in generic driver: - - Super Mario Bros. 3 - - Super Mario World (aka Super Mario Bros. 4) - - Different hardware: - - Star Fox (extra sound effect chip) - -***************************************************************************/ - -class gamewatch_state : public hh_sm510_state -{ -public: - gamewatch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void nsmb3(machine_config &config); - void nsmw(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gamewatch ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // mode - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // set - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY -INPUT_PORTS_END - -void gamewatch_state::nsmb3(machine_config &config) -{ - sm530_common(config, 1000, 1000); - config.set_default_layout(layout_hh_sm500_test); -} - -void gamewatch_state::nsmw(machine_config &config) -{ - sm530_common(config, 1000, 1000); - config.set_default_layout(layout_hh_sm500_test); -} - -// roms - -ROM_START( nsmb3 ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "633.program", 0x000, 0x800, CRC(a981b540) SHA1(1271d15e6168d73852f8ade9ade4d5f3b1838bf5) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "633.melody", 0x000, 0x100, CRC(98340c46) SHA1(94b5865fc669b7f6487845647866c06f4f581f63) ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "nsmb3.svg", 0, 100000, NO_DUMP ) -ROM_END - -ROM_START( nsmw ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "636.program", 0x000, 0x800, CRC(56a705fa) SHA1(384ba68e597c7901cc9db2eb991cb80049113503) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "636.melody", 0x000, 0x100, CRC(5df99e13) SHA1(98d5f78b5bcf59a232ccb5c61210568948c4501b) ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "nsmw.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Nelsonic Star Fox (Game Watch) - * Sharp SM530 under epoxy (die label KAS600, 643) - * sound effect chip under epoxy (die label HMC, HA1152_001A) - * lcd screen with custom segments, 1-bit sound - - Two versions are known, with different shape/button layout, but assumed - to be the exact same game. - - The HMC sound effect chip is very similar (possibly the same one) as found - in electronic toys such as the Executor keychain. There are 8 sound effects - in the ROM, only 3 are used in Star Fox. - -***************************************************************************/ - -class nstarfox_state : public hh_sm510_state -{ -public: - nstarfox_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void nstarfox(machine_config &config); - -private: - void sound_w(u8 data); -}; - -// handlers - -void nstarfox_state::sound_w(u8 data) -{ - // S2-S4: falling edge starts sound effect -} - -// config - -static INPUT_PORTS_START( nstarfox ) - PORT_INCLUDE( gamewatch ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // laser - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // bomb -INPUT_PORTS_END - -void nstarfox_state::nstarfox(machine_config &config) -{ - sm530_common(config, 1176, 1080); - m_maincpu->write_s().set(FUNC(nstarfox_state::sound_w)); -} - -// roms - -ROM_START( nstarfox ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "643.program", 0x000, 0x800, CRC(ac1f5c68) SHA1(165cefeba9abc8725e55d15fdc218b07857d4cfe) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "643.melody", 0x000, 0x100, CRC(6684f6b7) SHA1(32056467f796cb2e3c9f05c364419e7935fd1361) ) - - ROM_REGION( 0x80, "sfx", 0) - ROM_LOAD( "ha1152_001a", 0x00, 0x80, CRC(fba00b7c) SHA1(5dfb15eee3c57bbca80f485f68442e5f7c6bc5e4) ) - - ROM_REGION( 155284, "screen", 0) - ROM_LOAD( "nstarfox.svg", 0, 155284, CRC(843c0fa2) SHA1(bed08fcc8e9fd20624052d91db90923897a1cf7c) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Gauntlet (model 7-778), Robin Hood (model 7-861) - * Sharp SM510 under epoxy (die label CMS54C, KMS583) - * lcd screen with custom segments, 1-bit sound - - known releases (Gauntlet): - - World: Gauntlet, published by Tiger - - Japan: Gauntlet, published by Sega - - UK: Gauntlet, published by Grandstand - - Robin Hood is the same MCU/ROM, different LCD. - -***************************************************************************/ - -class tgaunt_state : public hh_sm510_state -{ -public: - tgaunt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobhood(machine_config &config); - void tgaunt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgaunt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Bomb") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Key") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( trobhood ) - PORT_INCLUDE( tgaunt ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Money") -INPUT_PORTS_END - -void tgaunt_state::tgaunt(machine_config &config) -{ - sm510_tiger(config, 1425, 1080); -} - -void tgaunt_state::trobhood(machine_config &config) -{ - sm510_tiger(config, 1468, 1080); -} - -// roms - -ROM_START( tgaunt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) - - ROM_REGION( 713071, "screen", 0) - ROM_LOAD( "tgaunt.svg", 0, 713071, CRC(b2dfb31b) SHA1(3e57c6aaa665e2874e6e7e051245a81ab7a917b3) ) -ROM_END - -ROM_START( trobhood ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) - - ROM_REGION( 704816, "screen", 0) - ROM_LOAD( "trobhood.svg", 0, 704816, CRC(f4b94f32) SHA1(8f68a7f4240489d42934d3875f82456aceabfb48) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Double Dragon (model 7-780) - * Sharp SM510 under epoxy (die label CMS54C, KMS570, 593) - * lcd screen with custom segments, 1-bit sound - - BTANB: On the baddie in the background throwing dynamite, the sparks - above his head are the same segment as the body, not the arm. - -***************************************************************************/ - -class tddragon_state : public hh_sm510_state -{ -public: - tddragon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tddragon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tddragon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sway") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tddragon_state::tddragon(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); // R mask option confirmed -} - -// roms - -ROM_START( tddragon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) ) - - ROM_REGION( 511477, "screen", 0) - ROM_LOAD( "tddragon.svg", 0, 511477, CRC(d3046671) SHA1(15fd328e28362402eab1094851dddd8e20a0bcec) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Karnov (model 7-783) - * Sharp SM510 under epoxy (die label CMS54C, KMS582) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tkarnov_state : public hh_sm510_state -{ -public: - tkarnov_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tkarnov(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tkarnov ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire-Ball") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Boomerang") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tkarnov_state::tkarnov(machine_config &config) -{ - sm510_tiger(config, 1477, 1080); -} - -// roms - -ROM_START( tkarnov ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) ) - - ROM_REGION( 527432, "screen", 0) - ROM_LOAD( "tkarnov.svg", 0, 527432, CRC(9317066c) SHA1(087cfde97e106c6fd8c52d3a1138e6bde2ad9289) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Vindicators (model 7-786) - * Sharp SM510 under epoxy (die label CMS54C, KMS595) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tvindictr_state : public hh_sm510_state -{ -public: - tvindictr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tvindictr(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tvindictr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tvindictr_state::tvindictr(machine_config &config) -{ - sm510_tiger(config, 1459, 1080); -} - -// roms - -ROM_START( tvindictr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) ) - - ROM_REGION( 314205, "screen", 0) - ROM_LOAD( "tvindictr.svg", 0, 314205, CRC(fefe9f31) SHA1(3c8e7ab2cd81de72740b2948def07a2fc000a78a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Ninja Gaiden (model 7-787) - * Sharp SM510 under epoxy (die label M82) - * lcd screen with custom segments, 1 led, 1-bit sound - -***************************************************************************/ - -class tgaiden_state : public hh_sm510_state -{ -public: - tgaiden_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag), - m_led_out(*this, "led") - { - inp_fixed_last(); - } - - void tgaiden(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // R2 connects to a single LED behind the screen - void led_w(u8 data) { m_led_out = data >> 1 & 1; } - output_finder<> m_led_out; -}; - -void tgaiden_state::machine_start() -{ - hh_sm510_state::machine_start(); - m_led_out.resolve(); -} - -// config - -static INPUT_PORTS_START( tgaiden ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgaiden_state::tgaiden(machine_config &config) -{ - sm510_tiger(config, 1476, 1080); - m_maincpu->write_r().append(FUNC(tgaiden_state::led_w)); -} - -// roms - -ROM_START( tgaiden ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) ) - - ROM_REGION( 588916, "screen", 0) - ROM_LOAD( "tgaiden.svg", 0, 588916, CRC(5845c630) SHA1(c4b0d4d85e4b58a051920b6b34668847049c57a7) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman (model 7-799) - * Sharp SM510 under epoxy (die label CMS54C, KMS597) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbatman_state : public hh_sm510_state -{ -public: - tbatman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatman ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatman_state::tbatman(machine_config &config) -{ - sm510_tiger(config, 1442, 1080); -} - -// roms - -ROM_START( tbatman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) ) - - ROM_REGION( 551931, "screen", 0) - ROM_LOAD( "tbatman.svg", 0, 551931, CRC(95ae104b) SHA1(0508f925f29b2152b41c478447e63c74fce718ad) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Space Harrier II (model 7-814) - * Sharp SM510 under epoxy (die label M91) - * lcd screen with custom segments, 1-bit sound - - known releases: - - World: Space Harrier II, published by Tiger - - Japan: Space Harrier, published by Sega - -***************************************************************************/ - -class tsharr2_state : public hh_sm510_state -{ -public: - tsharr2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsharr2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsharr2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsharr2_state::tsharr2(machine_config &config) -{ - sm510_tiger(config, 1493, 1080); // R mask option confirmed -} - -// roms - -ROM_START( tsharr2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) ) - - ROM_REGION( 555177, "screen", 0) - ROM_LOAD( "tsharr2.svg", 0, 555177, CRC(842f8f7e) SHA1(2c523531059acdfa3a0cebac9d8f84f1971e1086) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Strider (model 7-815) - * Sharp SM510 under epoxy (die label M92) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tstrider_state : public hh_sm510_state -{ -public: - tstrider_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tstrider(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tstrider ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Weapon") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tstrider_state::tstrider(machine_config &config) -{ - sm510_tiger(config, 1479, 1080); -} - -// roms - -ROM_START( tstrider ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) ) - - ROM_REGION( 554858, "screen", 0) - ROM_LOAD( "tstrider.svg", 0, 554858, CRC(12767799) SHA1(9d67a96affee18dacaf3d49d89f60940c33492aa) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Golden Axe (model 7-817) - * Sharp SM510 under epoxy (die label M94) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tgoldnaxe_state : public hh_sm510_state -{ -public: - tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tgoldnaxe(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgoldnaxe ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Magic") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgoldnaxe_state::tgoldnaxe(machine_config &config) -{ - sm510_tiger(config, 1456, 1080); -} - -// roms - -ROM_START( tgoldnaxe ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) ) - - ROM_REGION( 605525, "screen", 0) - ROM_LOAD( "tgoldnaxe.svg", 0, 605525, CRC(9c1097c5) SHA1(bf9c2a1f4ae98ebe5eb9d381b0729588a150fa27) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Robocop 2 (model 7-830), The Rocketeer (model 7-864) - * Sharp SM510 under epoxy (die label M96) - * lcd screen with custom segments, 1-bit sound - - The Rocketeer is the same MCU/ROM, different LCD. - -***************************************************************************/ - -class trobocop2_state : public hh_sm510_state -{ -public: - trobocop2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobocop2(machine_config &config); - void trockteer(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trobocop2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( trockteer ) - PORT_INCLUDE( trobocop2 ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Up/Rocket Pack") - - PORT_MODIFY("IN.3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Right") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Left") -INPUT_PORTS_END - -void trobocop2_state::trobocop2(machine_config &config) -{ - sm510_tiger(config, 1487, 1080); -} - -void trobocop2_state::trockteer(machine_config &config) -{ - sm510_tiger(config, 1463, 1080); -} - -// roms - -ROM_START( trobocop2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) - - ROM_REGION( 463572, "screen", 0) - ROM_LOAD( "trobocop2.svg", 0, 463572, CRC(0218c1d9) SHA1(2932825ca03e008e5c2993882d363ae00df43f26) ) -ROM_END - -ROM_START( trockteer ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) - - ROM_REGION( 558128, "screen", 0) - ROM_LOAD( "trockteer.svg", 0, 558128, CRC(70ff1f46) SHA1(5cd94655654614206ed11844ba31650edb51eb22) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Altered Beast (model 7-831) - * Sharp SM510 under epoxy (die label M88) - * lcd screen with custom segments, 1-bit sound - - known releases: - - World: Altered Beast, published by Tiger - - Japan: Juuouki, published by Sega - -***************************************************************************/ - -class taltbeast_state : public hh_sm510_state -{ -public: - taltbeast_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void taltbeast(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( taltbeast ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick/Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void taltbeast_state::taltbeast(machine_config &config) -{ - sm510_tiger(config, 1455, 1080); // R mask option confirmed -} - -// roms - -ROM_START( taltbeast ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) ) - - ROM_REGION( 667931, "screen", 0) - ROM_LOAD( "taltbeast.svg", 0, 667931, CRC(a642d5f7) SHA1(ad005deaa35189e59317a07d860403adeef51aad) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Street Fighter 2010 - The Final Fight (model 7-837) - * Sharp SM510 under epoxy (die label MA2) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsf2010_state : public hh_sm510_state -{ -public: - tsf2010_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsf2010(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsf2010 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select Planet") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsf2010_state::tsf2010(machine_config &config) -{ - sm510_tiger(config, 1465, 1080); -} - -// roms - -ROM_START( tsf2010 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) ) - - ROM_REGION( 595191, "screen", 0) - ROM_LOAD( "tsf2010.svg", 0, 595191, CRC(78f96bad) SHA1(4389580e3d47dda0243b01625427013eb7ec4336) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Swamp Thing (model 7-851) - * Sharp SM510 under epoxy (die label MB0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tswampt_state : public hh_sm510_state -{ -public: - tswampt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tswampt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tswampt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tswampt_state::tswampt(machine_config &config) -{ - sm510_tiger(config, 1450, 1080); -} - -// roms - -ROM_START( tswampt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) ) - - ROM_REGION( 578544, "screen", 0) - ROM_LOAD( "tswampt.svg", 0, 578544, CRC(921e2b43) SHA1(176426fe9bf4855256e0ff7804ca48e619fa0cf3) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Spider-Man (model 7-853) - * Sharp SM510 under epoxy (die label MA5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tspidman_state : public hh_sm510_state -{ -public: - tspidman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tspidman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tspidman ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right/Kick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up/Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left/Rescue") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tspidman_state::tspidman(machine_config &config) -{ - sm510_tiger(config, 1440, 1080); -} - -// roms - -ROM_START( tspidman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) ) - - ROM_REGION( 605375, "screen", 0) - ROM_LOAD( "tspidman.svg", 0, 605375, CRC(6c032ce4) SHA1(69043096e28709821ddc26ef05f60f353fc3e35d) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger X-Men (model 7-854) - * Sharp SM510 under epoxy (die label MA7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class txmen_state : public hh_sm510_state -{ -public: - txmen_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void txmen(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( txmen ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Claws") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void txmen_state::txmen(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( txmen ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) ) - - ROM_REGION( 543273, "screen", 0) - ROM_LOAD( "txmen.svg", 0, 543273, CRC(039b37bb) SHA1(bd57cba8f380185beda2eb5ea7b5d1f25c8d447b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Double Dragon 3 - The Rosetta Stone (model 7-858) - * Sharp SM510 under epoxy (die label MA6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tddragon3_state : public hh_sm510_state -{ -public: - tddragon3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tddragon3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tddragon3 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tddragon3_state::tddragon3(machine_config &config) -{ - sm510_tiger(config, 1514, 1080); -} - -// roms - -ROM_START( tddragon3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) ) - - ROM_REGION( 615734, "screen", 0) - ROM_LOAD( "tddragon3.svg", 0, 615734, CRC(4c94d574) SHA1(e2717db6c0279da4813550f0035a23bdaaa8b7bb) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Flash (model 7-859) - * Sharp SM510 under epoxy (die label MB5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tflash_state : public hh_sm510_state -{ -public: - tflash_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tflash(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tflash ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Brake") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Run") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tie") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tflash_state::tflash(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tflash ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) ) - - ROM_REGION( 587863, "screen", 0) - ROM_LOAD( "tflash.svg", 0, 587863, CRC(8ddb9391) SHA1(fa8b4610a914de8ae95123c4273a12cdb4353a39) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger MC Hammer: U Can't Touch This (model 7-863) - * Sharp SM511 under epoxy (die label N63) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tmchammer_state : public hh_sm510_state -{ -public: - tmchammer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tmchammer(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tmchammer ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Up") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Up/Jump") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Right") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Left") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Down") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tmchammer_state::tmchammer(machine_config &config) -{ - sm511_tiger1bit(config, 1471, 1080); -} - -// roms - -ROM_START( tmchammer ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) ) - - ROM_REGION( 456487, "screen", 0) - ROM_LOAD( "tmchammer.svg", 0, 456487, CRC(1cd10ff3) SHA1(092396c56adae7f872c3b5916ef3ecf67ab30161) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Battletoads (model 7-868) - * Sharp SM510 under epoxy (die label MB3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbtoads_state : public hh_sm510_state -{ -public: - tbtoads_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbtoads(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbtoads ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbtoads_state::tbtoads(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( tbtoads ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) ) - - ROM_REGION( 694417, "screen", 0) - ROM_LOAD( "tbtoads.svg", 0, 694417, CRC(c0fbc25d) SHA1(def54ab2f10123246f7809fc3caf3e9d26800f87) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Hook (model 7-869) - * Sharp SM510 under epoxy (die label MB7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thook_state : public hh_sm510_state -{ -public: - thook_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thook(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thook ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Up") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Down/Dodge") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thook_state::thook(machine_config &config) -{ - sm510_tiger(config, 1489, 1080); -} - -// roms - -ROM_START( thook ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) ) - - ROM_REGION( 680544, "screen", 0) - ROM_LOAD( "thook.svg", 0, 680544, CRC(bddefb9b) SHA1(438b0fe6f4c0196952bd179075498d6bd19c3e48) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Back to the Future (model 7-809) - * Sharp SM510 under epoxy (die label MC3) - * lcd screen with custom segments, 1-bit sound - - This game is from 1992, even though the model number suggests otherwise. - Perhaps Tiger filled unused model numbers before switching to 78-xxx. - -***************************************************************************/ - -class tbttf_state : public hh_sm510_state -{ -public: - tbttf_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbttf(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbttf ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Repair") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbttf_state::tbttf(machine_config &config) -{ - sm510_tiger(config, 1466, 1080); -} - -// roms - -ROM_START( tbttf ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) ) - - ROM_REGION( 667741, "screen", 0) - ROM_LOAD( "tbttf.svg", 0, 667741, CRC(1a57e35a) SHA1(9b622e08cc44e3d48b71a283cd07b89fbcc6faa4) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Addams Family (model 7-829) - * Sharp SM510 under epoxy (die label MC2) - * lcd screen with custom segments, 1-bit sound - - Like Back to the Future, this game is newer than the model number suggests. - -***************************************************************************/ - -class taddams_state : public hh_sm510_state -{ -public: - taddams_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void taddams(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( taddams ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Take") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void taddams_state::taddams(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( taddams ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) ) - - ROM_REGION( 554703, "screen", 0) - ROM_LOAD( "taddams.svg", 0, 554703, CRC(85f15123) SHA1(088dbfbe760b782988bbfe6d29d89b8427844992) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Home Alone (model 78-502) - * Sharp SM510 under epoxy (die label MC7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thalone_state : public hh_sm510_state -{ -public: - thalone_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thalone(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thalone ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thalone_state::thalone(machine_config &config) -{ - sm510_tiger(config, 1448, 1080); -} - -// roms - -ROM_START( thalone ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) ) - - ROM_REGION( 494279, "screen", 0) - ROM_LOAD( "thalone.svg", 0, 494279, CRC(2479d88d) SHA1(061413d6e0893106b335ca42cf0260f45c7dacc7) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger X-Men - Project X (model 78-504) - * Sharp SM510 under epoxy (die label MD3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class txmenpx_state : public hh_sm510_state -{ -public: - txmenpx_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void txmenpx(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( txmenpx ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Move") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void txmenpx_state::txmenpx(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( txmenpx ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) ) - - ROM_REGION( 572583, "screen", 0) - ROM_LOAD( "txmenpx.svg", 0, 572583, CRC(b98f3134) SHA1(78ac7cd32b36f214b5e6eada725378ccbca91987) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Home Alone 2 - Lost in New York (model 78-506) - * Sharp SM510 under epoxy (die label MD7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thalone2_state : public hh_sm510_state -{ -public: - thalone2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thalone2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thalone2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thalone2_state::thalone2(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( thalone2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) ) - - ROM_REGION( 748928, "screen", 0) - ROM_LOAD( "thalone2.svg", 0, 748928, CRC(d42ec743) SHA1(7df9654b7f700662f29ca7cabe25ac78b2c4b04b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sonic The Hedgehog (model 78-513) - * Sharp SM511 under epoxy (die label KMS73B, N71) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tsonic_state : public hh_sm510_state -{ -public: - tsonic_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsonic(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsonic ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump Up - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Super Sonic Spin - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsonic_state::tsonic(machine_config &config) -{ - sm511_tiger2bit(config, 1517, 1080); -} - -// roms - -ROM_START( tsonic ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) ) - - ROM_REGION( 541491, "screen", 0) - ROM_LOAD( "tsonic.svg", 0, 541491, CRC(ac6bff26) SHA1(fa944958eb64e8283d35951ff105cead28e6ab8a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Robocop 3 (model 78-514) - * Sharp SM510 under epoxy (die label MC6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class trobocop3_state : public hh_sm510_state -{ -public: - trobocop3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobocop3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trobocop3 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Fly") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trobocop3_state::trobocop3(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( trobocop3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) ) - - ROM_REGION( 612142, "screen", 0) - ROM_LOAD( "trobocop3.svg", 0, 612142, CRC(b55c1440) SHA1(e8f692deecf489be22be570510175b750d65d5c5) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Incredible Crash Dummies (model 78-516) - * Sharp SM510 under epoxy (die label ME0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tdummies_state : public hh_sm510_state -{ -public: - tdummies_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tdummies(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tdummies ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Crash") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tdummies_state::tdummies(machine_config &config) -{ - sm510_tiger(config, 1441, 1080); -} - -// roms - -ROM_START( tdummies ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) ) - - ROM_REGION( 525535, "screen", 0) - ROM_LOAD( "tdummies.svg", 0, 525535, CRC(b0db8655) SHA1(937b3edd9c0949b9f7d01ef8920ac63b61e64909) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Street Fighter II (model 78-522) - * Sharp SM510 under epoxy (die label ME1) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsfight2_state : public hh_sm510_state -{ -public: - tsfight2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsfight2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsfight2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Special Move") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsfight2_state::tsfight2(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tsfight2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) ) - - ROM_REGION( 630444, "screen", 0) - ROM_LOAD( "tsfight2.svg", 0, 630444, CRC(42b82c9b) SHA1(8e18d0cfd629478973f2c857105daad70eae46d9) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Wayne's World (model 78-523) - * Sharp SM510 under epoxy (die label ME7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class twworld_state : public hh_sm510_state -{ -public: - twworld_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void twworld(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( twworld ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("High Five") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Cassandra") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void twworld_state::twworld(machine_config &config) -{ - sm510_tiger(config, 1429, 1080); -} - -// roms - -ROM_START( twworld ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) ) - - ROM_REGION( 527901, "screen", 0) - ROM_LOAD( "twworld.svg", 0, 527901, CRC(515fede8) SHA1(e9c5adfb02b860fb97968957f282e685b1a4e3bc) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Jurassic Park (model 78-524) - * Sharp SM510 under epoxy (die label MF4) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tjpark_state : public hh_sm510_state -{ -public: - tjpark_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tjpark(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tjpark ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Climb") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing/Power") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Forward") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tjpark_state::tjpark(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( tjpark ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) ) - - ROM_REGION( 812619, "screen", 0) - ROM_LOAD( "tjpark.svg", 0, 812619, CRC(04d85ec6) SHA1(97f67bb496d985b62dc094f6f1d6b5597a4df895) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sonic The Hedgehog 2 (model 78-527) - * Sharp SM511 under epoxy (die label N86) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tsonic2_state : public hh_sm510_state -{ -public: - tsonic2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsonic2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsonic2 ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsonic2_state::tsonic2(machine_config &config) -{ - sm511_tiger2bit(config, 1475, 1080); -} - -// roms - -ROM_START( tsonic2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) ) - - ROM_REGION( 667927, "screen", 0) - ROM_LOAD( "tsonic2.svg", 0, 667927, CRC(d2c52e67) SHA1(24ffbc8fae606dcd2f60a4d95fe1dcfd261c3576) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Super Double Dragon (model 78-528) - * Sharp SM510 under epoxy (die label MF5) - * lcd screen with custom segments, 1-bit sound - - BTANB: The player char right arm muscle is part of the right kick segment. - They probably meant to use it for the right punch segment, but this is - how it shows on the LCD. - -***************************************************************************/ - -class tsddragon_state : public hh_sm510_state -{ -public: - tsddragon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsddragon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsddragon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Special Technique") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsddragon_state::tsddragon(machine_config &config) -{ - sm510_tiger(config, 1503, 1080); -} - -// roms - -ROM_START( tsddragon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) ) - - ROM_REGION( 753572, "screen", 0) - ROM_LOAD( "tsddragon.svg", 0, 753572, CRC(0759388b) SHA1(4e4acb1b97845e529522ba21de846ce1dc74357d) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Dennis the Menace (model 78-532) - * Sharp SM510 under epoxy (die label MF9) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tdennis_state : public hh_sm510_state -{ -public: - tdennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tdennis(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tdennis ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Left") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tdennis_state::tdennis(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( tdennis ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) ) - - ROM_REGION( 754896, "screen", 0) - ROM_LOAD( "tdennis.svg", 0, 754896, CRC(6e7512c3) SHA1(b84ef988051a6a883f3435a779ea67e544d50dae) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Nightmare Before Christmas (model 78-537) - * Sharp SM510 under epoxy (die label MG0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tnmarebc_state : public hh_sm510_state -{ -public: - tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tnmarebc(machine_config &config); - -private: - virtual void input_w(u8 data) override; -}; - -// handlers - -void tnmarebc_state::input_w(u8 data) -{ - // S5 and S6 tied together - hh_sm510_state::input_w((data & 0x1f) | (data >> 1 & 0x10)); -} - -// config - -static INPUT_PORTS_START( tnmarebc ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5/S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tnmarebc_state::tnmarebc(machine_config &config) -{ - sm510_tiger(config, 1456, 1080); -} - -// roms - -ROM_START( tnmarebc ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) ) - - ROM_REGION( 631351, "screen", 0) - ROM_LOAD( "tnmarebc.svg", 0, 631351, CRC(140e278b) SHA1(f0d2b6e6ee2328f54255532ad03d5d505ebbb23b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Transformers - Generation 2 (model 78-541) - * Sharp SM510 under epoxy (die label MG2) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ttransf2_state : public hh_sm510_state -{ -public: - ttransf2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void ttransf2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ttransf2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Transform") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void ttransf2_state::ttransf2(machine_config &config) -{ - sm510_tiger(config, 1476, 1080); -} - -// roms - -ROM_START( ttransf2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) ) - - ROM_REGION( 727708, "screen", 0) - ROM_LOAD( "ttransf2.svg", 0, 727708, CRC(bd527f23) SHA1(9ce35bbfe1ea61c431eccaf32274faa4181587da) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Operation: Aliens (model 78-552) - * Sharp SM510 under epoxy (die label MJ1) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class topaliens_state : public hh_sm510_state -{ -public: - topaliens_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void topaliens(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( topaliens ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void topaliens_state::topaliens(machine_config &config) -{ - sm510_tiger(config, 1450, 1080); -} - -// roms - -ROM_START( topaliens ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) ) - - ROM_REGION( 1214917, "screen", 0) - ROM_LOAD( "topaliens.svg", 0, 1214917, CRC(cbd57ab4) SHA1(efac0833f421212a81a8fc9b35c97369375aa1a9) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Mortal Kombat (model 78-553) - * Sharp SM510 under epoxy (die label MG6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tmkombat_state : public hh_sm510_state -{ -public: - tmkombat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tmkombat(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tmkombat ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch High") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick High") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Low") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Low") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tmkombat_state::tmkombat(machine_config &config) -{ - sm510_tiger(config, 1468, 1080); -} - -// roms - -ROM_START( tmkombat ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) ) - - ROM_REGION( 841871, "screen", 0) - ROM_LOAD( "tmkombat.svg", 0, 841871, CRC(3bd5a963) SHA1(4d093f34c64caf60233e156fe160d8fceb15b6c6) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Shadow (model 78-559) - * Sharp SM510 under epoxy (die label MJ5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tshadow_state : public hh_sm510_state -{ -public: - tshadow_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tshadow(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tshadow ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shadow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tshadow_state::tshadow(machine_config &config) -{ - sm510_tiger(config, 1484, 1080); -} - -// roms - -ROM_START( tshadow ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) ) - - ROM_REGION( 946494, "screen", 0) - ROM_LOAD( "tshadow.svg", 0, 946494, CRC(e62de82e) SHA1(94fcef33066e97266efcd0d91b60229859088b36) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Skeleton Warriors - The Dark Crusade (model 78-569) - * Sharp SM510 under epoxy (die label MK0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tskelwarr_state : public hh_sm510_state -{ -public: - tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tskelwarr(machine_config &); -}; - -// config - -static INPUT_PORTS_START( tskelwarr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tskelwarr_state::tskelwarr(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tskelwarr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) ) - - ROM_REGION( 1125043, "screen", 0) - ROM_LOAD( "tskelwarr.svg", 0, 1125043, CRC(ee086073) SHA1(70e06a7fe8a1a8b8fee483c08522996da9917501) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman Forever - Double Dose of Doom (model 78-572) - * Sharp SM510 under epoxy (die label MK3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbatfor_state : public hh_sm510_state -{ -public: - tbatfor_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatfor(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatfor ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Grappling Gun") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Help") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Batarang") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatfor_state::tbatfor(machine_config &config) -{ - sm510_tiger(config, 1493, 1080); -} - -// roms - -ROM_START( tbatfor ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) ) - - ROM_REGION( 902412, "screen", 0) - ROM_LOAD( "tbatfor.svg", 0, 902412, CRC(d92d799e) SHA1(fa8b4198099748570a9cc9772c81aa583ac7ea72) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Judge Dredd (model 78-581) - * Sharp SM510 under epoxy (die label MK5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tjdredd_state : public hh_sm510_state -{ -public: - tjdredd_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tjdredd(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tjdredd ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tjdredd_state::tjdredd(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tjdredd ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) ) - - ROM_REGION( 1051637, "screen", 0) - ROM_LOAD( "tjdredd.svg", 0, 1051637, CRC(0f3541c6) SHA1(9838e2ae5806a48be595f53e6096b7c150b91651) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Apollo 13 (model 78-591) - * Sharp SM510 under epoxy (die label 10 07) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tapollo13_state : public hh_sm510_state -{ -public: - tapollo13_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tapollo13(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tapollo13 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Parachute") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Capture") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tapollo13_state::tapollo13(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( tapollo13 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) ) - - ROM_REGION( 643219, "screen", 0) - ROM_LOAD( "tapollo13.svg", 0, 643219, CRC(f4b94141) SHA1(d67367212f2be1685de0f3acaebaae0dc67734c4) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger 007: GoldenEye (model 78-594) - * Sharp SM510 under epoxy (die label 10 06) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tgoldeye_state : public hh_sm510_state -{ -public: - tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tgoldeye(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgoldeye ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Q") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgoldeye_state::tgoldeye(machine_config &config) -{ - sm510_tiger(config, 1461, 1080); -} - -// roms - -ROM_START( tgoldeye ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) ) - - ROM_REGION( 938956, "screen", 0) - ROM_LOAD( "tgoldeye.svg", 0, 938956, CRC(c4ad9836) SHA1(23555bd5fdaebed190ce02054a8ee681c88a8afb) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Kazaam (model 78-613) - * Sharp SM510 under epoxy (die label KMS10, 18) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tkazaam_state : public hh_sm510_state -{ -public: - tkazaam_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tkazaam(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tkazaam ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Rescue") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Back") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tkazaam_state::tkazaam(machine_config &config) -{ - sm510_tiger(config, 1452, 1080); // no external XTAL -} - -// roms - -ROM_START( tkazaam ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_18", 0x0000, 0x1000, CRC(aa796372) SHA1(fdaea736e1df46c19fca08ed981e9659e038d15a) ) - - ROM_REGION( 929109, "screen", 0) - ROM_LOAD( "tkazaam.svg", 0, 929109, CRC(5eb178d4) SHA1(bcf64df4f342d16d5fd3d4cb503fceb1e5485591) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Space Jam (model 78-621) - * Sharp SM510 under epoxy (die label KMS10, 23) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsjam_state : public hh_sm510_state -{ -public: - tsjam_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsjam(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsjam ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Block") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tune/Steal") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsjam_state::tsjam(machine_config &config) -{ - sm510_tiger(config, 1421, 1080); // no external XTAL -} - -// roms - -ROM_START( tsjam ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) ) - - ROM_REGION( 1046158, "screen", 0) - ROM_LOAD( "tsjam.svg", 0, 1046158, CRC(29187365) SHA1(f277a064e6ecd6219c930736a0bdf56196279b42) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Independence Day (model 78-624) - * Sharp SM510 under epoxy (die label 10 16) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tinday_state : public hh_sm510_state -{ -public: - tinday_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tinday(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tinday ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alert") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Velocity") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tinday_state::tinday(machine_config &config) -{ - sm510_tiger(config, 1463, 1080); -} - -// roms - -ROM_START( tinday ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) ) - - ROM_REGION( 1162716, "screen", 0) - ROM_LOAD( "tinday.svg", 0, 1162716, CRC(97056e62) SHA1(0348f0aca5d9b8e24f83c7e73b5e31f419fe60df) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman: The Animated Series (model 72-505) - * Sharp SM511 under epoxy (die label N81) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tbatmana_state : public hh_sm510_state -{ -public: - tbatmana_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatmana(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatmana ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fast") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw/Attack") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatmana_state::tbatmana(machine_config &config) -{ - sm511_tiger2bit(config, 1478, 1080); -} - -// roms - -ROM_START( tbatmana ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) ) - - ROM_REGION( 618872, "screen", 0) - ROM_LOAD( "tbatmana.svg", 0, 618872, CRC(8c721273) SHA1(d8c52441466943254bffcd6449af47a9fad6296b) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica Shuttle Voyage (MG-8) - * Sharp SM510 label 0019 238E TRONICA (no decap) - * lcd screen with custom segments, 1-bit sound - - Even though the serial is MG-8, the back of the game says 1983, newer than MG-9? - Thief in Garden (model TG-18) is the exact same MCU, but different graphics. - -***************************************************************************/ - -class trshutvoy_state : public hh_sm510_state -{ -public: - trshutvoy_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trshutvoy(machine_config &config); - void tigarden(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trshutvoy ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F - - PORT_START("IN.7") // S8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("FAKE") // Up/Sound are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") -INPUT_PORTS_END - -void trshutvoy_state::trshutvoy(machine_config &config) -{ - sm510_common(config, 1496, 1080); // R mask option confirmed -} - -void trshutvoy_state::tigarden(machine_config &config) -{ - sm510_common(config, 1515, 1080); -} - -// roms - -ROM_START( trshutvoy ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) - - ROM_REGION( 221748, "screen", 0) - ROM_LOAD( "trshutvoy.svg", 0, 221748, CRC(9e630b4e) SHA1(7e2a3a82519f29f7b1b92930604e010b5b9fdb06) ) -ROM_END - -ROM_START( tigarden ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) - - ROM_REGION( 409134, "screen", 0) - ROM_LOAD( "tigarden.svg", 0, 409134, CRC(628f4aee) SHA1(5fa4843be61b52660a932e0d1efad403cf12de88) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica: Space Rescue (model MG-9), Thunder Ball (model FR-23) - * PCB labels: SPACE RESCUE MG-9 080492 (MG-9) - SPACE RESCUE MG-9 210982 (FR-23) - * Sharp SM510 labels (no decap): 0015 224B TRONICA (MG-9) - 0015 236D TRONICA (FR-23) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class trsrescue_state : public hh_sm510_state -{ -public: - trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trsrescue(machine_config &config); - void trthuball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trsrescue ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trsrescue_state::trsrescue(machine_config &config) -{ - sm510_common(config, 1533, 1080); // R mask option confirmed -} - -void trsrescue_state::trthuball(machine_config &config) -{ - sm510_common(config, 1599, 1080); // R mask option confirmed -} - -// roms - -ROM_START( trsrescue ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) - - ROM_REGION( 178760, "screen", 0) - ROM_LOAD( "trsrescue.svg", 0, 178760, CRC(40756fd3) SHA1(9762ebbe4753a3194d7f0844c91addb8e1f8930b) ) -ROM_END - -ROM_START( trthuball ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0015_236d", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) - - ROM_REGION( 175018, "screen", 0) - ROM_LOAD( "trthuball.svg", 0, 175018, CRC(3404cc1d) SHA1(4cebe3c742c6947c6fddb8a84ae2f7d0cea1b527) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica: Space Mission (model SM-11), Spider (model SG-21) - * PCB labels: SPACE MISSION SM-11 250582 (SM-11) - SPACE MISSION SM-11 220982 (SG-21) - * Sharp SM5A labels (no decap): 0126 228B TRONICA (SM-11) - 0126 22YC TRONICA (SG-21) - * lcd screen with custom segments, 1-bit sound - - SM-11 and SG-21 are the exact same MCU, but with different graphics. - - In 1983, Tronica released a second revision of SG-21 with different graphic - overlays. This version can be distinguished by having the year 1983 labeled - on the backside of the unit. - -***************************************************************************/ - -class trspacmis_state : public hh_sm510_state -{ -public: - trspacmis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trspacmis(machine_config &config); - void trspider(machine_config & config); -}; - -// config - -static INPUT_PORTS_START( trspacmis ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trspacmis_state::trspacmis(machine_config &config) -{ - sm5a_common(config, 1601, 1080); // R mask option confirmed -} - -void trspacmis_state::trspider(machine_config &config) -{ - sm5a_common(config, 1597, 1080); // R mask option confirmed -} - -// roms - -ROM_START( trspacmis ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "0126_228b", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) - - ROM_REGION( 106675, "screen", 0) - ROM_LOAD( "trspacmis.svg", 0, 106675, CRC(45d7b798) SHA1(db08fef21462507a115547ecf8eac38260a0c868) ) -ROM_END - -ROM_START( trspider ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "0126_22yc", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) - - ROM_REGION( 130534, "screen", 0) - ROM_LOAD( "trspider.svg", 0, 130534, CRC(d3f00245) SHA1(348c47dbe87ce8537c9b1c91d0d8bbf0809546e8) ) -ROM_END - - - - - -/*************************************************************************** - - Elektronika Автослалом (Autoslalom) (model ИМ-23) - * KB1013VK1-2 MCU - * lcd screen with custom segments, 1-bit sound - - This is not an unlicensed clone, but doing a hex compare with MC-25 - still shows around 30% similarity so clearly they used that as a base. - -***************************************************************************/ - -class auslalom_state : public hh_sm510_state -{ -public: - auslalom_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void auslalom(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( auslalom ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Запуск (Start)") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Скорость (Speed)") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void auslalom_state::auslalom(machine_config &config) -{ - kb1013vk12_common(config, 1732, 1080); // R mask option ? -} - -// roms - -ROM_START( auslalom ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-23.bin", 0x0000, 0x0740, CRC(3b6e726f) SHA1(eabd04722811d1cc6519db9386b14a535f5aa865) ) - - ROM_REGION( 117520, "screen", 0) - ROM_LOAD( "auslalom.svg", 0, 117520, CRC(2f90fd4c) SHA1(f0de58b1fe2f7c18fc219f9f9a94c227ca1245e4) ) -ROM_END - - - - - -/*************************************************************************** - - VTech Electronic Number Muncher - * Sharp SM511 under epoxy (die label 772) - * lcd screen with custom segments(no background), 1-bit sound - -***************************************************************************/ - -class nummunch_state : public hh_sm510_state -{ -public: - nummunch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void nummunch(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( nummunch ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CHANGED_CB(input_changed) PORT_NAME("Calc. / Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CHANGED_CB(input_changed) PORT_NAME("Count") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHANGED_CB(input_changed) PORT_NAME("Quiz") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose +") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose -") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ÷") - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CHANGED_CB(input_changed) PORT_NAME("Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHANGED_CB(input_changed) PORT_NAME("Right") - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") - - PORT_START("IN.7") // S8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) -INPUT_PORTS_END - -void nummunch_state::nummunch(machine_config &config) -{ - sm511_common(config, 1920, 875); -} - -// roms - -ROM_START( nummunch ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "772.program", 0x0000, 0x1000, CRC(2f7ff516) SHA1(132e7c5c4d69170953b2e51731992d6d6ba829f9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "772.melody", 0x000, 0x100, CRC(96fe463a) SHA1(dcef5eee15a3f6d21e0db1b8ae3fbddc81633fc8) ) - - ROM_REGION( 140704, "screen", 0) - ROM_LOAD( "nummunch.svg", 0, 140704, CRC(050301d7) SHA1(3671d0e1b0cc788d74df0c6adb57a01729f66d7c) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT COMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS - -// Nintendo G&W: Silver/Gold (initial series is uncategorized, "Silver" was made up later) -CONS( 1980, gnw_ball, 0, 0, gnw_ball, gnw_ball, gnw_ball_state, empty_init, "Nintendo", "Game & Watch: Ball", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_flagman, 0, 0, gnw_flagman, gnw_flagman, gnw_flagman_state, empty_init, "Nintendo", "Game & Watch: Flagman", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_vermin, 0, 0, gnw_vermin, gnw_vermin, gnw_vermin_state, empty_init, "Nintendo", "Game & Watch: Vermin", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_fires, 0, 0, gnw_fires, gnw_fires, gnw_fires_state, empty_init, "Nintendo", "Game & Watch: Fire (Silver)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, gnw_judge, 0, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (purple version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_judgeo, gnw_judge, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (green version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, gnw_manholeg, 0, 0, gnw_manholeg, gnw_manholeg, gnw_manholeg_state, empty_init, "Nintendo", "Game & Watch: Manhole (Gold)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_helmet, 0, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-17)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_helmeto, gnw_helmet, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-07)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_lion, 0, 0, gnw_lion, gnw_lion, gnw_lion_state, empty_init, "Nintendo", "Game & Watch: Lion", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Wide Screen -CONS( 1981, gnw_pchute, 0, 0, gnw_pchute, gnw_pchute, gnw_pchute_state, empty_init, "Nintendo", "Game & Watch: Parachute", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_octopus, 0, 0, gnw_octopus, gnw_octopus, gnw_octopus_state, empty_init, "Nintendo", "Game & Watch: Octopus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_popeye, 0, 0, gnw_popeye, gnw_popeye, gnw_popeye_state, empty_init, "Nintendo", "Game & Watch: Popeye (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_chef, 0, 0, gnw_chef, gnw_chef, gnw_chef_state, empty_init, "Nintendo", "Game & Watch: Chef", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_mmouse, 0, 0, gnw_mmouse, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_egg, gnw_mmouse, 0, gnw_egg, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Egg", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_fire, 0, 0, gnw_fire, gnw_fire, gnw_fire_state, empty_init, "Nintendo", "Game & Watch: Fire (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_tbridge, 0, 0, gnw_tbridge, gnw_tbridge, gnw_tbridge_state, empty_init, "Nintendo", "Game & Watch: Turtle Bridge", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_fireatk, 0, 0, gnw_fireatk, gnw_fireatk, gnw_fireatk_state, empty_init, "Nintendo", "Game & Watch: Fire Attack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_stennis, 0, 0, gnw_stennis, gnw_stennis, gnw_stennis_state, empty_init, "Nintendo", "Game & Watch: Snoopy Tennis", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Multi Screen -CONS( 1982, gnw_opanic, 0, 0, gnw_opanic, gnw_opanic, gnw_opanic_state, empty_init, "Nintendo", "Game & Watch: Oil Panic", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_dkong, 0, 0, gnw_dkong, gnw_dkong, gnw_dkong_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_mickdon, 0, 0, gnw_mickdon, gnw_mickdon, gnw_mickdon_state, empty_init, "Nintendo", "Game & Watch: Mickey & Donald", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_ghouse, 0, 0, gnw_ghouse, gnw_ghouse, gnw_ghouse_state, empty_init, "Nintendo", "Game & Watch: Green House", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_dkong2, 0, 0, gnw_dkong2, gnw_dkong2, gnw_dkong2_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mario, 0, 0, gnw_mario, gnw_mario, gnw_mario_state, empty_init, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_rshower, 0, 0, gnw_rshower, gnw_rshower, gnw_rshower_state, empty_init, "Nintendo", "Game & Watch: Rain Shower", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_lboat, 0, 0, gnw_lboat, gnw_lboat, gnw_lboat_state, empty_init, "Nintendo", "Game & Watch: Life Boat", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_pinball, 0, 0, gnw_pinball, gnw_pinball, gnw_pinball_state, empty_init, "Nintendo", "Game & Watch: Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1985, gnw_bjack, 0, 0, gnw_bjack, gnw_bjack, gnw_bjack_state, empty_init, "Nintendo", "Game & Watch: Black Jack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_squish, 0, 0, gnw_squish, gnw_squish, gnw_squish_state, empty_init, "Nintendo", "Game & Watch: Squish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1987, gnw_bsweep, 0, 0, gnw_bsweep, gnw_bsweep, gnw_bsweep_state, empty_init, "Nintendo", "Game & Watch: Bomb Sweeper", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_sbuster, 0, 0, gnw_sbuster, gnw_sbuster, gnw_sbuster_state, empty_init, "Nintendo", "Game & Watch: Safe Buster", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_gcliff, 0, 0, gnw_gcliff, gnw_gcliff, gnw_gcliff_state, empty_init, "Nintendo", "Game & Watch: Gold Cliff", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, gnw_zelda, 0, 0, gnw_zelda, gnw_zelda, gnw_zelda_state, empty_init, "Nintendo", "Game & Watch: Zelda", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: New Wide Screen / Crystal Screen -CONS( 1982, gnw_dkjr, 0, 0, gnw_dkjr, gnw_dkjr, gnw_dkjr_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mariocm, 0, 0, gnw_mariocm, gnw_mariocm, gnw_mariocm_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_manhole, 0, 0, gnw_manhole, gnw_manhole, gnw_manhole_state, empty_init, "Nintendo", "Game & Watch: Manhole (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1985, gnw_tfish, 0, 0, gnw_tfish, gnw_tfish, gnw_tfish_state, empty_init, "Nintendo", "Game & Watch: Tropical Fish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_smb, 0, 0, gnw_smb, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_smbn, gnw_smb, 0, gnw_smbn, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_climber, 0, 0, gnw_climber, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_climbern, gnw_climber, 0, gnw_climbern, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_bfight, 0, 0, gnw_bfight, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_bfightn, gnw_bfight, 0, gnw_bfightn, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, gnw_mariotj, 0, 0, gnw_mariotj, gnw_mariotj, gnw_mariotj_state, empty_init, "Nintendo", "Game & Watch: Mario The Juggler", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Table Top / Panorama Screen (the first Table Top releases in Japan were called "Color Screen") -CONS( 1983, gnw_mariocmt, 0, 0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // "Another one bites the dust" startup jingle -CONS( 1983, gnw_mariocmta,gnw_mariocmt,0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72A)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // Plays an alternate jingle when starting a game -CONS( 1983, gnw_snoopyp, 0, 0, gnw_snoopyp, gnw_snoopyp, gnw_snoopyp_state, empty_init, "Nintendo", "Game & Watch: Snoopy (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_popeyep, 0, 0, gnw_popeyep, gnw_popeyep, gnw_popeyep_state, empty_init, "Nintendo", "Game & Watch: Popeye (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_dkjrp, 0, 0, gnw_dkjrp, gnw_dkjrp, gnw_dkjrp_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mbaway, 0, 0, gnw_mbaway, gnw_mbaway, gnw_mbaway_state, empty_init, "Nintendo", "Game & Watch: Mario's Bombs Away", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_mmousep, 0, 0, gnw_mmousep, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkcirc, gnw_mmousep, 0, gnw_dkcirc, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Circus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Super Color -CONS( 1984, gnw_ssparky, 0, 0, gnw_ssparky, gnw_ssparky, gnw_ssparky_state, empty_init, "Nintendo", "Game & Watch: Spitball Sparky", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_cgrab, 0, 0, gnw_cgrab, gnw_cgrab, gnw_cgrab_state, empty_init, "Nintendo", "Game & Watch: Crab Grab", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Micro Vs. System (actually, no official Game & Watch logo anywhere) -CONS( 1984, gnw_boxing, 0, 0, gnw_boxing, gnw_boxing, gnw_boxing_state, empty_init, "Nintendo", "Micro Vs. System: Boxing", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkong3, 0, 0, gnw_dkong3, gnw_dkong3, gnw_dkong3_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong 3", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkhockey, 0, 0, gnw_dkhockey, gnw_dkhockey, gnw_dkhockey_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong Hockey", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W hardware licensed to other companies (not part of G&W series) -CONS( 1984, bassmate, 0, 0, bassmate, bassmate, bassmate_state, empty_init, "Telko / Nintendo", "Bassmate Computer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Elektronika (mostly G&W clones) -CONS( 1988, taynyoke, gnw_octopus, 0, taynyoke, gnw_octopus, gnw_octopus_state, empty_init, "bootleg (Elektronika)", "Tayny okeana", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, vespovar, gnw_chef, 0, vespovar, gnw_chef, gnw_chef_state, empty_init, "bootleg (Elektronika)", "Vesyolyy povar", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, nupogodi, gnw_mmouse, 0, nupogodi, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nu, pogodi!", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, ehockey, gnw_mmouse, 0, ehockey, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Hockey (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, rkosmosa, gnw_mmouse, 0, rkosmosa, rkosmosa, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Razvedchiki kosmosa", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, okhota, gnw_mmouse, 0, okhota, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Okhota", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, biathlon, gnw_mmouse, 0, biathlon, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Biathlon", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, vfutbol, gnw_mmouse, 0, vfutbol, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Vesyolye futbolisty", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, krybolov, gnw_mmouse, 0, krybolov, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kot-rybolov (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kvakazad, gnw_mmouse, 0, kvakazad, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kvaka-zadavaka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, nochnyev, gnw_mmouse, 0, nochnyev, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nochnye vorishki", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, kosmicpt, gnw_mmouse, 0, kosmicpt, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy polyot", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, morataka, gnw_mmouse, 0, morataka, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Morskaja ataka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, atakaast, gnw_mmouse, 0, atakaast, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Ataka asteroidov", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, ecircus, gnw_mmouse, 0, ecircus, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Circus (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kosmicmt, gnw_fire, 0, kosmicmt, gnw_fire, gnw_fire_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy most", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, auslalom, 0, 0, auslalom, auslalom, auslalom_state, empty_init, "Elektronika", "Autoslalom", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Konami -CONS( 1989, kdribble, 0, 0, kdribble, kdribble, kdribble_state, empty_init, "Konami", "Double Dribble (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, ktopgun_state, empty_init, "Konami", "Top Gun (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kcontra, 0, 0, kcontra, kcontra, kcontra_state, empty_init, "Konami", "Contra (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, ktmnt_state, empty_init, "Konami", "Teenage Mutant Ninja Turtles (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kgradius, 0, 0, kgradius, kgradius, kgradius_state, empty_init, "Konami", "Gradius (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kloneran, 0, 0, kloneran, kloneran, kloneran_state, empty_init, "Konami", "Lone Ranger (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kblades, 0, 0, kblades, kblades, kblades_state, empty_init, "Konami", "Blades of Steel (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, knfl, 0, 0, knfl, knfl, knfl_state, empty_init, "Konami", "NFL Football (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kbilly, 0, 0, kbilly, kbilly, kbilly_state, empty_init, "Konami", "The Adventures of Bayou Billy (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, kbucky, 0, 0, kbucky, kbucky, kbucky_state, empty_init, "Konami", "Bucky O'Hare (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, kgarfld, 0, 0, kgarfld, kgarfld, kgarfld_state, empty_init, "Konami", "Garfield (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nelsonic Game Watch series -CONS( 1990, nsmb3, 0, 0, nsmb3, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario Bros. 3 (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -CONS( 1991, nsmw, 0, 0, nsmw, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario World (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -CONS( 1993, nstarfox, 0, 0, nstarfox, nstarfox, nstarfox_state, empty_init, "Nelsonic (licensed from Nintendo)", "Star Fox (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_IMPERFECT_SOUND ) - -// Tiger 7-xxx/78-xxx models -CONS( 1989, tgaunt, 0, 0, tgaunt, tgaunt, tgaunt_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Gauntlet (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, trobhood, tgaunt, 0, trobhood, trobhood, tgaunt_state, empty_init, "Tiger Electronics", "Robin Hood (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tddragon, 0, 0, tddragon, tddragon, tddragon_state, empty_init, "Tiger Electronics (licensed from Technos/Tradewest)", "Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tkarnov, 0, 0, tkarnov, tkarnov, tkarnov_state, empty_init, "Tiger Electronics (licensed from Data East)", "Karnov (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tvindictr, 0, 0, tvindictr, tvindictr, tvindictr_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Vindicators (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tgaiden, 0, 0, tgaiden, tgaiden, tgaiden_state, empty_init, "Tiger Electronics (licensed from Tecmo)", "Ninja Gaiden (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tbatman, 0, 0, tbatman, tbatman, tbatman_state, empty_init, "Tiger Electronics", "Batman (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tsharr2, 0, 0, tsharr2, tsharr2, tsharr2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Space Harrier II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tstrider, 0, 0, tstrider, tstrider, tstrider_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Strider (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tgoldnaxe, 0, 0, tgoldnaxe, tgoldnaxe, tgoldnaxe_state, empty_init, "Tiger Electronics (licensed from Sega)", "Golden Axe (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, trobocop2, 0, 0, trobocop2, trobocop2, trobocop2_state, empty_init, "Tiger Electronics", "Robocop 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, trockteer, trobocop2, 0, trockteer, trockteer, trobocop2_state, empty_init, "Tiger Electronics", "The Rocketeer (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, taltbeast, 0, 0, taltbeast, taltbeast, taltbeast_state, empty_init, "Tiger Electronics (licensed from Sega)", "Altered Beast (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tsf2010, 0, 0, tsf2010, tsf2010, tsf2010_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter 2010 - The Final Fight (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tswampt, 0, 0, tswampt, tswampt, tswampt_state, empty_init, "Tiger Electronics", "Swamp Thing (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tspidman, 0, 0, tspidman, tspidman, tspidman_state, empty_init, "Tiger Electronics", "Spider-Man (Tiger, 1991 version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, txmen, 0, 0, txmen, txmen, txmen_state, empty_init, "Tiger Electronics", "X-Men (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tddragon3, 0, 0, tddragon3, tddragon3, tddragon3_state, empty_init, "Tiger Electronics (licensed from Technos)", "Double Dragon 3 - The Rosetta Stone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tflash, 0, 0, tflash, tflash, tflash_state, empty_init, "Tiger Electronics", "The Flash (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tmchammer, 0, 0, tmchammer, tmchammer, tmchammer_state, empty_init, "Tiger Electronics", "MC Hammer: U Can't Touch This (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tbtoads, 0, 0, tbtoads, tbtoads, tbtoads_state, empty_init, "Tiger Electronics (licensed from Rare/Tradewest)", "Battletoads (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, thook, 0, 0, thook, thook, thook_state, empty_init, "Tiger Electronics", "Hook (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, tbttf, 0, 0, tbttf, tbttf, tbttf_state, empty_init, "Tiger Electronics", "Back to the Future (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, taddams, 0, 0, taddams, taddams, taddams_state, empty_init, "Tiger Electronics", "The Addams Family (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, thalone, 0, 0, thalone, thalone, thalone_state, empty_init, "Tiger Electronics", "Home Alone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, txmenpx, 0, 0, txmenpx, txmenpx, txmenpx_state, empty_init, "Tiger Electronics", "X-Men - Project X (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, thalone2, 0, 0, thalone2, thalone2, thalone2_state, empty_init, "Tiger Electronics", "Home Alone 2 - Lost in New York (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, tsonic, 0, 0, tsonic, tsonic, tsonic_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, trobocop3, 0, 0, trobocop3, trobocop3, trobocop3_state, empty_init, "Tiger Electronics", "Robocop 3 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tdummies, 0, 0, tdummies, tdummies, tdummies_state, empty_init, "Tiger Electronics", "The Incredible Crash Dummies (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsfight2, 0, 0, tsfight2, tsfight2, tsfight2_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, twworld, 0, 0, twworld, twworld, twworld_state, empty_init, "Tiger Electronics", "Wayne's World (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tjpark, 0, 0, tjpark, tjpark, tjpark_state, empty_init, "Tiger Electronics", "Jurassic Park (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsonic2, 0, 0, tsonic2, tsonic2, tsonic2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsddragon, 0, 0, tsddragon, tsddragon, tsddragon_state, empty_init, "Tiger Electronics (licensed from Technos)", "Super Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tdennis, 0, 0, tdennis, tdennis, tdennis_state, empty_init, "Tiger Electronics", "Dennis the Menace (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tnmarebc, 0, 0, tnmarebc, tnmarebc, tnmarebc_state, empty_init, "Tiger Electronics", "Nightmare Before Christmas (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: title has no "The" -CONS( 1993, ttransf2, 0, 0, ttransf2, ttransf2, ttransf2_state, empty_init, "Tiger Electronics", "Transformers - Generation 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, topaliens, 0, 0, topaliens, topaliens, topaliens_state, empty_init, "Tiger Electronics", "Operation: Aliens (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tmkombat, 0, 0, tmkombat, tmkombat, tmkombat_state, empty_init, "Tiger Electronics (licensed from Midway)", "Mortal Kombat (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, tshadow, 0, 0, tshadow, tshadow, tshadow_state, empty_init, "Tiger Electronics", "The Shadow (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, tskelwarr, 0, 0, tskelwarr, tskelwarr, tskelwarr_state, empty_init, "Tiger Electronics", "Skeleton Warriors - The Dark Crusade (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tbatfor, 0, 0, tbatfor, tbatfor, tbatfor_state, empty_init, "Tiger Electronics", "Batman Forever - Double Dose of Doom (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tjdredd, 0, 0, tjdredd, tjdredd, tjdredd_state, empty_init, "Tiger Electronics", "Judge Dredd (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tapollo13, 0, 0, tapollo13, tapollo13, tapollo13_state, empty_init, "Tiger Electronics", "Apollo 13 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tgoldeye, 0, 0, tgoldeye, tgoldeye, tgoldeye_state, empty_init, "Tiger Electronics", "007: GoldenEye (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tkazaam, 0, 0, tkazaam, tkazaam, tkazaam_state, empty_init, "Tiger Electronics", "Kazaam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tsjam, 0, 0, tsjam, tsjam, tsjam_state, empty_init, "Tiger Electronics", "Space Jam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Tiger 72-xxx models -CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Tronica Game Clock series -CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, trthuball, trsrescue, 0, trthuball, trsrescue, trsrescue_state, empty_init, "Tronica", "Thunder Ball (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trspider, trspacmis, 0, trspider, trspacmis, trspacmis_state, empty_init, "Tronica", "Spider (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// misc -CONS( 1989, nummunch, 0, 0, nummunch, nummunch, nummunch_state, empty_init, "VTech", "Electronic Number Muncher", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_sm510.h b/src/mame/handheld/hh_sm510.h deleted file mode 100644 index ad9041ae226..00000000000 --- a/src/mame/handheld/hh_sm510.h +++ /dev/null @@ -1,116 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/* - - Sharp SM5xx family handhelds. - -*/ - -#ifndef MAME_INCLUDES_HH_SM510_H -#define MAME_INCLUDES_HH_SM510_H - -#pragma once - -#include "cpu/sm510/sm510.h" -#include "cpu/sm510/sm511.h" -#include "cpu/sm510/sm530.h" -#include "cpu/sm510/sm5a.h" -#include "sound/spkrdev.h" - - -#define PORT_CHANGED_CB(x) \ - PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, x, 0) - - -class hh_sm510_state : public driver_device -{ -public: - hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0), - m_io_ba(*this, "BA"), - m_io_b(*this, "B"), - m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); - virtual DECLARE_INPUT_CHANGED_MEMBER(acl_button); - -protected: - // devices - required_device m_maincpu; - optional_device m_speaker; - optional_ioport_array<8+1> m_inputs; // max 8 - optional_ioport m_io_ba, m_io_b; - output_finder<16, 16, 4> m_out_x; - - // misc common - u16 m_inp_mux = 0; // multiplexed inputs mask - int m_inp_lines = 0; // number of input mux columns - int m_inp_fixed = -1; // input column fixed to GND/Vdd (-1 means none) - u8 m_speaker_data = 0; // speaker output data(if more than 1 bit) - u8 m_s = 0; // MCU S output pins - u8 m_r = 0; // MCU R output pins - - void inp_fixed_last() { m_inp_fixed = -2; } // last input line to GND - u8 read_inputs(int columns, int fixed = -1); - - virtual void update_k_line(); - virtual void sm510_lcd_segment_w(offs_t offset, u16 data); - virtual void sm500_lcd_segment_w(offs_t offset, u16 data); - virtual u8 input_r(); - virtual void input_w(u8 data); - virtual void piezo_r1_w(u8 data); - virtual void piezo_r2_w(u8 data); - virtual void piezo_input_w(u8 data); - virtual void piezo2bit_r1_w(u8 data); - virtual void piezo2bit_input_w(u8 data); - - // display common - int m_decay_pivot = 8; // lcd segment off-to-on delay in 1kHz ticks (affects input lag) - int m_decay_len = 17; // lcd segment on-to-off delay in 1kHz ticks (lcd persistence) - u8 m_display_x_len = 0; // lcd number of groups - u8 m_display_y_len = 0; // lcd number of segments - u8 m_display_z_len = 0; // lcd number of commons - u32 m_display_state[0x20] = { }; // lcd segment data (max. 5-bit offset) - u8 m_display_decay[0x20][0x20] = { }; // (internal use) - - void set_display_size(u8 x, u8 y, u8 z); - TIMER_CALLBACK_MEMBER(display_decay_tick); - emu_timer *m_display_decay_timer = nullptr; - - virtual void machine_start() override; - virtual void machine_reset() override; - - // machine configs - void mcfg_cpu_common(machine_config &config); - void mcfg_cpu_sm5a(machine_config &config); - void mcfg_cpu_kb1013vk12(machine_config &config); - void mcfg_cpu_sm510(machine_config &config); - void mcfg_cpu_sm511(machine_config &config); - void mcfg_cpu_sm512(machine_config &config); - void mcfg_cpu_sm530(machine_config &config); - void mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag = "screen"); - void mcfg_sound_r1(machine_config &config); - - void sm5a_common(machine_config &config, u16 width, u16 height); - void kb1013vk12_common(machine_config &config, u16 width, u16 height); - void sm510_common(machine_config &config, u16 width, u16 height); - void sm511_common(machine_config &config, u16 width, u16 height); - //void sm512_common(machine_config &config, u16 width, u16 height); - void sm530_common(machine_config &config, u16 width, u16 height); - - void sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight); - void dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm510_tiger(machine_config &config, u16 width, u16 height); - void sm511_tiger1bit(machine_config &config, u16 width, u16 height); - void sm511_tiger2bit(machine_config &config, u16 width, u16 height); -}; - - -#endif // MAME_INCLUDES_HH_SM510_H diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp deleted file mode 100644 index 4ad3d0b2c72..00000000000 --- a/src/mame/handheld/hh_tms1k.cpp +++ /dev/null @@ -1,14465 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -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: -- eva: Chrysler EVA-11 (and EVA-24) -- microvsn: Milton Bradley Microvision -- sag: Entex Select-A-Game Machine - -(contd.) hh_tms1k child drivers: -- tispellb: TI Spelling B series gen. 1 -- tispeak: TI Speak & Spell series gen. 1 - -About the approximated MCU frequency everywhere: The RC osc. is not that -stable on most of these handhelds. When comparing multiple video recordings -of the same game, it shows(and sounds) that the frequency range can differ -up to 50kHz. This is probably exaggerated due to components getting worn out -after many decades. 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. - -ROM source notes when dumped from another publisher, but confident it's the same: -- arrball: Tandy Zingo -- bcheetah: Fundimensions Incredible Brain Buggy -- cmsport: Conic Basketball -- cnbaskb: Cardinal Electronic Basketball -- cnfball: Elecsonic Football -- copycat: Sears Follow Me -- ditto: Tandy Electronic Pocket Repeat -- fxmcr165: Tandy Science Fair Microcomputer Trainer -- ginv1000: Tandy Cosmic 1000 Fire Away -- gjackpot: Entex Electronic Jackpot: Gin Rummy & Black Jack -- gpoker: Entex Electronic Poker -- matchnum: LJN Electronic Concentration -- palmf31: Toshiba BC-8018B -- ti1250: Texas Instruments TI-1200 -- ti25503: Texas Instruments TI-1265 -- ti5100: loose 1979 TMS1073NL chip - -TODO: -- Verify output PLA and microinstructions PLA for MCUs that have been dumped - electronically (mpla is usually the default, opla is often custom). -- unknown MCU clocks for some, especially if no YouTube videos are found -- Fake-press ON button when emulation starts for machines that have it on the - button matrix (doesn't look like any relies on it though). -- t7in1ss: in 2-player mode, game select and skill select can be configured after - selecting a game? Possibly BTANB, players are expected to quickly press the - "First Up" button after the alarm sound. -- bship discrete sound, netlist is documented -- finish bshipb SN76477 sound -- redo internal artwork for the baseball games (embedded SVG for diamond shapes) -- improve elecbowl driver -- tithermos temperature sensor comparator (right now just the digital clock works) -- is alphie(patent) the same as the final version? -- is starwbcp the same as MP3438? (starwbc is MP3438A) - -============================================================================ - -Let's use this driver for a list of known devices and their serials, -excluding most of TI's own products(they normally didn't use "MP" codes). -For TI's calculators, a comprehensive list of MCU serials is available -on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm - - serial device etc. --------------------------------------------------------------------- - @CP0904A TMS0970 1977, Milton Bradley Comp IV - @MP0905B TMS0970 1977, Parker Brothers Codename Sector - *MP0057 TMS1000 1978, APH Student Speech+ (same ROM contents as TSI Speech+?) - @MP0154 TMS1000 1979, Fonas 2 Player Baseball - @MP0158 TMS1000 1979, Entex Soccer (6003) - @MP0163 TMS1000 1979, A-One LSI Match Number/LJN Electronic Concentration - @MP0166 TMS1000 1980, A-One Arrange Ball/LJN Computer Impulse/Tandy Zingo (model 60-2123) - @MP0168 TMS1000 1979, Conic Multisport/Tandy Sports Arena (model 60-2158) - @MP0170 TMS1000 1979, Conic Football - *MP0220 TMS1000 1980, Tomy Teacher - @MP0230 TMS1000 1980, Entex Blast It (6015) - @MP0271 TMS1000 1982, Radio Shack Monkey See - @MP0907 TMS1000 1979, Conic Basketball (101-006) - @MP0908 TMS1000 1979, Conic Electronic I.Q. - *MP0910 TMS1000 1979, Conic Basketball (101-003) - @MP0914 TMS1000 1979, Entex Baseball 1 - @MP0915 TMS1000 1979, Bandai System Control Car: Cheetah/The Incredible Brain Buggy - @MP0919 TMS1000 1979, Tiger Copy Cat (model 7-520) - @MP0920 TMS1000 1979, Entex Space Battle (6004) - @MP0923 TMS1000 1979, Entex Baseball 2 (6002) - *MP1022 TMS1100 1979, Texas Instruments unknown thermostat - @MP1030 TMS1100 1980, APF Mathemagician - *MP1072 TMS1100 198?, unknown device, Germany (have decap) - @MP1133 TMS1470 1979, Kosmos Astro - @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 - @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 - @MP1211 TMS1100 1980, Entex Space Invader (6012) - @MP1215 TMS1100 1980, Tiger Playmaker - @MP1218 TMS1100 1980, Entex Basketball 2 (6010) - @MP1219 TMS1100 1980, U.S. Games Super Sports-4 - @MP1221 TMS1100 1980, Entex Raise The Devil (6011) - @MP1228 TMS1100 1980, Entex Musical Marvin (6014) - @MP1231 TMS1100 1984, Tandy 3 in 1 Sports Arena (model 60-2178) - @MP1296 TMS1100 1982, Entex Black Knight Pinball (6081) - @MP1311 TMS1100 1981, Bandai TC7: Air Traffic Control - @MP1312 TMS1100 1983, Gakken FX-Micom R-165/Radio Shack Science Fair Microcomputer Trainer - *MP1359 TMS1100? 1985, Capsela CRC2000 - @MP1525 TMS1170 1980, Coleco Head to Head: Electronic Baseball - @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) - @MP2110 TMS1370 1980, Gakken Invader/Tandy Fire Away - @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away - @MP2726 TMS1040 1979, Tomy Break Up - *MP2788 TMS1070? 1980, Bandai Flight Time (? note: VFD-capable) - @MP3005 TMS1730 1989, Tiger Copy Cat (model 7-522) - @MP3200 TMS1000 1978, Parker Brothers Electronic Master Mind - @MP3201 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750A) - *MP3206 TMS1000 1979, Concept 2000 Mr. Mus-I-Cal - @MP3208 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750B) - @MP3226 TMS1000 1978, Milton Bradley Simon (Rev A) - *MP3232 TMS1000 1979, Fonas 2 Player Baseball (no "MP" on chip label) - @MP3260 TMS1000 1979, Electroplay Quickfire - @MP3300 TMS1000 1979, Milton Bradley Simon (Rev F) - @MP3301A TMS1000 1979, Milton Bradley Big Trak - *MP3312 TMS1000 1980, Nathan Mega 10000 - @MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball - @MP3321A TMS1000 1979, Coleco Head to Head: Electronic Hockey - @MP3352 TMS1200 1979, Tiger Sub Wars (model 7-490) - @M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?) - *M32018 TMS1000 1990, unknown device (have decap/dump) - M32045B TMS1000 1983, Chrysler Electronic Voice Alert (11-function) -> eva.cpp - @MP3403 TMS1100 1978, Marx Electronic Bowling - @MP3404 TMS1100 1978, Parker Brothers Merlin - @MP3405 TMS1100 1979, Coleco Amaze-A-Tron - *MP3407 TMS1100 1979, General Electric The Great Awakening (model 7-4880) - @MP3415 TMS1100 1978, Coleco Electronic Quarterback - @MP3435 TMS1100 1979, Coleco Zodiac - @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command - MP3450A TMS1100 1979, Microvision cartridge: Block Buster - MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike - MP3455 TMS1100 1980, Microvision cartridge: Pinball - MP3457 TMS1100 1979, Microvision cartridge: Mindbuster - @MP3460 TMS1100 1979, Coleco Head to Head: Electronic Football - MP3474 TMS1100 1979, Microvision cartridge: Vegas Slots - MP3475 TMS1100 1979, Microvision cartridge: Bowling - @MP3476 TMS1100 1979, Milton Bradley Super Simon - MP3479 TMS1100 1980, Microvision cartridge: Baseball - MP3481 TMS1100 1979, Microvision cartridge: Connect Four - @MP3489 TMS1100 1980, Kenner Live Action Football - @MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer - *MP3493 TMS1100 1980, Milton Bradley OMNI Entertainment System (1/2) - *MP3494 TMS1100 1980, Milton Bradley OMNI Entertainment System (2/2) - MP3496 TMS1100 1980, Microvision cartridge: Sea Duel - M34009 TMS1100 1981, Microvision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..) - @M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game - *M34014 TMS1100 1981, Coleco Bowlatronic - M34017 TMS1100 1981, Microvision cartridge: Cosmic Hunter - @M34018 TMS1100 1981, Coleco Head to Head: Electronic Boxing - @M34038 TMS1100 1982, Parker Brothers Lost Treasure - M34047 TMS1100 1982, Microvision cartridge: Super Blockbuster - @M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania - *M34137 TMS1100? 1985, Technasonic Weight Talker - @MP4486A TMS1000C 1983, Vulcan XL 25 - *MP6061 TMS0970 1979, Texas Instruments Electronic Digital Thermostat (from patent, the one in MAME didn't have a label) - @MP6100A TMS0980 1979, Ideal Electronic Detective - @MP6101B TMS0980 1979, Parker Brothers Stop Thief - *MP6354 ? 1982, Tsukuda The Dracula (? note: 40-pin, VFD-capable) - *MP6361 ? 1983, Defender Strikes (? note: VFD-capable) - @MP7302 TMS1400 1980, Tiger Deluxe Football with Instant Replay - @MP7304 TMS1400 1982, Tiger 7 in 1 Sports Stadium (model 7-555) - @MP7313 TMS1400 1980, Parker Brothers Bank Shot - @MP7314 TMS1400 1980, Parker Brothers Split Second - MP7324 TMS1400 1985, Tiger K28/Coleco Talking Teacher -> tispeak.cpp - @MP7332 TMS1400 1981, Milton Bradley Dark Tower - @MP7334 TMS1400 1981, Coleco Total Control 4 - @MP7351 TMS1400 1982, Parker Brothers Master Merlin - @MP7551 TMS1670 1980, Entex Color Football 4 (6009) - @MPF553 TMS1670 1980, Gakken/Entex Jackpot: Gin Rummy & Black Jack (6008) (note: assume F to be a misprint) - MP7573 TMS1670 1981, Entex Select-A-Game cartridge: Football 4 -> sag.cpp - *M30026 TMS2370 1983, Yaesu FT-757 Display Unit part - *M95041 TMS2670 1983, Tsukuda Game Pachinko (have decap, missing MCU emulation) - - inconsistent: - - @TMS1007 TMS1000 1976, TSI Speech+ (S14002-A) - @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) - - (* means undumped unless noted, @ denotes it's in this driver) - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "machine/clock.h" -#include "machine/ds8874.h" -#include "machine/timer.h" -#include "machine/tmc0999.h" -#include "machine/tms1024.h" -#include "sound/beep.h" -#include "sound/flt_vol.h" -#include "sound/s14001a.h" -#include "sound/sn76477.h" -#include "video/hlcd0515.h" -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" - -#include "softlist_dev.h" -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "t7in1ss.lh" -#include "alphie.lh" -#include "amaztron.lh" // clickable -#include "arcmania.lh" // clickable -#include "arrball.lh" -#include "astro.lh" -#include "bankshot.lh" -#include "bcheetah.lh" -#include "bigtrak.lh" -#include "blastit.lh" -#include "bship.lh" // clickable -#include "cmsport.lh" -#include "cnbaskb.lh" -#include "cnfball.lh" -#include "cnfball2.lh" -#include "cnsector.lh" // clickable -#include "comp4.lh" // clickable -#include "copycat.lh" // clickable -#include "copycatm2.lh" // clickable -#include "dataman.lh" -#include "ditto.lh" // clickable -#include "dxfootb.lh" -#include "cqback.lh" -#include "ebball.lh" -#include "ebball2.lh" -#include "ebball3.lh" -#include "ebaskb2.lh" -#include "ebknight.lh" -#include "efootb4.lh" -#include "einvader.lh" -#include "elecbowl.lh" -#include "elecdet.lh" -#include "eleciq.lh" // clickable -#include "esbattle.lh" -#include "esoccer.lh" -#include "f2pbball.lh" -#include "f3in1.lh" -#include "fxmcr165.lh" // clickable -#include "gjackpot.lh" -#include "gpoker.lh" -#include "h2hbaseb.lh" -#include "h2hbaskb.lh" -#include "h2hboxing.lh" -#include "h2hfootb.lh" -#include "h2hhockey.lh" -#include "horseran.lh" -#include "liveafb.lh" -#include "lostreas.lh" // clickable -#include "matchnum.lh" // clickable -#include "mathmagi.lh" -#include "mathmarv.lh" -#include "mbdtower.lh" // clickable -#include "mdndclab.lh" // clickable -#include "merlin.lh" // clickable -#include "mmarvin.lh" // clickable -#include "mmerlin.lh" // clickable -#include "monkeysee.lh" -#include "palmf31.lh" -#include "palmmd8.lh" -#include "pbmastm.lh" -#include "phpball.lh" -#include "playmaker.lh" -#include "qfire.lh" // clickable -#include "quizwizc.lh" -#include "raisedvl.lh" -#include "simon.lh" // clickable -#include "speechp.lh" -#include "splitsec.lh" -#include "ssimon.lh" // clickable -#include "ssports4.lh" -#include "starwbc.lh" // clickable -#include "stopthief.lh" // clickable -#include "subwars.lh" -#include "t3in1sa.lh" -#include "tandy12.lh" // clickable -#include "tbreakup.lh" -#include "tc4.lh" -#include "tc7atc.lh" -#include "tcfball.lh" -#include "tcfballa.lh" -#include "ti1250.lh" -#include "ti1270.lh" -#include "ti1680.lh" -#include "ti25503.lh" -#include "ti30.lh" -#include "ti5100.lh" -#include "timaze.lh" -#include "tisr16.lh" -#include "tithermos.lh" -#include "wizatron.lh" -#include "xl25.lh" // clickable -#include "zodiac.lh" // clickable - -//#include "hh_tms1k_test.lh" // common test-layout - use external artwork - - -// machine_start/reset - -void hh_tms1k_state::machine_start() -{ - // resolve handlers - m_out_power.resolve(); - - // register for savestates - save_item(NAME(m_o)); - save_item(NAME(m_r)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_power_on)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_tms1k_state::machine_reset() -{ - set_power(true); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_tms1k_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) -{ - u8 ret = 0; - u16 colmask = (1 << columns) - 1; - - // read selected input columns - for (int i = 0; i < 8; i++) - if (1 << i & rowmask && m_inputs[i]->read() & m_inp_mux & colmask) - ret |= 1 << i; - - return ret; -} - -void hh_tms1k_state::switch_change(int sel, u32 mask, bool next) -{ - // config switches (for direct control) - ioport_field *inp = m_inputs[sel]->field(mask); - - if (next && inp->has_next_setting()) - inp->select_next_setting(); - else if (!next && inp->has_previous_setting()) - inp->select_previous_setting(); -} - -INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button) -{ - // when an input is directly wired to MCU INIT pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) -{ - set_power((bool)param); - m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); -} - -WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off) -{ - // devices with a TMS0980 can auto power-off - if (state) - power_off(); -} - -void hh_tms1k_state::power_off() -{ - set_power(false); - m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); -} - -void hh_tms1k_state::set_power(bool state) -{ - m_power_on = state; - m_out_power = state ? 1 : 0; -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - A-One LSI Match Number - * PCB label PT-204 "Pair Card" - * TMS1000NLL MP0163 (die label 1000B, MP0163) - * 2x2-digit 7seg LED displays + 3 LEDs, 1-bit sound - - A-One was a subsidiary of Bandai? The PCB serial PT-xxx is same, and the font - used on the boxes for "A-One LSI" is same as "Bandai Electronics" from early-80s. - - known releases: - - Japan: Match Number, published by A-One (white case, Queen playing card bezel) - - USA: Electronic Concentration, published by LJN (black case, rainbow pattern bezel) - - UK: Electronic Concentration, published by Peter Pan Playthings (same as USA version) - -***************************************************************************/ - -class matchnum_state : public hh_tms1k_state -{ -public: - matchnum_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void matchnum(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void matchnum_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void matchnum_state::write_r(u16 data) -{ - // R3-R5,R8-R10: input mux - m_inp_mux = (data >> 3 & 7) | (data >> 5 & 0x38); - - // R6,R7: speaker out - m_speaker->level_w(data >> 6 & 3); - - // R0-R3: digit/led select - m_r = data; - update_display(); -} - -void matchnum_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: led data - m_o = data; - update_display(); -} - -u8 matchnum_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( matchnum ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Change") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") - - PORT_START("IN.5") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") -INPUT_PORTS_END - -void matchnum_state::matchnum(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(matchnum_state::read_k)); - m_maincpu->r().set(FUNC(matchnum_state::write_r)); - m_maincpu->o().set(FUNC(matchnum_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 8); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_matchnum); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( matchnum ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) ) -ROM_END - - - - - -/*************************************************************************** - - A-One LSI Arrange Ball - * PCB label Kaken, PT-249 - * TMS1000NLL MP0166 (die label 1000B, MP0166) - * 2-digit 7seg LED display + 22 LEDs, 1-bit sound - - known releases: - - Japan/World: Arrange Ball, published by A-One (black case) - - USA(1): Zingo (model 60-2123), published by Tandy (red case) - - USA(2): Computer Impulse, published by LJN (white case) - - Germany: Fixball, unknown publisher, same as LJN version - -***************************************************************************/ - -class arrball_state : public hh_tms1k_state -{ -public: - arrball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void arrball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void arrball_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void arrball_state::write_r(u16 data) -{ - // R8: input mux (always set) - m_inp_mux = data >> 8 & 1; - - // R9,R10: speaker out - m_speaker->level_w(data >> 9 & 3); - - // R0-R6: digit/led select - m_r = data; - update_display(); -} - -void arrball_state::write_o(u16 data) -{ - // O0-O6: digit segments/led data - m_o = data; - update_display(); -} - -u8 arrball_state::read_k() -{ - // K: multiplexed inputs (actually just 1) - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( arrball ) - PORT_START("IN.0") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shot") // pressed when START lights up - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stop") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Speed" ) - PORT_CONFSETTING( 0x00, "Slow" ) - PORT_CONFSETTING( 0x08, "Fast" ) -INPUT_PORTS_END - -void arrball_state::arrball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(arrball_state::read_k)); - m_maincpu->r().set(FUNC(arrball_state::write_r)); - m_maincpu->o().set(FUNC(arrball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x10, 0x7f); - m_display->set_segmask(0x20, 0x06); // left digit only segments B and C - config.set_default_layout(layout_arrball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( arrball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) ) -ROM_END - - - - - -/*************************************************************************** - - APF Mathemagician - * TMS1100 MCU, label MP1030 (no decap) - * 2 x DS8870N - Hex LED Digit Driver - * 2 x DS8861N - MOS-to-LED 5-Segment Driver - * 10-digit 7seg LED display(2 custom ones) + 4 LEDs, no sound - - This is a tabletop educational calculator. It came with plastic overlays - for playing different kind of games. Refer to the manual on how to use it. - In short, to start from scratch, press [SEL]. By default the device is in - calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT], - one of the games is started. - - 1) Number Machine - 2) Countin' On - 3) Walk The Plank - 4) Gooey Gumdrop - 5) Football - 6) Lunar Lander - -***************************************************************************/ - -class mathmagi_state : public hh_tms1k_state -{ -public: - mathmagi_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void mathmagi(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void mathmagi_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void mathmagi_state::write_r(u16 data) -{ - // R3,R5-R7,R9,R10: input mux - m_inp_mux = (data >> 3 & 1) | (data >> 4 & 0xe) | (data >> 5 & 0x30); - - // R0-R7: 7seg leds - // R8: custom math symbols digit - // R9: custom equals digit - // R10: misc lamps - m_r = data; - update_display(); -} - -void mathmagi_state::write_o(u16 data) -{ - // O1-O7: led/digit segment data - // O0: N/C - m_o = data; - update_display(); -} - -u8 mathmagi_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* physical button layout and labels are like this: - - ON ONE [SEL] [NXT] [?] [/] - | | [7] [8] [9] [x] - OFF TWO [4] [5] [6] [-] - PLAYERS [1] [2] [3] [+] - [0] [_] [r] [=] -*/ - -static INPUT_PORTS_START( mathmagi ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.1") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // R10 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 mathmagi_output_pla[0x20] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 - 0x7f, 0x6f, 0x53, 0x50, 0x08, 0x79, 0x40, 0x00, // 8, 9, questionmark, r, underscore?, E, -(negative), empty - 0x00, 0x40, 0x08, 0x7c, 0x02, 0x42, 0x06, 0x6e, // empty, led4/-, led3, b, led2, +, ×, y - 0x01, 0x41, 0x09, 0, 0, 0x5c, 0, 0x3d // led1, ÷, =, ?, ?, o, ?, G -}; - -void mathmagi_state::mathmagi(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 175000); // approximation - RC osc. R=68K, C=82pF - m_maincpu->set_output_pla(mathmagi_output_pla); - m_maincpu->k().set(FUNC(mathmagi_state::read_k)); - m_maincpu->r().set(FUNC(mathmagi_state::write_r)); - m_maincpu->o().set(FUNC(mathmagi_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 7); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_mathmagi); - - // no sound! -} - -// roms - -ROM_START( mathmagi ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai System Control Car: Cheetah 「システムコントロールカー チーター」 - * TMS1000NLL MP0915 (die label 1000B, MP0915) - * 2 motors (one for back axis, one for steering), no sound - - It's a programmable buggy, like Big Track but much simpler. To add a command - step in program-mode, press a direction key and one of the time delay number - keys at the same time. To run the program(max 24 steps), switch to run-mode - and press the go-key. - - known releases: - - Japan: System Control Car: Cheetah, published by Bandai - - USA: The Incredible Brain Buggy, published by Fundimensions - - UK: The Incredible Brain Buggy, published by Palitoy (same as USA version) - -***************************************************************************/ - -class bcheetah_state : public hh_tms1k_state -{ -public: - bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_motor1(*this, "motor1"), - m_motor2_left(*this, "motor2_left"), - m_motor2_right(*this, "motor2_right") - { } - - void bcheetah(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - output_finder<> m_motor1; - output_finder<> m_motor2_left; - output_finder<> m_motor2_right; -}; - -void bcheetah_state::machine_start() -{ - hh_tms1k_state::machine_start(); - m_motor1.resolve(); - m_motor2_left.resolve(); - m_motor2_right.resolve(); -} - -// handlers - -void bcheetah_state::write_r(u16 data) -{ - // R0-R4: input mux - // R5,R6: tied to K4?? - m_inp_mux = data & 0x1f; -} - -void bcheetah_state::write_o(u16 data) -{ - // O1: back motor (drive) - // O0: front motor steer left - // O2: front motor steer right - // O3: GND, other: N/C - m_motor1 = data >> 1 & 1; - m_motor2_left = data & 1; - m_motor2_right = data >> 2 & 1; -} - -u8 bcheetah_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( bcheetah ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, "Mode") - PORT_CONFSETTING( 0x02, "Program" ) - PORT_CONFSETTING( 0x00, "Run" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") -INPUT_PORTS_END - -void bcheetah_state::bcheetah(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 100000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(bcheetah_state::read_k)); - m_maincpu->r().set(FUNC(bcheetah_state::write_r)); - m_maincpu->o().set(FUNC(bcheetah_state::write_o)); - - config.set_default_layout(layout_bcheetah); - - // no sound! -} - -// roms - -ROM_START( bcheetah ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai TC7: Air Traffic Control - * TMS1100 MCU, label MP1311 (die label 1100E, MP1311) - * 4-digit 7seg LED display, 40 other LEDs, 1-bit sound - - It is a very complicated game, refer to the manual on how to play. - -***************************************************************************/ - -class tc7atc_state : public hh_tms1k_state -{ -public: - tc7atc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tc7atc(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tc7atc_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void tc7atc_state::write_r(u16 data) -{ - // R5: speaker out - m_speaker->level_w(BIT(data, 5)); - - // R0-R4: input mux, led select - // R6-R9: digit select - m_inp_mux = m_r = data; - update_display(); -} - -void tc7atc_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 tc7atc_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( tc7atc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("High Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hazard") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("West") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("East") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Arrive") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Depart") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Flight Path A / Level 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Flight Path B / Level 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Flight Path C / Level 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Flight Path D / Level 4") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Altitude Descend") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Altitude Ascend") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Air Speed Decrease") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Air Speed Increase") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("10%") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("20%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("40%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("80%") -INPUT_PORTS_END - -void tc7atc_state::tc7atc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=68K, C=47pF - m_maincpu->k().set(FUNC(tc7atc_state::read_k)); - m_maincpu->r().set(FUNC(tc7atc_state::write_r)); - m_maincpu->o().set(FUNC(tc7atc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3c0, 0x7f); - config.set_default_layout(layout_tc7atc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tc7atc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1311", 0x0000, 0x0800, CRC(704f5e1b) SHA1(765dce31798640480eab7576550c5378d6351b65) ) - - 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_tc7atc_output.pla", 0, 365, CRC(0e6e3096) SHA1(375beb43657af0cc3070e581b42e501878c0eaaa) ) -ROM_END - - - - - -/*************************************************************************** - - Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B, - Triumph-Adler 81 SN, Silver-Reed 8J, more - * TMS1040 MCU label TMS1045NL (die label 1040A, 1045) - * 9-digit cyan VFD display (leftmost may be custom) - - TMS1045NL is a versatile calculator chip for 3rd party manufacturers, used - by Canon, Toshiba, and several smaller companies. It doesn't look like it - was used in any TI calculator. It was up to the manufacturer to choose which - functions(keys) to leave out. - -***************************************************************************/ - -class palmf31_state : public hh_tms1k_state -{ -public: - palmf31_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void palmf31(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void palmf31_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void palmf31_state::write_r(u16 data) -{ - // R0-R8: select digit, input mux - m_r = m_inp_mux = data; - update_display(); -} - -void palmf31_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 palmf31_state::read_k() -{ - // K: multiplexed inputs, one of the columns is K2+K8 - u8 data = read_inputs(9); - if (data & 1) - data = (data & 0xe) | 0xa; - - // switches are on K1 - if (m_inp_mux & m_inputs[9]->read()) - data |= 1; - - return data; -} - -// config - -static INPUT_PORTS_START( palmf31 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M+") // add to memory - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("M-") // subtract from memory - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("RV") // reverse - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as M+ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as sqrt - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("1/x") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("RM/CM") // combined function (press twice) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("C") // clear (all) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(UTF8_LEFT) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("CI") // clear indicator - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("CI/C") // combined function (press twice) - - PORT_START("IN.9") // K1 - PORT_CONFNAME( 0x1f, 0x00, "DP" ) // display point - PORT_CONFSETTING( 0x02, "+" ) - PORT_CONFSETTING( 0x01, "0" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x10, "4" ) - PORT_CONFSETTING( 0x00, "F" ) - PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_CONFNAME( 0x100, 0x000, "AM" ) // accumulate memory - PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x100, DEF_STR( On ) ) -INPUT_PORTS_END - -void palmf31_state::palmf31(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(palmf31_state::read_k)); - m_maincpu->o().set(FUNC(palmf31_state::write_o)); - m_maincpu->r().set(FUNC(palmf31_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_palmf31); - - // no sound! -} - -// roms - -ROM_START( palmf31 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1045nl", 0x0000, 0x0400, CRC(0c42d43e) SHA1(b76d404623e3abfd0b237ee1c0b46e83f96ceb78) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_palmf31_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_palmf31_output.pla", 0, 365, CRC(bc295ea6) SHA1(7e7c9ed0c1e5e37173dd8f297473516c410bca8c) ) -ROM_END - - - - - -/*************************************************************************** - - Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810 - * TMS1070 MCU label TMC1079 (die label 1070B, 1079A) - * 2-line cyan VFD display, each 9-digit 7seg + 1 custom (label 20-ST-22) - * PCB label Canon EHI-0115-03 - - The only difference between MD-8 and MD 810 is the form factor. The latter - is a tabletop calculator. - -***************************************************************************/ - -class palmmd8_state : public hh_tms1k_state -{ -public: - palmmd8_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void palmmd8(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void palmmd8_state::update_display() -{ - // M-digit is on in memory mode, upper row is off in single mode - u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0; - u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00; - - // R10 selects display row - u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); - m_display->matrix((sel & mask) | m, m_o); -} - -void palmmd8_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void palmmd8_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = bitswap<8>(data,0,4,5,6,7,1,2,3); - update_display(); -} - -u8 palmmd8_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( palmmd8 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M+") // add to memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") // reverse - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CI/C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.10") // R10 - PORT_CONFNAME( 0x31, 0x20, "Mode" ) // bit 4 indicates M-digit on/off, bit 5 indicates upper row filament on/off - PORT_CONFSETTING( 0x31, "Memory" ) - PORT_CONFSETTING( 0x01, "Single" ) - PORT_CONFSETTING( 0x20, "Process" ) - PORT_CONFNAME( 0x02, 0x00, "AM" ) // accumulate memory - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x02, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void palmmd8_state::palmmd8(machine_config &config) -{ - // basic machine hardware - TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf - m_maincpu->k().set(FUNC(palmmd8_state::read_k)); - m_maincpu->o().set(FUNC(palmmd8_state::write_o)); - m_maincpu->r().set(FUNC(palmmd8_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(21, 8); - m_display->set_segmask(0xfffff, 0xff); - config.set_default_layout(layout_palmmd8); - - // no sound! -} - -// roms - -ROM_START( palmmd8 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_palmmd8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Amaze-A-Tron, by Ralph Baer - * TMS1100 MCU, label MP3405 (die label same) - * 2-digit 7seg LED display + 2 LEDs(one red, one green), 1-bit sound - * 5*5 pressure-sensitive playing board(buttons), 4 game pieces - - This is an electronic board game with a selection of 8 maze games, - most of them for 2 players. - -***************************************************************************/ - -class amaztron_state : public hh_tms1k_state -{ -public: - amaztron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void amaztron(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void amaztron_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void amaztron_state::write_r(u16 data) -{ - // R0-R5: input mux - m_inp_mux = data & 0x3f; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R6,R7: leds - // R8,R9: select digit - m_r = data >> 6 & 0xf; - update_display(); -} - -void amaztron_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 amaztron_state::read_k() -{ - // K: multiplexed inputs - u8 k = read_inputs(6); - - // the 5th column is tied to K4+K8 - if (k & 0x10) k |= 0xc; - return k & 0xf; -} - -// config - -static INPUT_PORTS_START( amaztron ) - 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") - - 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") - - 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") - - 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") - - 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Game Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Game Start") - PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void amaztron_state::amaztron(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=33K?, C=100pF - m_maincpu->k().set(FUNC(amaztron_state::read_k)); - m_maincpu->r().set(FUNC(amaztron_state::write_r)); - m_maincpu->o().set(FUNC(amaztron_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xc, 0x7f); - config.set_default_layout(layout_amaztron); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( amaztron ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Zodiac - The Astrology Computer (model 2110) - * TMS1100 MP3435 (no decap) - * 8-digit 7seg display, 12 other LEDs, 1-bit sound - - As the name suggests, this is an astrologic calculator. Refer to the - (very extensive) manual on how to use it. - -***************************************************************************/ - -class zodiac_state : public hh_tms1k_state -{ -public: - zodiac_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void zodiac(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void zodiac_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void zodiac_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R4,R8: input mux - m_inp_mux = (data & 0x1f) | (data >> 3 & 0x20); - - // R0-R7: digit select - // R8,R9: led select - m_r = data & 0x3ff; - update_display(); -} - -void zodiac_state::write_o(u16 data) -{ - // O0-O7: digit segment/led data - m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); - update_display(); -} - -u8 zodiac_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* The physical button layout and labels are like this: - - [P] [A] - [ 1 ] [ 2 ] [ 3 ] - [L] [ 4 ] [ 5 ] [ 6 ] [D] - [ 7 ] [ 8 ] [ 9 ] - [J] [ 0 ] [CLR] [ENT] [E] - - [.__.__.__.] - OFF H P A - -Despite that this layout features a typical digital keypad and distances -the letter buttons from it, the 8-character encoding for date input uses -letters and digits in combination. This fact and the use of the P key are -why the digit buttons are mapped here as keyboard inputs rather than as a -keypad. - -*/ - -static INPUT_PORTS_START( zodiac ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8) - - PORT_START("IN.5") // R8 - PORT_CONFNAME( 0x03, 0x01, "Mode") - PORT_CONFSETTING( 0x01, "Horoscope" ) - PORT_CONFSETTING( 0x02, "Preview" ) - PORT_CONFSETTING( 0x00, "Answer" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void zodiac_state::zodiac(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 500000); // approximation - RC osc. R=18K, C=100pF - m_maincpu->k().set(FUNC(zodiac_state::read_k)); - m_maincpu->r().set(FUNC(zodiac_state::write_r)); - m_maincpu->o().set(FUNC(zodiac_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_zodiac); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( zodiac ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_zodiac_output.bin", 0, 0x20, CRC(d35d64cb) SHA1(315e7ca9a18a06ff7dc0b95c6f119e093b15a41f) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Electronic Quarterback (model 2120) - * TMS1100NLL MP3415 (die label same) - * 9-digit LED grid, 1-bit sound - - known releases: - - USA(1): Electronic Quarterback, published by Coleco - - USA(2): Electronic Touchdown, published by Sears - -***************************************************************************/ - -class cqback_state : public hh_tms1k_state -{ -public: - cqback_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cqback(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cqback_state::update_display() -{ - // R9 selects between segments B/C or A'/D' - u16 seg = m_o; - if (m_r & 0x200) - seg = (m_o << 7 & 0x300) | (m_o & 0xf9); - - m_display->matrix(m_r & 0x1ff, seg); -} - -void cqback_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R0-R9: select digit/segment - m_r = data; - update_display(); -} - -void cqback_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cqback_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(5); -} - -// config - -static INPUT_PORTS_START( cqback ) - PORT_START("IN.0") // K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick/Pass") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") - - PORT_START("IN.1") // K2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.3") // K8 - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) // TP1-TP2 -INPUT_PORTS_END - -void cqback_state::cqback(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(cqback_state::read_k)); - m_maincpu->r().set(FUNC(cqback_state::write_r)); - m_maincpu->o().set(FUNC(cqback_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x1ff, 0xff); - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_cqback); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cqback ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Football (model 2140) - * TMS1100NLLE (rev. E!) MP3460 (die label same) - * 2*SN75492N LED display drivers, 9-digit LED grid, 1-bit sound - - LED electronic football game. To distinguish between offense and defense, - offense blips appear brighter. The hardware is similar to cqback. - - known releases: - - USA(1): Head to Head: Electronic Football, published by Coleco - - USA(2): Team Play Football, published by Sears - -***************************************************************************/ - -class h2hfootb_state : public hh_tms1k_state -{ -public: - h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hfootb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void h2hfootb_state::update_display() -{ - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 1 & 0x100)); -} - -void h2hfootb_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R8: input mux - m_inp_mux = data & 0x1ff; - - // R0-R8: select led - // R9: led between digits - m_r = data; - update_display(); -} - -void h2hfootb_state::write_o(u16 data) -{ - // O0-O7: digit segments A-G,A' - m_o = data; - update_display(); -} - -u8 h2hfootb_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(9); -} - -// config - -static INPUT_PORTS_START( h2hfootb ) - PORT_START("IN.0") // K1 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.1") // K2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("P1 Play Selector") // pass - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.3") // K8 - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick/Pass") - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY -INPUT_PORTS_END - -void h2hfootb_state::h2hfootb(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=39K, C=100pF - m_maincpu->k().set(FUNC(h2hfootb_state::read_k)); - m_maincpu->r().set(FUNC(h2hfootb_state::write_r)); - m_maincpu->o().set(FUNC(h2hfootb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1ff, 0x7f); - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_h2hfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hfootb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Basketball (model 2150) - * TMS1000NLL MP3320A (die label 1000E MP3320A) - * 2-digit 7seg LED display, LED grid display, 1-bit sound - - Coleco Head to Head: Electronic Hockey (model 2160) - * TMS1000NLL E MP3321A (die label 1000E MP3321A) - * same PCB/hardware as above - - Unlike the COP420 version(see hh_cop400.cpp driver), each game has its own MCU. - To begin play, press start while holding left/right. - -***************************************************************************/ - -class h2hbaskb_state : public hh_tms1k_state -{ -public: - h2hbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_cap_empty_timer(*this, "cap_empty") - { } - - void h2hbaskb(machine_config &config); - void h2hhockey(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_cap_empty_timer; - TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback); - bool m_cap_state = false; - attotime m_cap_charge = attotime::zero; - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void h2hbaskb_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_cap_state)); - save_item(NAME(m_cap_charge)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(h2hbaskb_state::cap_empty_callback) -{ - if (~m_r & 0x200) - m_cap_state = false; -} - -void h2hbaskb_state::update_display() -{ - // R6,R7 are commons for R0-R5 - u16 sel = 0; - if (m_r & 0x40) sel |= (m_r & 0x3f); - if (m_r & 0x80) sel |= (m_r & 0x3f) << 6; - - m_display->matrix(sel, m_o); -} - -void h2hbaskb_state::write_r(u16 data) -{ - // R0-R3: input mux - m_inp_mux = (data & 0xf); - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R9: K8 and 15uF cap to V- (used as timer) - // rising edge, remember the time - if (data & ~m_r & 0x200) - { - m_cap_state = true; - m_cap_charge = machine().time(); - } - // falling edge, determine how long K8 should stay up - if (~data & m_r & 0x200) - { - const attotime full = attotime::from_usec(1300); // approx. charge time - const int factor = 27; // approx. factor for charge/discharge to logic 0 - - attotime charge = machine().time() - m_cap_charge; - if (charge > full) - charge = full; - - m_cap_empty_timer->adjust(charge * factor); - } - - // R0-R7: led select - m_r = data; - update_display(); -} - -void h2hbaskb_state::write_o(u16 data) -{ - // O1-O7: led data - m_o = data >> 1 & 0x7f; - update_display(); -} - -u8 h2hbaskb_state::read_k() -{ - // K1-K4: multiplexed inputs, K8: R9 and capacitor - return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0); -} - -// config - -static INPUT_PORTS_START( h2hbaskb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start/Display") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hhockey ) - PORT_INCLUDE( h2hbaskb ) - - PORT_MODIFY("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") -INPUT_PORTS_END - -void h2hbaskb_state::h2hbaskb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=100pF - m_maincpu->k().set(FUNC(h2hbaskb_state::read_k)); - m_maincpu->r().set(FUNC(h2hbaskb_state::write_r)); - m_maincpu->o().set(FUNC(h2hbaskb_state::write_o)); - - TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6+6, 7); - m_display->set_segmask(0xc0, 0x7f); - config.set_default_layout(layout_h2hbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void h2hbaskb_state::h2hhockey(machine_config &config) -{ - h2hbaskb(config); - config.set_default_layout(layout_h2hhockey); -} - -// roms - -ROM_START( h2hbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3320a", 0x0000, 0x0400, CRC(39a63f43) SHA1(14a765e42a39f8d3a465c990e09dd651e595a1c5) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_h2hbaskb_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) -ROM_END - -ROM_START( h2hhockey ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Baseball (model 2180) - * PCB labels Coleco rev C 73891/2 - * TMS1170NLN MP1525-N2 (die label MP1525) - * 9-digit cyan VFD display, and other LEDs behind bezel, 1-bit sound - - known releases: - - USA: Head to Head: Electronic Baseball, published by Coleco - - Japan: Computer Baseball, published by Tsukuda - -***************************************************************************/ - -class h2hbaseb_state : public hh_tms1k_state -{ -public: - h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hbaseb(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void h2hbaseb_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void h2hbaseb_state::set_clock() -{ - // MCU clock is from an RC circuit with C=47pF, and R value is depending on - // skill switch: R=51K(1) or 43K(2) - m_maincpu->set_unscaled_clock((m_inputs[5]->read() & 1) ? 400000 : 350000); -} - -void h2hbaseb_state::update_display() -{ - m_display->matrix((m_r & 0xff) | (m_r >> 1 & 0x100), (m_r & 0x100) | m_o); -} - -void h2hbaseb_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R4-R7: input mux - m_inp_mux = data >> 4 & 0xf; - - // R0-R7,R9: select vfd digit/led - // R8: led state - m_r = data; - update_display(); -} - -void h2hbaseb_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: N/C - m_o = data; - update_display(); -} - -u8 h2hbaseb_state::read_k() -{ - // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inputs[4]->read() | read_inputs(4); -} - -// config - -static INPUT_PORTS_START( h2hbaseb ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("N") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("B") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("S") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Curve") // these two buttons appear twice on the board - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Pitch") // " - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // Vss! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Swing") - - PORT_START("IN.5") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, h2hbaseb_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -void h2hbaseb_state::h2hbaseb(machine_config &config) -{ - // basic machine hardware - TMS1170(config, m_maincpu, 350000); // see set_clock - m_maincpu->k().set(FUNC(h2hbaseb_state::read_k)); - m_maincpu->r().set(FUNC(h2hbaseb_state::write_r)); - m_maincpu->o().set(FUNC(h2hbaseb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_h2hbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hbaseb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Boxing (model 2190) - * TMS1100NLL M34018-N2 (die label M34018) - * 2-digit 7seg LED display, LED grid display, 1-bit sound - - This appears to be the last game of Coleco's Head to Head series. - -***************************************************************************/ - -class h2hboxing_state : public hh_tms1k_state -{ -public: - h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hboxing(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void h2hboxing_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void h2hboxing_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R0-R7: select led - // R9,R10: select digit - m_r = data & ~0x100; - update_display(); -} - -void h2hboxing_state::write_o(u16 data) -{ - // O0-O7: digit segments/led data - m_o = data; - update_display(); -} - -u8 h2hboxing_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( h2hboxing ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punch / Pro") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Block / Amateur") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Punch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Block") -INPUT_PORTS_END - -void h2hboxing_state::h2hboxing(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=100pF - m_maincpu->k().set(FUNC(h2hboxing_state::read_k)); - m_maincpu->r().set(FUNC(h2hboxing_state::write_r)); - m_maincpu->o().set(FUNC(h2hboxing_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_segmask(0x600, 0x7f); - config.set_default_layout(layout_h2hboxing); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hboxing ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Quiz Wiz Challenger - * TMS1000NLL M32001-N2 (die label 1000E, M32001) - * 4 7seg LEDs, 17 other LEDs, 1-bit sound - - This is a 4-player version of Quiz Wiz, a multiple choice quiz game. - According to the manual, Quiz Wiz cartridges are compatible with it. - The question books are needed to play, as well as optional game pieces. - - Cartridge pinout: - 1 R4 - 2 R6 - 3 R7 - 4 K1 - 5 N/C - 6 R8 - 7 R5 - 8 R9 - - The cartridge connects one or more of the R pins to K1. Together with the - question numbers, the game generates a pseudo-random answerlist. - -***************************************************************************/ - -class quizwizc_state : public hh_tms1k_state -{ -public: - quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void quizwizc(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u16 m_pinout = 0x07; // cartridge R pins - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void quizwizc_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_pinout)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge pinout K1 to R connections - const char *pinout = image.get_feature("pinout"); - m_pinout = pinout ? strtoul(pinout, nullptr, 2) & 0xe7 : 0; - m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4; - - if (m_pinout == 0) - { - image.seterror(image_error::INVALIDIMAGE, "Invalid cartridge pinout"); - return image_init_result::FAIL; - } - - return image_init_result::PASS; -} - -void quizwizc_state::update_display() -{ - // note: O7 is on VSS - m_display->matrix(m_r | 0x400, m_o); -} - -void quizwizc_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R5: input mux - // R4-R9: to cartridge slot - m_inp_mux = data & 0x3f; - - // R0-R3: led select - // R6-R9: digit select - m_r = data; - update_display(); -} - -void quizwizc_state::write_o(u16 data) -{ - // O0-O7: led/digit segment data - m_o = bitswap<8>(data,7,0,1,2,3,4,5,6); - update_display(); -} - -u8 quizwizc_state::read_k() -{ - // K: multiplexed inputs - // K1: cartridge pin 4 (pin 5 N/C) - return read_inputs(6) | ((m_r & m_pinout) ? 1 : 0); -} - -// config - -static INPUT_PORTS_START( quizwizc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // A (player 1 at bottom, increment counter-clockwise) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // B - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // C - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) // D - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Go") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Slow Forward") - - PORT_START("IN.5") // R5 - PORT_CONFNAME( 0x02, 0x00, "Game Select" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void quizwizc_state::quizwizc(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=100pF - m_maincpu->k().set(FUNC(quizwizc_state::read_k)); - m_maincpu->r().set(FUNC(quizwizc_state::write_r)); - m_maincpu->o().set(FUNC(quizwizc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10+1, 8); - m_display->set_segmask(0x3c0, 0x7f); - config.set_default_layout(layout_quizwizc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "quizwiz_cart")); - cartslot.set_must_be_loaded(true); - cartslot.set_device_load(FUNC(quizwizc_state::cart_load)); - SOFTWARE_LIST(config, "cart_list").set_original("quizwiz"); -} - -// roms - -ROM_START( quizwizc ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Total Control 4 - * TMS1400NLL MP7334-N2 (die label MP7334) - * 2x2-digit 7seg LED display + 4 LEDs, LED grid display, 1-bit sound - - This is a head to head electronic tabletop LED-display sports console. - One cartridge(Football) was included with the console, the other three were - sold in a pack. Gameplay has emphasis on strategy, read the official manual - on how to play. MAME external artwork is needed for the switchable overlays. - - Cartridge pinout: - 1 N/C - 2 9V+ - 3 power switch - 4 K8 - 5 K4 - 6 K2 - 7 K1 - 8 R9 - - The cartridge connects pin 8 with one of the K-pins. - -***************************************************************************/ - -class tc4_state : public hh_tms1k_state -{ -public: - tc4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tc4(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u8 m_pinout = 0xf; // cartridge K pins - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void tc4_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_pinout)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge pinout R9 to K connections - const char *pinout = image.get_feature("pinout"); - m_pinout = pinout ? strtoul(pinout, nullptr, 0) & 0xf : 0xf; - - return image_init_result::PASS; -} - -void tc4_state::update_display() -{ - // note: R6 is an extra column - m_display->matrix(m_r, (m_o | (m_r << 2 & 0x100))); -} - -void tc4_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R5: input mux - // R9: to cartridge slot - m_inp_mux = data & 0x3f; - - // R0-R4: select led - // R6: led 8 state - // R5,R7-R9: select digit - m_r = data; - update_display(); -} - -void tc4_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 tc4_state::read_k() -{ - // K: multiplexed inputs, cartridge pins from R9 - return read_inputs(6) | ((m_r & 0x200) ? m_pinout : 0); -} - -// config - -static INPUT_PORTS_START( tc4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pass/Shoot Button 3") // right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass/Shoot Button 1") // left - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass/Shoot Button 2") // middle - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 D/K Button") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 3") // right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 1") // left - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 2") // middle - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button") -INPUT_PORTS_END - -void tc4_state::tc4(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 450000); // approximation - RC osc. R=27.3K, C=100pF - m_maincpu->k().set(FUNC(tc4_state::read_k)); - m_maincpu->r().set(FUNC(tc4_state::write_r)); - m_maincpu->o().set(FUNC(tc4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x3a0, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_tc4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "tc4_cart")); - cartslot.set_must_be_loaded(true); // system won't power on without cartridge - cartslot.set_device_load(FUNC(tc4_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("tc4"); -} - -// roms - -ROM_START( tc4 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Basketball - * PCB label CONIC 101-006 - * TMS1000NLL MP0907 (die label 1000B MP0907) - * DS8871N, 2 7seg LEDs, 30 other LEDs, 1-bit sound - - There are 3 known versions of Conic Basketball: MP0910(101-003) and - MP0907(101-006) are nearly identical. MP0168 is found in Conic Multisport. - - known releases: - - Hong Kong: Electronic Basketball, published by Conic - - USA: Electronic Basketball, published by Cardinal - -***************************************************************************/ - -class cnbaskb_state : public hh_tms1k_state -{ -public: - cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnbaskb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnbaskb_state::update_display() -{ - m_display->matrix(m_r & 0x1fc, m_o); -} - -void cnbaskb_state::write_r(u16 data) -{ - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0,R1: input mux - // R10 is also tied to K1 (locks up at boot if it's not handled) - m_inp_mux = (data >> 8 & 4) | (data & 3); - - // R2-R6: led select - // R7,R8: digit select - m_r = data; - update_display(); -} - -void cnbaskb_state::write_o(u16 data) -{ - // O0-O6: led/digit segment data - // O7: N/C - m_o = data; - update_display(); -} - -u8 cnbaskb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cnbaskb ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x01, "2" ) // professional - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cnbaskb_state::cnbaskb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(cnbaskb_state::read_k)); - m_maincpu->r().set(FUNC(cnbaskb_state::write_r)); - m_maincpu->o().set(FUNC(cnbaskb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cnbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Multisport - * PCB label CONIC 101-027(1979), or CONIC 101-021 REV A(1980, with DS8871N) - * TMS1000 MP0168 (die label same) - * 2 7seg LEDs, 33 other LEDs, 1-bit sound - - This handheld includes 3 games: Basketball, Ice Hockey, Soccer. - MAME external artwork is needed for the switchable overlays. - - known releases: - - Hong Kong: Electronic Multisport, published by Conic - - Hong Kong: Basketball/Ice Hockey/Soccer, published by Conic (3 separate handhelds) - - USA(1): Electronic Multisport, published by Innocron - - USA(2): Sports Arena, published by Tandy (model 60-2158) - -***************************************************************************/ - -class cmsport_state : public hh_tms1k_state -{ -public: - cmsport_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cmsport(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cmsport_state::update_display() -{ - m_display->matrix(m_r & ~0x80, m_o); -} - -void cmsport_state::write_r(u16 data) -{ - // R7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // R0,R9,R10: input mux - m_inp_mux = (data & 1) | (data >> 8 & 6); - - // R0-R4,R8: led select - // R5,R6: digit select - m_r = data; - update_display(); -} - -void cmsport_state::write_o(u16 data) -{ - // O0-O7: led/digit segment data - m_o = data; - update_display(); -} - -u8 cmsport_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cmsport ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x05, 0x01, "Game Select" ) - PORT_CONFSETTING( 0x01, "Basketball" ) - PORT_CONFSETTING( 0x00, "Soccer" ) - PORT_CONFSETTING( 0x04, "Ice Hockey" ) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void cmsport_state::cmsport(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(cmsport_state::read_k)); - m_maincpu->r().set(FUNC(cmsport_state::write_r)); - m_maincpu->o().set(FUNC(cmsport_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x60, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cmsport); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cmsport ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Football - * TMS1000 MP0170 (die label same) - * DS8874N, 3*9 LED array, 7 7seg LEDs, 1-bit sound - - This is a clone of Mattel Football. Apparently Mattel tried to keep imports - of infringing games from going through customs. Conic (Hong Kong) answered - by distributing the game under subsidiary brands - see list below. - - known releases: - - Hong Kong: Electronic Football, published by Conic - - USA(1): Football, published by E.R.S.(Electronic Readout Systems) - - USA(2): Football, published by ELECsonic - - USA(3): Football, no brand! - - Another hardware revision of this game uses a PIC16 MCU. - -***************************************************************************/ - -class cnfball_state : public hh_tms1k_state -{ -public: - cnfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void cnfball(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnfball_state::update_display() -{ - m_display->matrix(~m_grid, m_o | (m_r << 6 & 0x700)); -} - -void cnfball_state::ds8874_output_w(u16 data) -{ - m_grid = data; - update_display(); -} - -void cnfball_state::write_r(u16 data) -{ - // R5,R8: N/C - // R6,R7: speaker out - m_speaker->level_w(data >> 6 & 3); - - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R0: DS8874N CP (note: it goes back to K8 too, game relies on it) - // R1: DS8874N _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 1)); - - // R2-R4: led data - m_r = data; - update_display(); -} - -void cnfball_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cnfball_state::read_k() -{ - // K: multiplexed inputs, K8 also tied to DS8874N CP(R0) - return read_inputs(2) | (m_r << 3 & 8); -} - -// config - -static INPUT_PORTS_START( cnfball ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) // college - PORT_CONFSETTING( 0x00, "2" ) // professional -INPUT_PORTS_END - -void cnfball_state::cnfball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(cnfball_state::read_k)); - m_maincpu->r().set(FUNC(cnfball_state::write_r)); - m_maincpu->o().set(FUNC(cnfball_state::write_o)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(cnfball_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 8+3); - m_display->set_segmask(0xc3, 0x7f); - m_display->set_segmask(0x38, 0xff); // only the middle 3 7segs have DP - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cnfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Football II - * TMS1100 MP1181 (no decap) - * 9-digit LED grid, 1-bit sound - - This is a clone of Coleco's Quarterback, similar at hardware-level too. - Unlike the other LED Football games, this one looks like it doesn't make - the offense(player) leds brighter. - - known releases: - - Hong Kong: Electronic Football II, published by Conic - - USA: Electronic Football II, published by Tandy - -***************************************************************************/ - -class cnfball2_state : public hh_tms1k_state -{ -public: - cnfball2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnfball2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnfball2_state::update_display() -{ - // R1 selects between segments B/C or A'/D' - u16 seg = m_o; - if (~m_r & 2) - seg = (m_o << 7 & 0x300) | (m_o & 0xf9); - - m_display->matrix(m_r >> 2 & 0x1ff, seg); -} - -void cnfball2_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R8-R10: input mux - m_inp_mux = data >> 8 & 7; - - // R1-R10: select digit/segment - m_r = data; - update_display(); -} - -void cnfball2_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cnfball2_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cnfball2 ) - PORT_START("IN.0") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x02, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass/run - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // college - PORT_CONFSETTING( 0x08, "2" ) // professional - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cnfball2_state::cnfball2(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(cnfball2_state::read_k)); - m_maincpu->r().set(FUNC(cnfball2_state::write_r)); - m_maincpu->o().set(FUNC(cnfball2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_cnfball2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnfball2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump, 2nd half unused - ROM_LOAD16_BYTE( "tms1100_cnfball2_output.bin", 0, 0x20, CRC(c51d7404) SHA1(3a00c69b52b7d0dd12ccd66428130592c7e06240) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic I.Q. - * PCB labels: main: CONIC 101-037 (other side: HG-15, 11*00198*00), button PCB: - CONIC 102-001, led PCB: CONIC 100-003 REV A itac - * TMS1000NLL MP0908 (die label 1000B, MP0908) - * 2 7seg LEDs, 30 other LEDs, 1-bit sound - - This is a peg solitaire game, with random start position. - - known releases: - - Hong Kong: Electronic I.Q., published by Conic - - UK: Solitaire, published by Grandstand - -***************************************************************************/ - -class eleciq_state : public hh_tms1k_state -{ -public: - eleciq_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void eleciq(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void eleciq_state::update_display() -{ - m_display->matrix(m_r & ~1, m_o); -} - -void eleciq_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R1-R6,R9: input mux - m_inp_mux = (data >> 1 & 0x3f) | (data >> 3 & 0x40); - - // R1-R6: led select - // R7,R8: digit select - m_r = data; - update_display(); -} - -void eleciq_state::write_o(u16 data) -{ - // O0-O6: led/digit segment data - // O7: N/C - m_o = data; - update_display(); -} - -u8 eleciq_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -static INPUT_PORTS_START( eleciq ) - PORT_START("IN.0") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Up-Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Up") - - PORT_START("IN.1") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button B") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Up-Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Down") - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Down-Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Left") - - PORT_START("IN.3") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button D") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Down-Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Right") - - PORT_START("IN.4") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button E") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button F") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R9 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x01, "2" ) // professional - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) -INPUT_PORTS_END - -void eleciq_state::eleciq(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=50pF - m_maincpu->k().set(FUNC(eleciq_state::read_k)); - m_maincpu->r().set(FUNC(eleciq_state::write_r)); - m_maincpu->o().set(FUNC(eleciq_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x180, 0x7f); - config.set_default_layout(layout_eleciq); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( eleciq ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) ) -ROM_END - - - - - -/*************************************************************************** - - Electroplay Quickfire - * TMS1000NLL MP3260 (die label same) - * 2 7seg LEDs, 5 lamps, 3 lightsensors, lightgun - - To play it in MAME, either use the clickable artwork with -mouse, or set - button 1 to "Z or X or C" and each lightsensor to one of those keys. - Although the game seems mostly playable without having to use the gun trigger - -***************************************************************************/ - -class qfire_state : public hh_tms1k_state -{ -public: - qfire_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void qfire(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void qfire_state::write_r(u16 data) -{ - // R1,R2,R5: input mux - m_inp_mux = (data >> 1 & 3) | (data >> 3 & 4); - - // R3,R4,R6-R8: leds (direct) - m_display->write_row(2, (data >> 3 & 3) | (data >> 4 & 0x1c)); - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); -} - -void qfire_state::write_o(u16 data) -{ - // O0: 1st digit "1" - // O1-O7: 2nd digit segments - m_display->write_row(0, (data & 1) ? 6 : 0); - m_display->write_row(1, data >> 1 & 0x7f); -} - -u8 qfire_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( qfire ) - PORT_START("IN.0") // R1 - PORT_CONFNAME( 0x0f, 0x00, "Game" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x02, "4" ) - PORT_CONFSETTING( 0x01, "5" ) - PORT_CONFSETTING( 0x06, "6" ) - - PORT_START("IN.1") // R2 - PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "A" ) - PORT_CONFSETTING( 0x02, "B" ) - PORT_CONFSETTING( 0x01, "C" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // lightgun trigger, also turns on lightgun lamp -INPUT_PORTS_END - -void qfire_state::qfire(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(qfire_state::read_k)); - m_maincpu->r().set(FUNC(qfire_state::write_r)); - m_maincpu->o().set(FUNC(qfire_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_qfire); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( qfire ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3260", 0x0000, 0x0400, CRC(f6e28376) SHA1(6129584c55a1629b458694cdc97edccb77ab00ba) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_qfire_output.pla", 0, 365, CRC(8f7668a9) SHA1(c8faeff0f88bfea8f032ce5bc583f049e8930c11) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Soccer - * TMS1000NL MP0158 (die label 1000B, MP0158) - * 2 7seg LEDs, 30 other LEDs, 1-bit sound - - known releases: - - USA: Electronic Soccer, 2 versions (leds on green bezel, or leds under bezel) - - Germany: Fussball, with skill switch - -***************************************************************************/ - -class esoccer_state : public hh_tms1k_state -{ -public: - esoccer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void esoccer(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void esoccer_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void esoccer_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void esoccer_state::write_o(u16 data) -{ - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 esoccer_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( esoccer ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R2 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // Auto - PORT_CONFSETTING( 0x02, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL -INPUT_PORTS_END - -void esoccer_state::esoccer(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 475000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(esoccer_state::read_k)); - m_maincpu->r().set(FUNC(esoccer_state::write_r)); - m_maincpu->o().set(FUNC(esoccer_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x300, 0x7f); - m_display->set_bri_levels(0.008, 0.08); // player led is brighter - config.set_default_layout(layout_esoccer); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( esoccer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball (1) - * TMS1000NLP MP0914 (die label MP0914A) - * 1 7seg LED, and other LEDs behind bezel, 1-bit sound - - This is a handheld LED baseball game. One player controls the batter, the CPU - or other player controls the pitcher. Pitcher throw buttons are on a 'joypad' - obtained from a compartment in the back. Player scores are supposed to be - written down manually, the game doesn't save scores or innings (this annoyance - was resolved in the sequel). For more information, refer to the official manual. - - The overlay graphic is known to have 2 versions: one where the field players - are denoted by words ("left", "center", "short", etc), and an alternate one - with little guys drawn next to the LEDs. - - led translation table: led LDzz from game PCB = MAME y.x: - - 0 = - 10 = 1.2 20 = 4.2 30 = 6.0 - 1 = 2.3 11 = 0.4 21 = 4.1 31 = 6.1 - 2 = 0.0 12 = 1.5 22 = 4.0 32 = 6.2 - 3 = 0.1 13 = 2.2 23 = 4.3 33 = 7.0 - 4 = 0.2 14 = 3.3 24 = 5.3 34 = 7.1 - 5 = 1.0 15 = 3.2 25 = 5.2 - 6 = 1.3 16 = 2.1 26 = 5.1 - 7 = 1.1 17 = 3.1 27 = 5.0 - 8 = 0.3 18 = 3.0 28 = 7.2 - 9 = 1.4 19 = 2.0 29 = 7.3 - -***************************************************************************/ - -class ebball_state : public hh_tms1k_state -{ -public: - ebball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebball_state::update_display() -{ - m_display->matrix(m_r, ~m_o); -} - -void ebball_state::write_r(u16 data) -{ - // R1-R5: input mux - m_inp_mux = data >> 1 & 0x1f; - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0-R7: led select - // R8: digit select - m_r = data; - update_display(); -} - -void ebball_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 ebball_state::read_k() -{ - // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inputs[5]->read() | read_inputs(5); -} - -// config - -static INPUT_PORTS_START( ebball ) - PORT_START("IN.0") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Change Sides") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // Vss! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") -INPUT_PORTS_END - -void ebball_state::ebball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=47pF - m_maincpu->k().set(FUNC(ebball_state::read_k)); - m_maincpu->r().set(FUNC(ebball_state::write_r)); - m_maincpu->o().set(FUNC(ebball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x100, 0x7f); - config.set_default_layout(layout_ebball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball 2 - * PCB label ZENY - * TMS1000 MCU, MP0923 (die label same) - * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - The Japanese version was published by Gakken, black case instead of white. - - The sequel to Entex Baseball, this version keeps up with score and innings. - As its predecessor, the pitcher controls are on a separate joypad. - - led translation table: led zz from game PCB = MAME y.x: - - 00 = - 10 = 9.4 20 = 7.4 30 = 5.0 - 01 = 5.3 11 = 9.3 21 = 7.5 31 = 5.1 - 02 = 0.7 12 = 9.2 22 = 8.0 32 = 5.2 - 03 = 1.7 13 = 6.2 23 = 8.1 33 = 4.0 - 04 = 2.7 14 = 7.0 24 = 8.2 34 = 4.1 - 05 = 9.7 15 = 7.1 25 = 8.3 35 = 3.1 - 06 = 9.0 16 = 6.1 26 = 8.4 36 = 3.0 - 07 = 9.5 17 = 7.2 27 = 8.5 37 = 3.3 - 08 = 6.3 18 = 7.3 28 = 4.2 38 = 3.2 - 09 = 9.1 19 = 6.0 29 = 4.3 - -***************************************************************************/ - -class ebball2_state : public hh_tms1k_state -{ -public: - ebball2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebball2_state::update_display() -{ - m_display->matrix(m_r ^ 0x7f, ~m_o); -} - -void ebball2_state::write_r(u16 data) -{ - // R3-R6: input mux - m_inp_mux = data >> 3 & 0xf; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R2: digit select - // R3-R9: led select - m_r = data; - update_display(); -} - -void ebball2_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 ebball2_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( ebball2 ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ebball2_state::ebball2(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ebball2_state::read_k)); - m_maincpu->r().set(FUNC(ebball2_state::write_r)); - m_maincpu->o().set(FUNC(ebball2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_ebball2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball 3 - * PCB label ZENY - * TMS1100NLL 6007 MP1204 (rev. E!) (die label MP1204) - * 2*SN75492N LED display driver - * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - This is another improvement over Entex Baseball, where gameplay is a bit more - varied. Like the others, the pitcher controls are on a separate joypad. - - led translation table: led zz from game PCB = MAME y.x: - note: unlabeled panel leds are listed here as Sz, Bz, Oz, Iz, z left-to-right - - 00 = - 10 = 7.5 20 = 7.2 - 01 = 6.0 11 = 6.5 21 = 8.4 - 02 = 6.1 12 = 5.5 22 = 8.5 - 03 = 6.2 13 = 5.2 23 = 9.0 - 04 = 6.3 14 = 8.0 24 = 9.2 - 05 = 7.3 15 = 8.1 25 = 9.1 - 06 = 5.3 16 = 5.1 26 = 9.3 - 07 = 7.4 17 = 8.2 27 = 9.5 - 08 = 6.4 18 = 8.3 28 = 9.4 - 09 = 5.4 19 = 5.0 - - S1,S2: 4.0,4.1 - B1-B3: 3.0-3.2 - O1,O2: 4.2,4.3 - I1-I6: 2.0-2.5, I7-I9: 3.3-3.5 - -***************************************************************************/ - -class ebball3_state : public hh_tms1k_state -{ -public: - ebball3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball3(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void ebball3_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void ebball3_state::set_clock() -{ - // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz, - // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed - // it up to around ~440kHz. - m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 440000 : 340000); -} - -void ebball3_state::update_display() -{ - m_display->matrix_partial(0, 10, m_r, m_o); - - // R0,R1 are normal 7segs - // R4,R7 contain segments(only F and B) for the two other digits - m_display->write_row(10, (m_display->read_row(4) & 0x20) | (m_display->read_row(7) & 0x02)); - m_display->write_row(11, ((m_display->read_row(4) & 0x10) | (m_display->read_row(7) & 0x01)) << 1); -} - -void ebball3_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1, digit select - // R2-R9: led select - m_r = data; - update_display(); -} - -void ebball3_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 ebball3_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -/* physical button layout and labels are like this: - - main device (batter side): remote pitcher: - - MAN - PRO | [FAST BALL] [CHANGE UP] [CURVE] [SLIDER] - | OFF| - o o [STEAL DEFENSE] [KNUCKLER] - AM AUTO - - [BUNT] [BATTER] [STEAL] -*/ - -static INPUT_PORTS_START( ebball3 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Steal Defense") - - PORT_START("IN.2") // R2 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // AUTO - PORT_CONFSETTING( 0x00, "2" ) // MAN - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Bunt") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, ebball3_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // AM - PORT_CONFSETTING( 0x01, "2" ) // PRO -INPUT_PORTS_END - -void ebball3_state::ebball3(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 340000); // see set_clock - m_maincpu->k().set(FUNC(ebball3_state::read_k)); - m_maincpu->r().set(FUNC(ebball3_state::write_r)); - m_maincpu->o().set(FUNC(ebball3_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10+2, 7); - m_display->set_segmask(3, 0x7f); - m_display->set_segmask(0xc00, 0x22); - config.set_default_layout(layout_ebball3); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball3 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) ) - - 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_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Space Battle - * TMS1000 EN-6004 MP0920 (die label 1000B, MP0920) - * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - The Japanese version was published by Gakken, same name. - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 1.1 20 = 2.3 30 = 5.2 - 1 = 0.0 11 = 1.2 21 = 3.0 31 = 5.3 - 2 = 0.1 12 = 1.3 22 = 3.1 32 = 6.0 - 3 = 0.2 13 = 1.4 23 = 3.2 33 = 6.1 - 4 = 0.3 14 = 1.5 24 = 3.3 34 = 6.2 - 5 = 0.4 15 = 1.6 25 = 4.0 35 = 7.0 - 6 = 0.5 16 = 1.7 26 = 4.1 36 = 7.1 - 7 = 0.6 17 = 2.0 27 = 4.2 - 8 = 0.7 18 = 2.1 28 = 5.0 - 9 = 1.0 19 = 2.2 29 = 5.1 - -***************************************************************************/ - -class esbattle_state : public hh_tms1k_state -{ -public: - esbattle_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void esbattle(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void esbattle_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void esbattle_state::write_r(u16 data) -{ - // R0,R1: input mux - m_inp_mux = data & 3; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void esbattle_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 esbattle_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( esbattle ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual -INPUT_PORTS_END - -void esbattle_state::esbattle(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(esbattle_state::read_k)); - m_maincpu->r().set(FUNC(esbattle_state::write_r)); - m_maincpu->o().set(FUNC(esbattle_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x300, 0x7f); - config.set_default_layout(layout_esbattle); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( esbattle ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Blast It - * TMS1000 MP0230 (die label 1000B, MP0230) - * 3 7seg LEDs, 49 other LEDs (both under an overlay mask), 1-bit sound - -***************************************************************************/ - -class blastit_state : public hh_tms1k_state -{ -public: - blastit_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void blastit(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void blastit_state::update_display() -{ - m_display->matrix(m_r >> 1, m_o); -} - -void blastit_state::write_r(u16 data) -{ - // R3: input mux - m_inp_mux = data >> 3 & 1; - - // R0: speaker out - m_speaker->level_w(data & 1); - - // R1-R7: led select - // R8-R10: digit select - m_r = data; - update_display(); -} - -void blastit_state::write_o(u16 data) -{ - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 blastit_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( blastit ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) // AM - PORT_CONFSETTING( 0x00, "2" ) // PRO -INPUT_PORTS_END - -void blastit_state::blastit(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(blastit_state::read_k)); - m_maincpu->r().set(FUNC(blastit_state::write_r)); - m_maincpu->o().set(FUNC(blastit_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x380, 0x7f); - m_display->set_bri_levels(0.01, 0.115); // ball/paddle is slightly brighter - config.set_default_layout(layout_blastit); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( blastit ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0230", 0x0000, 0x0400, CRC(1eb5f473) SHA1(76cd8c0e04368aa2150d428018643e1d0b9adda0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_blastit_output.pla", 0, 365, CRC(fa8081df) SHA1(99706d5ad58a76d47446576fac18964e602171c8) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Space Invader - * TMS1100 MP1211 (die label same) - * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - There are two versions of this game: the first release(this one) is on - TMS1100, the second more widespread release runs on a COP400. There are - also differences with the overlay mask. - -***************************************************************************/ - -class einvader_state : public hh_tms1k_state -{ -public: - einvader_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - void einvader(machine_config &config); - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); -}; - -void einvader_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void einvader_state::set_clock() -{ - // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz, - // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed - // it up to around ~400kHz. - m_maincpu->set_unscaled_clock((m_inputs[0]->read() & 8) ? 400000 : 320000); -} - -void einvader_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void einvader_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R6: led select - // R7-R9: digit select - m_r = data; - update_display(); -} - -void einvader_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( einvader ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, einvader_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void einvader_state::einvader(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 320000); // see set_clock - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(einvader_state::write_r)); - m_maincpu->o().set(FUNC(einvader_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(945, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x380, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // ufo/player explosion is brighter - config.set_default_layout(layout_einvader); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvader ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) ) - - 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_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) ) - - ROM_REGION( 45196, "mask", 0) - ROM_LOAD( "einvader.svg", 0, 45196, CRC(35a1c744) SHA1(6beb9767454b9bc8f2ccf9fee25e7be209eefd22) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Color Football 4 - * TMS1670 6009 MP7551 (die label MP7551) - * 9-digit cyan VFD display, 60 red and green LEDs behind mask, 1-bit sound - - Another version exist, one with a LED(red) 7seg display. - -***************************************************************************/ - -class efootb4_state : public hh_tms1k_state -{ -public: - efootb4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void efootb4(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void efootb4_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void efootb4_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R0-R9: led select - // R10-R15: digit select - m_r = data; - update_display(); -} - -void efootb4_state::write_o(u16 data) -{ - // O7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 efootb4_state::read_k() -{ - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( efootb4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // 2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // 4 - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // 2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // 3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // 4 - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Run") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Run") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x02, "2" ) // professional - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Status") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void efootb4_state::efootb4(machine_config &config) -{ - // basic machine hardware - TMS1670(config, m_maincpu, 400000); // approximation - RC osc. R=42K, C=47pF - m_maincpu->k().set(FUNC(efootb4_state::read_k)); - m_maincpu->r().set(FUNC(efootb4_state::write_r)); - m_maincpu->o().set(FUNC(efootb4_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1920, 904); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(16, 7); - m_display->set_segmask(0xfc00, 0x7f); - config.set_default_layout(layout_efootb4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( efootb4 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) ) - - ROM_REGION( 67472, "mask", 0) - ROM_LOAD( "efootb4.svg", 0, 67472, CRC(ba0abcda) SHA1(6066e4cbae5404e4db17fae0153808b044adc823) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Basketball 2 - * TMS1100 6010 MP1218 (die label MP1218) - * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - led translation table: led zz from game PCB = MAME y.x: - - 11 = 9.0 21 = 9.1 31 = 9.2 41 = 9.3 51 = 9.5 - 12 = 8.0 22 = 8.1 32 = 8.2 42 = 8.3 52 = 8.5 - 13 = 7.0 23 = 7.1 33 = 7.2 43 = 7.3 53 = 8.4 - 14 = 6.0 24 = 6.1 34 = 6.2 44 = 6.3 54 = 7.5 - 15 = 5.0 25 = 5.1 35 = 5.2 45 = 5.3 55 = 7.4 - 16 = 4.0 26 = 4.1 36 = 4.2 46 = 4.3 56 = 6.5 - - A = 9.4 - B = 6.4 - -***************************************************************************/ - -class ebaskb2_state : public hh_tms1k_state -{ -public: - ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebaskb2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebaskb2_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void ebaskb2_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R6-R9: input mux - m_inp_mux = data >> 6 & 0xf; - - // R0-R3: digit select - // R4-R9: led select - m_r = data; - update_display(); -} - -void ebaskb2_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data; - update_display(); -} - -u8 ebaskb2_state::read_k() -{ - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( ebaskb2 ) - PORT_START("IN.0") // R6 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // amateur - PORT_CONFSETTING( 0x00, "2" ) // professional - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - - PORT_START("IN.1") // R7 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Shoot") - - PORT_START("IN.2") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.3") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY -INPUT_PORTS_END - -void ebaskb2_state::ebaskb2(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 360000); // approximation - RC osc. R=33K, C=82pF - m_maincpu->k().set(FUNC(ebaskb2_state::read_k)); - m_maincpu->r().set(FUNC(ebaskb2_state::write_r)); - m_maincpu->o().set(FUNC(ebaskb2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0xf, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // ball carrier led is brighter - config.set_default_layout(layout_ebaskb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebaskb2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) ) - - 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_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Raise The Devil - * TMS1100 MP1221 (die label same) - * 4 7seg LEDs(rightmost one unused), and other LEDs behind bezel, 1-bit sound - - Entex Black Knight (licensed handheld version of Williams' pinball game) - * TMS1100 MP1296 (no decap) - * same hardware as Raise The Devil - - raisedvl led translation table: led zz from game PCB = MAME y.x: - (no led labels on ebknight PCB) - - 0 = - 10 = 4.4 20 = 5.3 30 = 9.5 40 = 9.2 - 1 = 3.0 11 = 4.5 21 = 5.4 31 = 8.5 41 = 9.3 - 2 = 3.1 12 = - 22 = - 32 = 6.5 42 = 9.0 - 3 = 3.2 13 = 5.0 23 = 6.0 33 = 7.4 43 = 9.1 - 4 = 3.3 14 = 5.1 24 = 6.1 34 = 7.0 - 5 = 3.4 15 = 5.2 25 = 6.2 35 = 7.1 - 6 = 4.0 16 = - 26 = 6.3 36 = 8.0 - 7 = 4.1 17 = 7.2 27 = 6.4 37 = 8.1 - 8 = 4.2 18 = 7.3 28 = 8.4 38 = 8.2 - 9 = 4.3 19 = - 29 = 9.4 39 = 8.3 - - NOTE!: MAME external artwork is required - -***************************************************************************/ - -class raisedvl_state : public hh_tms1k_state -{ -public: - raisedvl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void raisedvl(machine_config &config); - void ebknight(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void raisedvl_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void raisedvl_state::set_clock() -{ - // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills - // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one. - // 0: R=47K -> ~350kHz - // 2,3: R=35K8 -> ~425kHz (combined) - // 4: R=32K -> ~465kHz (combined) - u8 inp = m_inputs[1]->read(); - m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000)); -} - -void raisedvl_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void raisedvl_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1: input mux - m_inp_mux = data & 3; - - // R0-R2: digit select - // R3-R9: led select - m_r = data; - update_display(); -} - -void raisedvl_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 raisedvl_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2) & 0xf; -} - -// config - -static INPUT_PORTS_START( raisedvl ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 (only bit 0) - PORT_CONFNAME( 0x31, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, raisedvl_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x10, "2" ) - PORT_CONFSETTING( 0x11, "3" ) - PORT_CONFSETTING( 0x21, "4" ) -INPUT_PORTS_END - -void raisedvl_state::raisedvl(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // see set_clock - m_maincpu->k().set(FUNC(raisedvl_state::read_k)); - m_maincpu->r().set(FUNC(raisedvl_state::write_r)); - m_maincpu->o().set(FUNC(raisedvl_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_raisedvl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void raisedvl_state::ebknight(machine_config &config) -{ - raisedvl(config); - config.set_default_layout(layout_ebknight); -} - -// roms - -ROM_START( raisedvl ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) ) - - 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_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) -ROM_END - -ROM_START( ebknight ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1296", 0x0000, 0x0800, CRC(bc57a46a) SHA1(f60843779f49a8bd28291df3390086e54b9e3f40) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified, taken from raisedvl - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ebknight_output.pla", 0, 365, BAD_DUMP CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) // " -ROM_END - - - - - -/*************************************************************************** - - Entex Musical Marvin - * TMS1100 MP1228 (no decap) - * 1 7seg LED, 8 other leds, 1-bit sound with volume decay - * dials for speed, tone (volume decay), volume (also off/on switch) - - The design patent was assigned to Hanzawa (Japan), so it's probably - manufactured by them. - -***************************************************************************/ - -class mmarvin_state : public hh_tms1k_state -{ -public: - mmarvin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_volume(*this, "volume"), - m_speed_timer(*this, "speed") - { } - - void mmarvin(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - required_device m_speed_timer; - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void mmarvin_state::machine_start() -{ - hh_tms1k_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(mmarvin_state::speaker_decay_sim) -{ - m_volume->flt_volume_set_volume(m_speaker_volume); - - // volume decays when speaker is off, decay scale is determined by tone dial - double step = (1.01 - 1.003) / 255.0; // approximation - m_speaker_volume /= 1.01 - (double)(u8)m_inputs[5]->read() * step; -} - -void mmarvin_state::update_display() -{ - u8 digit = bitswap<7>(m_o,6,2,1,0,5,4,3); // 7seg is upside-down - m_display->matrix(m_r, (m_o << 1 & 0x100) | (m_r & 0x80) | digit); -} - -void mmarvin_state::write_r(u16 data) -{ - // R2-R5: input mux - m_inp_mux = data >> 2 & 0xf; - - // R6: trigger speed dial timer - if (m_r & 0x40 && ~data & 0x40) - { - double step = (2100 - 130) / 255.0; // duration range is around 0.13s to 2.1s - m_speed_timer->adjust(attotime::from_msec(2100 - (u8)m_inputs[4]->read() * step)); - } - - // R10: speaker out - m_speaker->level_w(BIT(m_r, 10)); - - // R9: trigger speaker on - if (m_r & 0x200 && ~data & 0x200) - m_volume->flt_volume_set_volume(m_speaker_volume = 1.0); - - // R0,R1: digit/led select - // R7: digit DP - m_r = data; - update_display(); -} - -void mmarvin_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 mmarvin_state::read_k() -{ - // K1-K4: multiplexed inputs - // K8: speed dial state - return (read_inputs(4) & 7) | (m_speed_timer->enabled() ? 0 : 8); -} - -// config - -static INPUT_PORTS_START( mmarvin ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Mode") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button Do 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button Re") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button Mi") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button Fa") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button Sol") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Button La") - - PORT_START("IN.3") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Button Ti") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Button Do 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Space") - - PORT_START("IN.4") - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(1) PORT_NAME("Speed Dial") - - PORT_START("IN.5") - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(2) PORT_NAME("Tone Dial") -INPUT_PORTS_END - -void mmarvin_state::mmarvin(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=51K, C=47pF - m_maincpu->k().set(FUNC(mmarvin_state::read_k)); - m_maincpu->r().set(FUNC(mmarvin_state::write_r)); - m_maincpu->o().set(FUNC(mmarvin_state::write_o)); - - TIMER(config, "speed").configure_generic(nullptr); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 9); - m_display->set_segmask(1, 0xff); - config.set_default_layout(layout_mmarvin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(mmarvin_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( mmarvin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1228", 0x0000, 0x0800, CRC(68ce3ab6) SHA1(15f7fb3f438116bf6128f11c981bdc0852d5a4ec) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_mmarvin_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_mmarvin_output.bin", 0, 0x20, CRC(a274951f) SHA1(7e91ddd42c132942a32351649eaf1107b5b0285c) ) -ROM_END - - - - - -/*************************************************************************** - - Fonas 2 Player Baseball - * PCB label CA-014 (probably Cassia) - * TMS1000NLL MP0154 (die label 1000B, MP0154) - * 4 7seg LEDs, 37 other LEDs, 1-bit sound - - known releases: - - World: 2 Player Baseball, published by Fonas - - USA: 2 Player Baseball, published by Sears - - Canada: 2 Player Baseball, published by Talbot Electronics - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 2.2 20 = 4.0 30 = 4.4 - 1 = 2.3 11 = 3.3 21 = 2.7 31 = 3.7 - 2 = 0.4 12 = 1.2 22 = 0.0 32 = 4.3 - 3 = 3.2 13 = 2.4 23 = 4.1 33 = 4.6 - 4 = 0.5 14 = 1.0 24 = 3.1 34 = 3.5 - 5 = 0.3 15 = 2.1 25 = 0.2 35 = 4.5 - 6 = 3.4 16 = 1.1 26 = 0.1 - 7 = 1.3 17 = 4.7 27 = 4.2 - 8 = 1.4 18 = 2.0 28 = 3.0 - 9 = 1.7 19 = 0.7 29 = 1.5 - -***************************************************************************/ - -class f2pbball_state : public hh_tms1k_state -{ -public: - f2pbball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void f2pbball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void f2pbball_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void f2pbball_state::write_r(u16 data) -{ - // R4,R9,R10: input mux - m_inp_mux = (data >> 4 & 1) | (data >> 8 & 6); - - // R9,R10(ANDed together): speaker out - m_speaker->level_w(data >> 10 & data >> 9 & 1); - - // R0-R4: led select - // R5-R8: digit select - m_r = data; - update_display(); -} - -void f2pbball_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); - update_display(); -} - -u8 f2pbball_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( f2pbball ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pick Off") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "Practice" ) // middle switch - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pitch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Swing") - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast") - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) -INPUT_PORTS_END - -void f2pbball_state::f2pbball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=51K, C=39pF - m_maincpu->k().set(FUNC(f2pbball_state::read_k)); - m_maincpu->r().set(FUNC(f2pbball_state::write_r)); - m_maincpu->o().set(FUNC(f2pbball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1e0, 0x7f); - config.set_default_layout(layout_f2pbball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( f2pbball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) ) -ROM_END - - - - - -/*************************************************************************** - - Fonas 3 in 1: Football, Basketball, Soccer - * PCB label HP-801 - * 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 f3in1(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void f3in1_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -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_inputs[4]->read() & 1) ? 400000 : 300000); -} - -void f3in1_state::update_display() -{ - m_display->matrix(m_r & ~0x20, m_o); -} - -void f3in1_state::write_r(u16 data) -{ - // 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: led select - // R6-R9: digit select - m_r = data; - update_display(); -} - -void f3in1_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 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, 0) - PORT_CONFSETTING( 0x00, "1" ) // REG - PORT_CONFSETTING( 0x01, "2" ) // PROF -INPUT_PORTS_END - -void f3in1_state::f3in1(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // see set_clock - m_maincpu->k().set(FUNC(f3in1_state::read_k)); - m_maincpu->r().set(FUNC(f3in1_state::write_r)); - m_maincpu->o().set(FUNC(f3in1_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3c0, 0x7f); - m_display->set_bri_levels(0.003, 0.05); // player led is brighter - config.set_default_layout(layout_f3in1); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -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 - - - - - -/*************************************************************************** - - Gakken Poker - * PCB label POKER. gakken - * TMS1370 MP2105 (die label same) - * 11-digit cyan VFD display Itron FG1114B, oscillator sound - - known releases: - - Japan: Poker, published by Gakken - - USA: Electronic Poker, published by Entex - -***************************************************************************/ - -class gpoker_state : public hh_tms1k_state -{ -public: - gpoker_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_beeper(*this, "beeper") - { } - - void gpoker(machine_config &config); - -protected: - required_device m_beeper; - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void gpoker_state::update_display() -{ - u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; - m_display->matrix(m_r & 0x7ff, segs | (m_r >> 3 & 0xf00)); -} - -void gpoker_state::write_r(u16 data) -{ - // R15: enable beeper - m_beeper->set_state(data >> 15 & 1); - - // R0-R6: input mux - m_inp_mux = data & 0x7f; - - // R0-R10: select digit - // R11-R14: card symbols - m_r = data; - update_display(); -} - -void gpoker_state::write_o(u16 data) -{ - // O0-O7: digit segments A-G,H - m_o = data; - update_display(); -} - -u8 gpoker_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -/* physical button layout and labels are like this: - - [7] [8] [9] [DL] | (on/off switch) - [4] [5] [6] [BT] - [1] [2] [3] [CA] [CE] - [0] [GO] [T] [AC] -*/ - -static INPUT_PORTS_START( gpoker ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x06, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear All") // AC - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Call") // CA - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT - - PORT_START("FAKE") // 9/DL are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL -INPUT_PORTS_END - -void gpoker_state::gpoker(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(gpoker_state::read_k)); - m_maincpu->r().set(FUNC(gpoker_state::write_r)); - m_maincpu->o().set(FUNC(gpoker_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 14); - m_display->set_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal - config.set_default_layout(layout_gpoker); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2400); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gpoker ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) ) - - 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_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Jackpot: Gin Rummy & Black Jack - * PCB label gakken - * TMS1670 MPF553 (die label same) - * 11-digit cyan VFD display Itron FG1114B, oscillator sound - - known releases: - - Japan: Jackpot(?), published by Gakken - - USA: Electronic Jackpot: Gin Rummy & Black Jack, published by Entex - -***************************************************************************/ - -class gjackpot_state : public gpoker_state -{ -public: - gjackpot_state(const machine_config &mconfig, device_type type, const char *tag) : - gpoker_state(mconfig, type, tag) - { } - - void gjackpot(machine_config &config); - -private: - virtual void write_r(u16 data) override; -}; - -// handlers - -void gjackpot_state::write_r(u16 data) -{ - // same as gpoker, only input mux msb is R10 instead of R6 - gpoker_state::write_r(data); - m_inp_mux = (data & 0x3f) | (data >> 4 & 0x40); -} - -// config - -/* physical button layout and labels are like this: - (note: on dual-function buttons, upper label=Gin, lower label=Black Jack) - - BJ --o GIN - OFF - [7] [8] [9] [DL] - - [4] [5] [6] [ [KN - DB] SP] - [1] [2] [3] [DS] [DR] - BT] HT] - [10/0] [T] [MD [CH [AC] - GO] ST] -*/ - -static INPUT_PORTS_START( gjackpot ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10/0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Draw/Hit") // DR/HT - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Knock/Split") // KN/SP - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Display/Bet") // DS/BT - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Meld/Go") // MD/GO - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Double") // DB - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Change/Stand") // CH/ST - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R10 - PORT_CONFNAME( 0x06, 0x04, "Game Select" ) - PORT_CONFSETTING( 0x04, "Gin Rummy" ) - PORT_CONFSETTING( 0x02, "Black Jack" ) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gjackpot_state::gjackpot(machine_config &config) -{ - gpoker(config); - - // basic machine hardware - TMS1670(config.replace(), m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(gjackpot_state::read_k)); - m_maincpu->r().set(FUNC(gjackpot_state::write_r)); - m_maincpu->o().set(FUNC(gjackpot_state::write_o)); - - config.set_default_layout(layout_gjackpot); -} - -// roms - -ROM_START( gjackpot ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Invader - * PCB label GAKKEN, INVADER, KS-00779 - * TMS1370 MP2110 - * cyan VFD display Itron? CP5008A, 1-bit sound - - known releases: - - World: Invader, published by Gakken - - USA(1): Galaxy Invader, published by CGL - - USA(2): Fire Away, published by Tandy - - USA(3): Electron Blaster, published by Vanity Fair - - On the real thing, the joystick is "sticky"(it doesn't autocenter when you let go). - There's also a version with a cyan/red VFD, possibly the same ROM. - -***************************************************************************/ - -class ginv_state : public hh_tms1k_state -{ -public: - ginv_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ginv(machine_config &config); - -private: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ginv_state::write_r(u16 data) -{ - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R15: speaker out - m_speaker->level_w(data >> 15 & 1); - - // R0-R8: VFD grid - // R11-R14: VFD plate - m_grid = data & 0x1ff; - m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); - update_display(); -} - -void ginv_state::write_o(u16 data) -{ - // O0-O7: VFD plate - m_plate = (m_plate & ~0xff) | data; - update_display(); -} - -u8 ginv_state::read_k() -{ - // K1-K4: multiplexed inputs (K8 is fire button) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -static INPUT_PORTS_START( ginv ) - PORT_START("IN.0") // R9 - PORT_CONFNAME( 0x07, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x05, EQUALS, 0x00) // joystick centered - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) -INPUT_PORTS_END - -void ginv_state::ginv(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ginv_state::read_k)); - m_maincpu->r().set(FUNC(ginv_state::write_r)); - m_maincpu->o().set(FUNC(ginv_state::write_o)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(236, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ginv ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2110", 0x0000, 0x0800, CRC(f09c5588) SHA1(06eb8ed512eaf5367ea30c2b633219e105ddfd14) ) - - 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_ginv_output.pla", 0, 365, CRC(6e33a24e) SHA1(cdf7ecf12ddd3863e6301e20fe80f9737db429e5) ) - - ROM_REGION( 142959, "screen", 0) - ROM_LOAD( "ginv.svg", 0, 142959, CRC(b0dc9bac) SHA1(18f8cc51a432d14f08fdf766275222f3ed184d89) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Invader 1000 - * TMS1370 MP2139 (die label 1170 MP2139) - * cyan/red VFD display Futaba DM-25Z 2D, 1-bit sound - - known releases: - - World: Galaxy Invader 1000, published by Gakken - - Japan: Invader 1000, published by Gakken - - USA(1): Galaxy Invader 1000, published by CGL - - USA(2): Cosmic 1000 Fire Away, published by Tandy - -***************************************************************************/ - -class ginv1000_state : public hh_tms1k_state -{ -public: - ginv1000_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ginv1000(machine_config &config); - -private: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv1000_state::update_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); - m_display->matrix(grid, plate); -} - -void ginv1000_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R8,R15: input mux - m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2); - - // R1-R10: VFD grid - // R11-R14: VFD plate - m_grid = data >> 1 & 0x3ff; - m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); - update_display(); -} - -void ginv1000_state::write_o(u16 data) -{ - // O0-O7: VFD plate - m_plate = (m_plate & ~0xff) | data; - update_display(); -} - -u8 ginv1000_state::read_k() -{ - // K1,K2: multiplexed inputs (K8 is fire button) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -static INPUT_PORTS_START( ginv1000 ) - PORT_START("IN.0") // R8 - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFSETTING( 0x02, "3" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R15 - 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 ginv1000_state::ginv1000(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(ginv1000_state::read_k)); - m_maincpu->r().set(FUNC(ginv1000_state::write_r)); - m_maincpu->o().set(FUNC(ginv1000_state::write_o)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(226, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ginv1000 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) ) - - 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_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) ) - - ROM_REGION( 227224, "screen", 0) - ROM_LOAD( "ginv1000.svg", 0, 227224, CRC(f220711a) SHA1(729ad85fb9d9853a77c45b5ed072f10ede7649c4) ) -ROM_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, published by Gakken - - 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") - { } - - void ginv2000(machine_config &config); - -private: - required_device m_expander; - void expander_w(offs_t offset, u8 data); - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv2000_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ginv2000_state::expander_w(offs_t offset, u8 data) -{ - // TMS1024 port 4-7: VFD plate - int shift = (offset - tms1024_device::PORT4) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ginv2000_state::write_r(u16 data) -{ - // 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((data >> 12 & 1) | (data >> 10 & 2) | 4); - m_expander->write_std(data >> 13 & 1); - - // R1-R10: VFD grid - m_grid = data >> 1 & 0x3ff; - update_display(); -} - -void ginv2000_state::write_o(u16 data) -{ - // O4-O7: TMS1024 H1-H4 - m_expander->write_h(data >> 4 & 0xf); -} - -u8 ginv2000_state::read_k() -{ - // K1,K2: multiplexed inputs (K8 is fire button) - return m_inputs[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::ginv2000(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 425000); // approximation - RC osc. R=36K, C=47pF - m_maincpu->k().set(FUNC(ginv2000_state::read_k)); - m_maincpu->r().set(FUNC(ginv2000_state::write_r)); - m_maincpu->o().set(FUNC(ginv2000_state::write_o)); - - TMS1024(config, m_expander).set_ms(1); // MS tied high - m_expander->write_port4_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port5_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port6_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port7_callback().set(FUNC(ginv2000_state::expander_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(364, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -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, "screen", 0) - ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken FX-Micom R-165 - * TMS1100 MCU, label MP1312 (die label MP1312A) - * 1 7seg led, 6 other leds, 1-bit sound - - This is a simple educational home computer. Refer to the extensive manual - for more information. It was published later in the USA by Tandy(Radio Shack), - under their Science Fair series. Another 25 years later, Gakken re-released - the R-165 as GMC-4, obviously on modern hardware, but fully compatible. - - known releases: - - Japan: FX-Micom R-165, published by Gakken - - USA: Science Fair Microcomputer Trainer, published by Tandy. Of note is - the complete redesign of the case, adding more adjustable wiring - -***************************************************************************/ - -class fxmcr165_state : public hh_tms1k_state -{ -public: - fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void fxmcr165(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void fxmcr165_state::update_display() -{ - // 7seg digit from O0-O6 - m_display->write_row(0, bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f); - - // leds from R4-R10 - m_display->write_row(1, m_r >> 4 & 0x7f); -} - -void fxmcr165_state::write_r(u16 data) -{ - // R0-R3: input mux low - m_inp_mux = (m_inp_mux & 0x10) | (data & 0xf); - - // R7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // R4-R10: led data (direct) - m_r = data; - update_display(); -} - -void fxmcr165_state::write_o(u16 data) -{ - // O7: input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); - - // O0-O6: digit segments (direct) - m_o = data; - update_display(); -} - -u8 fxmcr165_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - [C] [D] [E] [F] [ADR SET] - [8] [9] [A] [B] [INCR] - [4] [5] [6] [7] [RUN] - [0] [1] [2] [3] [RESET] -*/ - -static INPUT_PORTS_START( fxmcr165 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") - - PORT_START("IN.4") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Reset") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Run") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Increment") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Address Set") -INPUT_PORTS_END - -void fxmcr165_state::fxmcr165(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->k().set(FUNC(fxmcr165_state::read_k)); - m_maincpu->r().set(FUNC(fxmcr165_state::write_r)); - m_maincpu->o().set(FUNC(fxmcr165_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1+1, 7); - m_display->set_segmask(1, 0x7f); - config.set_default_layout(layout_fxmcr165); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( fxmcr165 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Electronic Detective - * TMS0980NLL MP6100A (die label 0980B-00) - * 10-digit 7seg LED display, 2-level sound - - hardware (and concept) is very similar to Parker Brothers Stop Thief - - This is an electronic board game. It requires game cards with suspect info, - and good old pen and paper to record game progress. To start the game, enter - difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the - manual for more information. - -***************************************************************************/ - -class elecdet_state : public hh_tms1k_state -{ -public: - elecdet_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void elecdet(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void elecdet_state::write_r(u16 data) -{ - // R7,R8: speaker out - m_speaker->level_w((m_o & 0x80) ? (data >> 7 & 3) : 0); - - // R0-R6: select digit - m_display->matrix(data, bitswap<8>(m_o,7,5,2,1,4,0,6,3)); -} - -void elecdet_state::write_o(u16 data) -{ - // O0,O1,O4,O6: input mux - m_inp_mux = (data & 3) | (data >> 2 & 4) | (data >> 3 & 8); - - // O0-O6: digit segments A-G - // O7: speaker on -> write_r - m_o = data; -} - -u8 elecdet_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[4]->read() | read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - [1] [2] [3] [SUSPECT] - [4] [5] [6] [PRIVATE QUESTION] - [7] [8] [9] [I ACCUSE] - [0] [ENTER] - [ON] [OFF] [END TURN] -*/ - -static INPUT_PORTS_START( elecdet ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.3") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.4") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void elecdet_state::elecdet(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 425000); // approximation - m_maincpu->k().set(FUNC(elecdet_state::read_k)); - m_maincpu->r().set(FUNC(elecdet_state::write_r)); - m_maincpu->o().set(FUNC(elecdet_state::write_o)); - m_maincpu->power_off().set(FUNC(elecdet_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x7f, 0x7f); - config.set_default_layout(layout_elecdet); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 0.5, 0.5, 1.0}; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( elecdet ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - Kenner Star Wars - Electronic Battle Command - * TMS1100 MCU, label MP3438A (die label 1100B, MP3438A) - * 4x4 LED grid display + 2 separate LEDs and 2-digit 7segs, 1-bit sound - - This is a small tabletop space-dogfighting game. To start the game, - press BASIC/INTER/ADV and enter P#(number of players), then - START TURN. Refer to the official manual for more information. - -***************************************************************************/ - -class starwbc_state : public hh_tms1k_state -{ -public: - starwbc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void starwbc(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void starwbc_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void starwbc_state::write_r(u16 data) -{ - // R0,R1,R3,R5,R7: input mux - m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10); - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0,R2,R4: led select - // R6,R8: digit select - m_r = data & 0x155; - update_display(); -} - -void starwbc_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = (data << 4 & 0xf0) | (data >> 4 & 0x0f); - update_display(); -} - -u8 starwbc_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - (reconnnaissance=yellow) (tactical reaction=green) - [MAGNA] [ENEMY] [EM] [BS] [SCR] - - [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE] - [ADV] [P#] [<] [^] [>] [v] - (game=blue) (maneuvers=red) -*/ - -static INPUT_PORTS_START( starwbc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn") - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up") - - PORT_START("IN.3") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") -INPUT_PORTS_END - -void starwbc_state::starwbc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=51K, C=47pF - m_maincpu->k().set(FUNC(starwbc_state::read_k)); - m_maincpu->r().set(FUNC(starwbc_state::write_r)); - m_maincpu->o().set(FUNC(starwbc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x140, 0x7f); - config.set_default_layout(layout_starwbc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( starwbc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) -ROM_END - -ROM_START( starwbcp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) -ROM_END - - - - - -/*************************************************************************** - - Kenner Live Action Football - * TMS1100NLL MCU, label MP3489-N2 (die label 1100E, MP3489) - * 6-digit 7seg LED display, other LEDs under overlay, 1-bit sound - - The LEDs are inside reflective domes, with an overlay mask on top of that. - It is done with an SVG screen on MAME. In reality, the display is not as - sharp or as evenly lit as MAME suggests it to be. - - It has a 1-bit roller controller. Half of the axis connects to the input - (eg. 1 rising edge per full rotation), so there's no difference between - rotating left or right. - -***************************************************************************/ - -class liveafb_state : public hh_tms1k_state -{ -public: - liveafb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void liveafb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void liveafb_state::update_display() -{ - u8 d = (~m_r & 0x100) ? (m_r & 0x3f) : 0; // digit select - u8 l = (m_r & 0x100) ? (m_r & 0xf) : 0; // led select - m_display->matrix(d | l << 6 | BIT(m_r, 6) << 10 | BIT(m_r, 8, 3) << 11, m_o | (m_r << 4 & 0x300)); -} - -void liveafb_state::write_r(u16 data) -{ - // R0-R3: input mux - m_inp_mux = data & 0xf; - - // R7(+R8): speaker out - m_speaker->level_w(BIT(data, 7) & BIT(data, 8)); - - // R8: enable digit or led select - // R0-R3: led select - // R0-R5: digit select - // R4,R5: led data high - // R6,R8-R10: direct leds - m_r = data & ~0x80; - update_display(); -} - -void liveafb_state::write_o(u16 data) -{ - // O0-O7: led data low - m_o = data; - update_display(); -} - -u8 liveafb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( liveafb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("ROLLER", 0x7f, LESSTHAN, 0x40) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Tackle") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punt") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Field Goal") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Skill / Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Action") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("ROLLER") - PORT_BIT( 0x7f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) -INPUT_PORTS_END - -void liveafb_state::liveafb(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(liveafb_state::read_k)); - m_maincpu->r().set(FUNC(liveafb_state::write_r)); - m_maincpu->o().set(FUNC(liveafb_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1834, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6+4+4, 8+2); - m_display->set_segmask(0x3f, 0x7f); - m_display->set_segmask(0x20, 0xff); // only one digit has DP - config.set_default_layout(layout_liveafb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( liveafb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3489", 0x0000, 0x0800, CRC(1fe05ab3) SHA1(a8d7dfed61a6397b7af1d3fcf17b26d5d917b4f0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_liveafb_output.pla", 0, 365, CRC(a7bc9384) SHA1(fab458de394eeddbf5ba0830853a915e51f909c6) ) - - ROM_REGION( 162058, "mask", 0) - ROM_LOAD( "liveafb.svg", 0, 162058, CRC(046078d0) SHA1(68a5775f4f9a1258c06b76839e1cfdab69b61920) ) -ROM_END - - - - - -/*************************************************************************** - - Kosmos Astro - * TMS1470NLHL MP1133 (die label TMS1400 MP1133) - * 9-digit 7seg VFD display + 8 LEDs(4 green, 4 yellow), no sound - - This is an astrological calculator, and also supports 4-function - calculations. Refer to the official manual on how to use this device. - -***************************************************************************/ - -class astro_state : public hh_tms1k_state -{ -public: - astro_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void astro(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void astro_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void astro_state::write_r(u16 data) -{ - // R0-R7: input mux - m_inp_mux = data & 0xff; - - // R0-R9: led select - m_r = data; - update_display(); -} - -void astro_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 astro_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -static INPUT_PORTS_START( astro ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE"/Sun") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY"/Mercury") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-/Venus") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+/Mars") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=/Astro") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("B1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("B2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, "Mode" ) - PORT_CONFSETTING( 0x00, "Calculator" ) - PORT_CONFSETTING( 0x08, "Astro" ) -INPUT_PORTS_END - -void astro_state::astro(machine_config &config) -{ - // basic machine hardware - TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=4.7K, C=33pF - m_maincpu->k().set(FUNC(astro_state::read_k)); - m_maincpu->r().set(FUNC(astro_state::write_r)); - m_maincpu->o().set(FUNC(astro_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3ff, 0xff); - config.set_default_layout(layout_astro); - - // no sound! -} - -// roms - -ROM_START( astro ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) ) -ROM_END - - - - - -/*************************************************************************** - - Marx Series 300 Electronic Bowling Game - * TMS1100NLL MP3403 DBS 7836 SINGAPORE (no decap) - * 4*SN75492 quad segment driver, 2*SN74259 8-line demultiplexer, - 2*CD4043 quad r/s input latch - * 5 7seg LEDs, 15 lamps(10 lamps projected to bowling pins reflection), - 1bit-sound with crude volume control - * edge connector to sensors(switches trigger when ball rolls over) - and other inputs - - lamp translation table: SN74259.u5(mux 1) goes to MAME output 5.x, - SN74259.u6(mux 2) goes to MAME output 6.*. u1-u3 are SN75492 ICs, - where other: u1 A2 is N/C, u3 A1 is from O2 and goes to digits seg C. - - u5 Q0 -> u1 A4 -> L2 (pin #2) u6 Q0 -> u3 A4 -> L1 (pin #1) - u5 Q1 -> u1 A5 -> L4 (pin #4) u6 Q1 -> u3 A5 -> L5 (pin #5) - u5 Q2 -> u1 A6 -> L7 (pin #7) u6 Q2 -> u2 A3 -> L11 (player 1) - u5 Q3 -> u1 A1 -> L8 (pin #8) u6 Q3 -> u2 A2 -> L12 (player 2) - u5 Q4 -> u3 A2 -> L3 (pin #3) u6 Q4 -> u2 A1 -> L15 (?) - u5 Q5 -> u2 A6 -> L6 (pin #6) u6 Q5 -> u3 A6 -> L14 (?) - u5 Q6 -> u2 A5 -> L10 (pin #10) u6 Q6 -> u1 A3 -> L13 (spare) - u5 Q7 -> u2 A4 -> L9 (pin #9) u6 Q7 -> u3 A3 -> digit 4 B+C - -***************************************************************************/ - -class elecbowl_state : public hh_tms1k_state -{ -public: - elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void elecbowl(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void elecbowl_state::update_display() -{ - // standard 7segs - m_display->matrix_partial(0, 4, m_r >> 4, m_o); - - // lamp muxes - u8 sel = m_o & 7; - u8 state = m_r >> 1 & 1; - if (~m_r & 1) - m_display->write_element(5, sel, state); - if (~m_r & 4) - m_display->write_element(6, sel, state); - - // digit 4 is from mux2 Q7 - m_display->write_row(4, m_display->read_element(6, 7) ? 6 : 0); -} - -void elecbowl_state::write_r(u16 data) -{ - // R5-R7,R10: input mux - m_inp_mux = (data >> 5 & 7) | (data >> 7 & 8); - - // R9: speaker out - // R3,R8: speaker volume.. - m_speaker->level_w(data >> 9 & 1); - - // R4-R7: select digit - // R0,R2: lamp mux1,2 _enable - // R1: lamp muxes state - m_r = data; - update_display(); -} - -void elecbowl_state::write_o(u16 data) -{ - //if (data & 0x80) printf("%X ",data&0x7f); - - // O0-O2: lamp muxes select - // O0-O6: digit segments A-G - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 elecbowl_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( elecbowl ) - PORT_START("IN.0") // R5 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) - - PORT_START("IN.1") // R6 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // reset/test? - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // reset/test? - - PORT_START("IN.2") // R7 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.3") // R10 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw? -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 elecbowl_output_pla[0x20] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9 - 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // ? - 0, 1, 2, 3, 4, 5, 6, 7, // lamp muxes select - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f // ? -}; - -void elecbowl_state::elecbowl(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->set_output_pla(elecbowl_output_pla); - m_maincpu->k().set(FUNC(elecbowl_state::read_k)); - m_maincpu->r().set(FUNC(elecbowl_state::write_r)); - m_maincpu->o().set(FUNC(elecbowl_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 8); - m_display->set_segmask(0xf, 0x7f); - m_display->set_segmask(0x10, 0x06); // 1 - config.set_default_layout(layout_elecbowl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( elecbowl ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Thoroughbred Horse Race Analyzer - * PCB label 1670-4619D - * TMS1100NLL MP3491-N2 (die label 1100E MP3491) - * HLCD0569, 67-segment LCD panel, no sound - - This handheld is not a toy, read the manual for more information. In short, - it is a device for predicting the winning chance of a gambling horserace. - - It was rereleased in 1994 in China/Canada by AHTI(Advanced Handicapping - Technologies, Inc.), on a Hitachi HD613901. - -***************************************************************************/ - -class horseran_state : public hh_tms1k_state -{ -public: - horseran_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_lcd(*this, "lcd") - { } - - void horseran(machine_config &config); - -private: - required_device m_lcd; - - void lcd_output_w(offs_t offset, u32 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void horseran_state::lcd_output_w(offs_t offset, u32 data) -{ - // only 3 rows used - if (offset > 2) - return; - - // update lcd segments - m_display->matrix_partial(0, 3, 1 << offset, data); - - // col5-11 and col13-19 are 7segs - for (int i = 0; i < 2; i++) - m_display->write_row(3 + (offset << 1 | i), bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f); -} - -void horseran_state::write_r(u16 data) -{ - // R0: HLCD0569 clock - // R1: HLCD0569 data in - // R2: HLCD0569 _CS - m_lcd->cs_w(data >> 2 & 1); - m_lcd->data_w(data >> 1 & 1); - m_lcd->clock_w(data & 1); - - // R3-R10: input mux - m_inp_mux = data >> 3 & 0xff; -} - -u8 horseran_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -/* physical button layout and labels are like this: - - [PURSE] [DIST.] [P. POSN.] [DAYS] [R.S.L.] [7] [8] [9] - [RACES] [WINS] [PLACES] [SHOWS] [EARNINGS] [4] [5] [6] - [DISTANCE] [L.E.B. 1st] [L.E.B. 2nd] [L.E.B. 3rd] [FIN. POSN.] [1] [2] [3] - [L.E.B. Fin] [SPD. RTG.] [SPD. RTG.] [ANALYZE] [NEXT] [C/H] [C/E] [0] - - R.S.L. = Races Since (Last) Layoff - L.E.B. = Last Race / Lengths Back -*/ - -static INPUT_PORTS_START( horseran ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Next") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Final Position") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Earnings") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("R.S.L.") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Analyze") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("L.E.B. 3rd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Shows") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Days") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Speed Rating (right)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("L.E.B. 2nd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Places") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Post Position") - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Speed Rating (left)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("L.E.B. 1st") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wins") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Distance (L.E.B.)") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("L.E.B. Finish") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Distance") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Races") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Purse") - - PORT_START("IN.5") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.6") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("C/E") // Clear Entry - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.7") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("C/H") // Clear Horse Information - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") -INPUT_PORTS_END - -void horseran_state::horseran(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF - m_maincpu->k().set(FUNC(horseran_state::read_k)); - m_maincpu->r().set(FUNC(horseran_state::write_r)); - - // video hardware - HLCD0569(config, m_lcd, 1100); // C=0.022uF - m_lcd->write_cols().set(FUNC(horseran_state::lcd_output_w)); - - PWM_DISPLAY(config, m_display).set_size(3+6, 24); - m_display->set_segmask(0x3f<<3, 0x7f); - config.set_default_layout(layout_horseran); - - // no sound! -} - -// roms - -ROM_START( horseran ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Dungeons & Dragons - Computer Labyrinth Game - * TMS1100 M34012-N2LL (die label M34012) - * 72 buttons, no LEDs, 1-bit sound - - This is an electronic board game. It requires markers and wall pieces to play. - Refer to the official manual for more information. - -***************************************************************************/ - -class mdndclab_state : public hh_tms1k_state -{ -public: - mdndclab_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void mdndclab(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void mdndclab_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R9: input mux part - m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x3ff00); -} - -void mdndclab_state::write_o(u16 data) -{ - // O0-O7: input mux part - m_inp_mux = (m_inp_mux & ~0xff) | data; -} - -u8 mdndclab_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(18); -} - -// config - -static INPUT_PORTS_START( mdndclab ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.6") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.7") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.8") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Wall / Door") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Illegal Move / Warrior Moves") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Warrior 1 / Winner") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Warrior 2 / Treasure") - - PORT_START("IN.9") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.10") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.11") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.12") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.13") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.14") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.15") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.16") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.17") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Switch Key") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Next Turn / Level 1/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Dragon Flying / Defeat Tune") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Dragon Attacks / Dragon Wakes") -INPUT_PORTS_END - -void mdndclab_state::mdndclab(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 475000); // approximation - RC osc. R=27K, C=100pF - m_maincpu->k().set(FUNC(mdndclab_state::read_k)); - m_maincpu->r().set(FUNC(mdndclab_state::write_r)); - m_maincpu->o().set(FUNC(mdndclab_state::write_o)); - - config.set_default_layout(layout_mdndclab); // playing board - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mdndclab ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Comp IV - * TMC0904NL CP0904A (die label 4A0970D-04A) - * 10 LEDs behind bezel, no sound - - This is small tabletop Mastermind game; a code-breaking game where the player - needs to find out the correct sequence of colours (numbers in our case). - Press the R key to start, followed by a set of unique numbers and E. - Refer to the official manual for more information. - - known releases: - - USA: Comp IV (two versions, different case), published by MB - - Europe: Logic 5, published by MB - - Japan: Pythaligoras, published by Takara - -***************************************************************************/ - -class comp4_state : public hh_tms1k_state -{ -public: - comp4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void comp4(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void comp4_state::write_r(u16 data) -{ - // leds: - // R4 R9 - // R10! R8 - // R2 R7 - // R1 R6 - // R0 R5 - m_display->matrix(m_o, data); -} - -void comp4_state::write_o(u16 data) -{ - // O1-O3: input mux - m_inp_mux = data >> 1 & 7; - - // O0: leds common - // other bits: N/C - m_o = data; -} - -u8 comp4_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( comp4 ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("R") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("E") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") -INPUT_PORTS_END - -void comp4_state::comp4(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(comp4_state::read_k)); - m_maincpu->r().set(FUNC(comp4_state::write_r)); - m_maincpu->o().set(FUNC(comp4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_comp4); - - // no sound! -} - -// roms - -ROM_START( comp4 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1977 version, model 4750A) - * PCB label 4750A - * TMS1000NL MP3201 (die label 1000C, MP3201) - * LM324N, MC14016CP/TP4016AN, NE555P, discrete sound - * 4 sliding buttons, light bulb - - This is a 2-player electronic board game. It still needs game pieces like the - original Battleship board game. - - It went through at least 5 hardware revisions (not counting Talking Battleship): - 1977: model 4750A, TMS1000 discrete sound, see notes above - 1977: model 4750B, TMS1000 SN76477 sound, see notes at bshipb (driver below this) - 1979: model 4750C: cost-reduced single-chip design, lesser quality game board. - The chip is assumed to be custom, no MCU: 28-pin DIP, label 4750, SCUS 0462 - 1982: similar custom single-chip hardware, chip label MB4750 SCUS 0562 - 1982: back to MCU, COP420 instead of choosing TI, emulated in hh_cop400.cpp - -***************************************************************************/ - -class bship_state : public hh_tms1k_state -{ -public: - bship_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void bship(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bship_state::write_r(u16 data) -{ - // R0-R10: input mux - m_inp_mux = data; -} - -void bship_state::write_o(u16 data) -{ - // O4: explosion light bulb - m_display->matrix(1, data >> 4 & 1); - - // other: sound -} - -u8 bship_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[11]->read() | read_inputs(11); -} - -// config - -static INPUT_PORTS_START( bship ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 A") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 B") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 C") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 D") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 E") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 F") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 G") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 H") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 I") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 J") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch - - PORT_START("IN.11") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") -INPUT_PORTS_END - -void bship_state::bship(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set(FUNC(bship_state::read_k)); - m_maincpu->r().set(FUNC(bship_state::write_r)); - m_maincpu->o().set(FUNC(bship_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship); - - // sound hardware - // TODO -} - -// roms - -ROM_START( bship ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1977 version, model 4750B) - * PCB label MB 4750B - * TMS1000NLL MP3208 (die label 1000C, MP3208) - * SN75494N (acting as inverters), SN76477 sound - * 4 sliding buttons, light bulb - - This is the 2nd version. The sound hardware was changed to a SN76477. - -***************************************************************************/ - -class bshipb_state : public hh_tms1k_state -{ -public: - bshipb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_sn(*this, "sn76477") - { } - - void bshipb(machine_config &config); - -private: - required_device m_sn; - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bshipb_state::write_r(u16 data) -{ - // R0-R10: input mux - m_inp_mux = data; - - // R4: 75494 to R12 33K to SN76477 pin 20 - m_sn->slf_res_w((data & 0x10) ? RES_INF : RES_K(33)); -} - -void bshipb_state::write_o(u16 data) -{ - //printf("%X ", m_maincpu->debug_peek_o_index() & 0xf); - - // O0: SN76477 pin 9 - m_sn->enable_w(data & 1); - - // O1: 75494 to R4 100K to SN76477 pin 18 - // O2: 75494 to R3 150K to SN76477 pin 18 - double o12 = RES_INF; - switch (~data >> 1 & 3) - { - case 0: o12 = RES_INF; break; - case 1: o12 = RES_K(100); break; - case 2: o12 = RES_K(150); break; - case 3: o12 = RES_2_PARALLEL(RES_K(100), RES_K(150)); break; - } - m_sn->vco_res_w(o12); - - // O2,O6: (TODO) to SN76477 pin 21 - //m_sn->slf_cap_w(x); - - // O4: SN76477 pin 22 - m_sn->vco_w(data >> 4 & 1); - - // O5: R11 27K to SN76477 pin 23 - m_sn->one_shot_cap_w((data & 0x20) ? RES_K(27) : 0); - - // O6: SN76477 pin 25 - m_sn->mixer_b_w(data >> 6 & 1); - - // O7: 75494 to light bulb - m_display->matrix(1, data >> 7 & 1); -} - -u8 bshipb_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[11]->read() | read_inputs(11); -} - -// config - -// buttons are same as bship set - -void bshipb_state::bshipb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set(FUNC(bshipb_state::read_k)); - m_maincpu->r().set(FUNC(bshipb_state::write_r)); - m_maincpu->o().set(FUNC(bshipb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SN76477(config, m_sn); - m_sn->set_noise_params(RES_K(47), RES_K(100), CAP_P(47)); // R18, R17, C8 - m_sn->set_decay_res(RES_M(3.3)); // R16 - m_sn->set_attack_params(CAP_U(0.47), RES_K(15)); // C7, R20 - m_sn->set_amp_res(RES_K(100)); // R19 - m_sn->set_feedback_res(RES_K(39)); // R7 - m_sn->set_vco_params(5.0 * RES_VOLTAGE_DIVIDER(RES_K(47), RES_K(33)), CAP_U(0.01), RES_K(270)); // R15/R14, C5, switchable R5/R3/R4 - m_sn->set_pitch_voltage(5.0); - m_sn->set_slf_params(CAP_U(22), RES_K(750)); // switchable C4, switchable R13/R12 - m_sn->set_oneshot_params(0, RES_INF); // NC, switchable R11 - m_sn->set_vco_mode(0); // switchable - m_sn->set_mixer_params(0, 0, 0); // switchable, GND, GND - m_sn->set_envelope_params(1, 0); // Vreg, GND - m_sn->set_enable(0); // switchable - m_sn->add_route(ALL_OUTPUTS, "mono", 0.35); -} - -// roms - -ROM_START( bshipb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Simon (model 4850), created by Ralph Baer - * TMS1000 (die label MP3226), or MP3300 (die label 1000C, MP3300) - * DS75494 Hex digit LED driver, 4 big lamps, 1-bit sound - - known revisions: - - 1978: Rev A: TMS1000(no label) - - 198?: Rev B: MB4850 SCUS0640(16-pin custom ASIC), PCB label REV.B, - cost-reduced, same hardware as Pocket Simon - - 1979: Rev F: TMS1000(MP3300), PCB label 4850 Rev F - - The semi-sequel Super Simon uses a TMS1100 (see next minidriver). - -***************************************************************************/ - -class simon_state : public hh_tms1k_state -{ -public: - simon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void simon(machine_config &config); - -private: - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void simon_state::write_r(u16 data) -{ - // R4-R8 go through an 75494 IC first: - // R4 -> 75494 IN6 -> green lamp - // R5 -> 75494 IN3 -> red lamp - // R6 -> 75494 IN5 -> yellow lamp - // R7 -> 75494 IN2 -> blue lamp - m_display->matrix(1, data >> 4); - - // R8 -> 75494 IN0 -> speaker out - m_speaker->level_w(data >> 8 & 1); - - // R0-R2,R9: input mux - // R3: GND - // other bits: N/C - m_inp_mux = (data & 7) | (data >> 6 & 8); -} - -u8 simon_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( simon ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x07, 0x02, "Game Select") - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Green Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Blue Button") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R9 - PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x01, "4" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x07) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x07) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) -INPUT_PORTS_END - -void simon_state::simon(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(simon_state::read_k)); - m_maincpu->r().set(FUNC(simon_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_simon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( simon ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) -ROM_END - -ROM_START( simonf ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Super Simon - * TMS1100 MP3476NLL (die label MP3476) - * 8 big lamps(2 turn on at same time), 1-bit sound - - The semi-squel to Simon, not as popular. It includes more game variations - and a 2-player head-to-head mode. - -***************************************************************************/ - -class ssimon_state : public hh_tms1k_state -{ -public: - ssimon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ssimon(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void write_r(u16 data); - u8 read_k(); -}; - -void ssimon_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void ssimon_state::set_clock() -{ - // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch: - // 0 Simple: R=51K -> ~200kHz - // 1 Normal: R=37K -> ~275kHz - // 2 Super: R=22K -> ~400kHz - u8 inp = m_inputs[6]->read(); - m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000)); -} - -void ssimon_state::write_r(u16 data) -{ - // R0-R3,R9,R10: input mux - m_inp_mux = (data & 0xf) | (data >> 5 & 0x30); - - // R4: yellow lamps - // R5: green lamps - // R6: blue lamps - // R7: red lamps - m_display->matrix(1, data >> 4); - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); -} - -u8 ssimon_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ssimon ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x0f, 0x01, "Game Select") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x00, "5" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Green Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Blue Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Red Button") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Decision") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Green Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Blue Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Red Button") - - PORT_START("IN.4") // R9 - PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Head-to-Head" ) // this sets R10 K2, see below - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x01, "4" ) - - PORT_START("IN.5") // R10 - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.4", 0x0f, EQUALS, 0x00) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // fake - PORT_CONFNAME( 0x03, 0x01, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ssimon_state, speed_switch, 0) - PORT_CONFSETTING( 0x00, "Simple" ) - PORT_CONFSETTING( 0x01, "Normal" ) - PORT_CONFSETTING( 0x02, "Super" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x0f) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x0f) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<4>, 0x0f) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<4>, 0x0f) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<6>, 0x03) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03) -INPUT_PORTS_END - -void ssimon_state::ssimon(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 275000); // see set_clock - m_maincpu->k().set(FUNC(ssimon_state::read_k)); - m_maincpu->r().set(FUNC(ssimon_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ssimon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssimon ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Big Trak - * TMS1000NLL MP3301A or MP3301ANLL E (rev. E!) (die label 1000E MP3301) - * SN75494N Hex digit LED driver, 1 lamp, 3-level sound - * gearbox with magnetic clutch, 1 IR led+sensor, 2 motors(middle wheels) - * 24-button keypad, ext in/out ports - - Big Trak is a programmable toy car, up to 16 steps. Supported commands include - driving and turning, firing a photon cannon(hey, have some imagination!), - and I/O ports. The output port was used for powering the dump truck accessory. - - The In command was canceled midst production, it is basically a nop. Newer - releases and the European version removed the button completely. - -***************************************************************************/ - -class bigtrak_state : public hh_tms1k_state -{ -public: - bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_left_motor_forward(*this, "left_motor_forward"), - m_left_motor_reverse(*this, "left_motor_reverse"), - m_right_motor_forward(*this, "right_motor_forward"), - m_right_motor_reverse(*this, "right_motor_reverse"), - m_ext_out(*this, "ext_out") - { } - - void bigtrak(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - int m_gearbox_pos = 0; - bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } - TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); - - output_finder<> m_left_motor_forward; - output_finder<> m_left_motor_reverse; - output_finder<> m_right_motor_forward; - output_finder<> m_right_motor_reverse; - output_finder<> m_ext_out; -}; - -void bigtrak_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // resolve handlers - m_left_motor_forward.resolve(); - m_left_motor_reverse.resolve(); - m_right_motor_forward.resolve(); - m_right_motor_reverse.resolve(); - m_ext_out.resolve(); - - // register for savestates - save_item(NAME(m_gearbox_pos)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(bigtrak_state::gearbox_sim_tick) -{ - // the last gear in the gearbox has 12 evenly spaced holes, it is located - // between an IR emitter and receiver - static const int speed = 17; - if (m_gearbox_pos >= speed) - m_gearbox_pos = -speed; - - if (m_o & 0x1e) - m_gearbox_pos++; -} - -void bigtrak_state::write_r(u16 data) -{ - // R0-R5,R8: input mux (keypad, ext in enable) - m_inp_mux = (data & 0x3f) | (data >> 2 & 0x40); - - // R6: N/C - // R7: IR led on - // R9: lamp on - m_display->matrix(1, (data >> 7 & 1) | (data >> 8 & 2)); - - // (O0,O7,)R10(tied together): speaker out - m_speaker->level_w((m_o & 1) | (m_o >> 6 & 2) | (data >> 8 & 4)); - m_r = data; -} - -void bigtrak_state::write_o(u16 data) -{ - // O1: left motor forward - // O2: left motor reverse - // O3: right motor reverse - // O4: right motor reverse - // O5: ext out - // O6: N/C - m_left_motor_forward = data >> 1 & 1; - m_left_motor_reverse = data >> 2 & 1; - m_right_motor_forward = data >> 3 & 1; - m_right_motor_reverse = data >> 4 & 1; - m_ext_out = data >> 5 & 1; - - // O0,O7(,R10)(tied together): speaker out - m_speaker->level_w((data & 1) | (data >> 6 & 2) | (m_r >> 8 & 4)); - m_o = data; -} - -u8 bigtrak_state::read_k() -{ - // K: multiplexed inputs - // K8: IR sensor - return read_inputs(7) | (sensor_state() ? 8 : 0); -} - -// config - -/* physical button layout and labels are like this: - - USA version: UK version: - - [^] [CLR] [^] [CM] - [<] [HOLD] [>] [FIRE] [<] [P] [>] [\|/] - [v] [CLS] [v] [CE] - [7] [8] [9] [RPT] [7] [8] [9] [x2] - [4] [5] [6] [TEST] [4] [5] [6] [TEST] - [1] [2] [3] [CK] [1] [2] [3] [checkmark] - [IN] [0] [OUT] [GO] [0] [OUT] [GO] -*/ - -static INPUT_PORTS_START( bigtrak ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hold") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear Memory") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Backward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Last Step") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Test") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Check") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("In") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Out") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.6") // R8 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("Input Port") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bigtrak_state::bigtrak(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=83K, C=100pF - m_maincpu->k().set(FUNC(bigtrak_state::read_k)); - m_maincpu->r().set(FUNC(bigtrak_state::write_r)); - m_maincpu->o().set(FUNC(bigtrak_state::write_o)); - - TIMER(config, "gearbox").configure_periodic(FUNC(bigtrak_state::gearbox_sim_tick), attotime::from_msec(1)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 2); - config.set_default_layout(layout_bigtrak); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bigtrak ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Dark Tower - * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label MP7332) - (assume same ROM contents between revisions) - * SN75494N MOS-to-LED digit driver - * motorized rotating reel + lightsensor, 1bit-sound - - This is a board game, it obviously requires game pieces and the board. - The emulated part is the centerpiece, a black tower with a rotating card - panel and LED digits for displaying health, amount of gold, etc. As far - as MAME is concerned, the game works fine. - - To start up the game, first press [MOVE], the machine now does a self-test. - Then select level and number of players and the game will start. Read the - official manual on how to play the game. - -***************************************************************************/ - -class mbdtower_state : public hh_tms1k_state -{ -public: - mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_motor_pos_out(*this, "motor_pos"), - m_card_pos_out(*this, "card_pos"), - m_motor_on_out(*this, "motor_on") - { } - - void mbdtower(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void update_display(); - bool sensor_led_on() { return m_display->element_on(0, 0); } - - output_finder<> m_motor_pos_out; - output_finder<> m_card_pos_out; - output_finder<> m_motor_on_out; - - int m_motor_pos = 0; - int m_motor_pos_prev = -1; - int m_motor_decay = 0; - bool m_motor_on = false; - bool m_sensor_blind = false; - - TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void mbdtower_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - m_motor_pos_out.resolve(); - m_card_pos_out.resolve(); - m_motor_on_out.resolve(); - - // register for savestates - save_item(NAME(m_motor_pos)); - /* save_item(NAME(m_motor_pos_prev)); */ // don't save! - save_item(NAME(m_motor_decay)); - save_item(NAME(m_motor_on)); - save_item(NAME(m_sensor_blind)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) -{ - // it rotates counter-clockwise (when viewed from above) - if (m_motor_on) - { - m_motor_pos = (m_motor_pos - 1) & 0x7f; - - // give it some time to spin out when it's turned off - if (m_r & 0x200) - m_motor_decay += (m_motor_decay < 4); - else if (m_motor_decay > 0) - m_motor_decay--; - else - m_motor_on = false; - } - - // 8 evenly spaced holes in the rotation disc for the sensor to 'see' through. - // The first hole is much bigger, enabling the game to determine the position. - if ((m_motor_pos & 0xf) < 4 || m_motor_pos < 0xc) - m_sensor_blind = false; - else - m_sensor_blind = true; - - // on change, output info - if (m_motor_pos != m_motor_pos_prev) - m_motor_pos_out = 100 * (m_motor_pos / (float)0x80); - - /* 3 display cards per hole, like this: - - (0) <---- display increments this way <---- (7) - - CURSED VICTORY WIZARD DRAGON GOLD KEY SCOUT WARRIOR (void) - LOST WARRIORS BAZAAR CLOSED SWORD SILVER KEY HEALER FOOD (void) - PLAGUE BRIGANDS KEY MISSING PEGASUS BRASS KEY GOLD BEAST (void) - */ - int card_pos = m_motor_pos >> 4 & 7; - if (card_pos != (m_motor_pos_prev >> 4 & 7)) - m_card_pos_out = card_pos; - - m_motor_pos_prev = m_motor_pos; -} - -void mbdtower_state::update_display() -{ - // update current state - if (~m_r & 0x10) - { - u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; - m_display->write_row(2, (m_o & 0x80) ? o : 0); - m_display->write_row(1, (m_o & 0x80) ? 0 : o); - m_display->write_row(0, (m_r >> 8 & 1) | (m_r >> 4 & 0xe)); - } - else - { - // display items turned off - m_display->clear(); - } -} - -void mbdtower_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R9: motor on - if ((m_r ^ data) & 0x200) - m_motor_on_out = data >> 9 & 1; - if (data & 0x200) - m_motor_on = true; - - // R3: N/C - // R4: 75494 /EN (speaker, lamps, digit select go through that IC) - // R5-R7: tower lamps - // R8: rotation sensor led - m_r = data; - update_display(); - - // R10: speaker out - m_speaker->level_w(~data >> 4 & data >> 10 & 1); -} - -void mbdtower_state::write_o(u16 data) -{ - // O0-O6: led segments A-G - // O7: digit select - m_o = data; - update_display(); -} - -u8 mbdtower_state::read_k() -{ - // K: multiplexed inputs - // K8: rotation sensor - return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0); -} - -// config - -/* physical button layout and labels are like this: - - (green) (l.blue) (red) - [YES/ [REPEAT] [NO/ - BUY] END] - - (yellow) (blue) (white) - [HAGGLE] [BAZAAR] [CLEAR] - - (blue) (blue) (blue) - [TOMB/ [MOVE] [SANCTUARY/ - RUIN] CITADEL] - - (orange) (blue) (d.yellow) - [DARK [FRONTIER] [INVENTORY] - TOWER] -*/ - -static INPUT_PORTS_START( mbdtower ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") -INPUT_PORTS_END - -void mbdtower_state::mbdtower(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=43K, C=56pF - m_maincpu->k().set(FUNC(mbdtower_state::read_k)); - m_maincpu->r().set(FUNC(mbdtower_state::write_r)); - m_maincpu->o().set(FUNC(mbdtower_state::write_o)); - - TIMER(config, "tower_motor").configure_periodic(FUNC(mbdtower_state::motor_sim_tick), attotime::from_msec(3500/0x80)); // ~3.5sec for a full rotation - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(6, 0x7f); - config.set_default_layout(layout_mbdtower); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mbdtower ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Arcade Mania - * TMS1100 M34078A-N2LL (die label 1100G, M34078A) - * 9 LEDs, 3-bit sound - - This is a board game. The mini arcade machine is the emulated part here. - External artwork is needed for the game overlays. - -***************************************************************************/ - -class arcmania_state : public hh_tms1k_state -{ -public: - arcmania_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void arcmania(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void arcmania_state::write_r(u16 data) -{ - // R1-R9: leds - m_display->matrix(1, data >> 1); -} - -void arcmania_state::write_o(u16 data) -{ - // O0-O2(tied together): speaker out - m_speaker->level_w(data & 7); - - // O3,O4,O6: input mux - m_inp_mux = (data >> 3 & 3) | (data >> 4 & 4); - - // O5: power off when low (turn back on with button row 1) - if (~data & 0x20) - power_off(); -} - -u8 arcmania_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -/* physical button layout and labels are like this: - - (orange) (orange) (orange) - [1] [2] [3] - - (red) (yellow) (blue) - [RUN] [SNEAK - AMUK] ATTACK] - - (green) (yellow) (purple) - [Alien [Rattler] - Raiders] -*/ - -static INPUT_PORTS_START( arcmania ) - PORT_START("IN.0") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Alien Raiders") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Yellow Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Rattler") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Run Amuk") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Yellow Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Sneak Attack") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // O6 (also O5 to power) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void arcmania_state::arcmania(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=100pF - m_maincpu->k().set(FUNC(arcmania_state::read_k)); - m_maincpu->r().set(FUNC(arcmania_state::write_r)); - m_maincpu->o().set(FUNC(arcmania_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 9); - config.set_default_layout(layout_arcmania); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( arcmania ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Code Name: Sector, by Bob Doyle - * TMS0970 MCU, MP0905BNL ZA0379 (die label 0970F-05B) - * 6-digit 7seg LED display + 4 LEDs for compass, no sound - - This is a tabletop submarine pursuit game. A grid board and small toy - boats are used to remember your locations (a Paint app should be ok too). - Refer to the official manual for more information, it is not a simple game. - -***************************************************************************/ - -class cnsector_state : public hh_tms1k_state -{ -public: - cnsector_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnsector(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnsector_state::write_r(u16 data) -{ - // R0-R5: select digit - // R6-R9: direction leds - m_display->matrix(data, m_o); -} - -void cnsector_state::write_o(u16 data) -{ - // O0-O4: input mux - m_inp_mux = data & 0x1f; - - // O0-O7: digit segments - m_o = data; -} - -u8 cnsector_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - COMBAT INFORMATION CENTER - [NEXT SHIP] [RECALL] [MOVE SHIP] - - [LEFT] [RIGHT] o [SLOWER] [FASTER] - STEERING EVASIVE SUB SPEED o (on/off switch) - NAVIGATIONAL PROGRAMMING | - - [RANGE] [AIM] [FIRE] o [TEACH MODE] - SONAR CONTROL SUB FINDER -*/ - -static INPUT_PORTS_START( cnsector ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode") -INPUT_PORTS_END - -void cnsector_state::cnsector(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(cnsector_state::read_k)); - m_maincpu->r().set(FUNC(cnsector_state::write_r)); - m_maincpu->o().set(FUNC(cnsector_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3f, 0xff); - config.set_default_layout(layout_cnsector); - - // no sound! -} - -// roms - -ROM_START( cnsector ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Merlin handheld game, by Bob Doyle - * TMS1100NLL MP3404 or MP3404A-N2 - * 11 LEDs behind buttons, 3-level sound - - Also published in Japan by Tomy as "Dr. Smith", white case instead of red. - The one with dark-blue case is the rare sequel Master Merlin, see below. - More sequels followed too, but on other hardware. - - To start a game, press NEW GAME, followed by a number: - 1: Tic-Tac-Toe - 2: Music Machine - 3: Echo - 4: Blackjack 13 - 5: Magic Square - 6: Mindbender - - Refer to the official manual for more information on the games. - -***************************************************************************/ - -class merlin_state : public hh_tms1k_state -{ -public: - merlin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void merlin(machine_config &config); - -protected: - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void merlin_state::write_r(u16 data) -{ - /* leds: - - R0 - R1 R2 R3 - R4 R5 R6 - R7 R8 R9 - R10 - */ - m_display->matrix(1, data); -} - -void merlin_state::write_o(u16 data) -{ - // O4-O6(tied together): speaker out - m_speaker->level_w(data >> 4 & 7); - - // O0-O3: input mux - // O7: N/C - m_inp_mux = data & 0xf; -} - -u8 merlin_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( merlin ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Same Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game") -INPUT_PORTS_END - -void merlin_state::merlin(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(merlin_state::read_k)); - m_maincpu->r().set(FUNC(merlin_state::write_r)); - m_maincpu->o().set(FUNC(merlin_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_merlin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( merlin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3404a", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) -ROM_END - -ROM_START( merlina ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(9362d9f9) SHA1(266d2a4a98cc33944a4fc7ed073ba9321bba8e05) ) // 1 bit different - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Master Merlin - * TMS1400 MP7351-N2LL (die label 1400CR MP7351) - * 11 LEDs behind buttons, 3-level sound - - The TMS1400CR MCU has the same pinout as a standard TMS1100. The hardware - outside of the MCU is exactly the same as Merlin. - - The included minigames are: - 1: Three Shells - 2: Hi/Lo - 3: Match It - 4: Hit or Miss - 5: Pair Off - 6: Tempo - 7: Musical Ladder - 8: Patterns - 9: Hot Potato - -***************************************************************************/ - -class mmerlin_state : public merlin_state -{ -public: - mmerlin_state(const machine_config &mconfig, device_type type, const char *tag) : - merlin_state(mconfig, type, tag) - { } - - void mmerlin(machine_config &config); -}; - -// handlers: uses the ones in merlin_state - -// config - -static INPUT_PORTS_START( mmerlin ) - PORT_INCLUDE( merlin ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") // instead of Hit Me -INPUT_PORTS_END - -void mmerlin_state::mmerlin(machine_config &config) -{ - merlin(config); - - // basic machine hardware - TMS1400(config.replace(), m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF - m_maincpu->k().set(FUNC(mmerlin_state::read_k)); - m_maincpu->r().set(FUNC(mmerlin_state::write_r)); - m_maincpu->o().set(FUNC(mmerlin_state::write_o)); - - config.set_default_layout(layout_mmerlin); -} - -// roms - -ROM_START( mmerlin ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Electronic Master Mind - * TMS1000NLL MP3200 (die label 1000E, MP3200) - * 5 red leds, 5 green leds - - This is a board game, it came with 4 plug boards and a lot of colored pegs. - It's not related to the equally named Electronic Master Mind by Invicta, - that one is on a Rockwell MM75. - -***************************************************************************/ - -class pbmastm_state : public hh_tms1k_state -{ -public: - pbmastm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void pbmastm(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void pbmastm_state::write_r(u16 data) -{ - // R1-R10: leds (direct) - m_display->matrix(1, data >> 1); -} - -void pbmastm_state::write_o(u16 data) -{ - // O0-O5: input mux - m_inp_mux = data & 0x3f; -} - -u8 pbmastm_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( pbmastm ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("D") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Blue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Brown") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Black") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Yellow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("White") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Pink") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Gray") - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Green") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Orange") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Blank") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Delete") - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Battery Test") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Code") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Check") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pbmastm_state::pbmastm(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF - m_maincpu->k().set(FUNC(pbmastm_state::read_k)); - m_maincpu->r().set(FUNC(pbmastm_state::write_r)); - m_maincpu->o().set(FUNC(pbmastm_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 10); - config.set_default_layout(layout_pbmastm); - - // no sound! -} - -// roms - -ROM_START( pbmastm ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3200", 0x0000, 0x0400, CRC(059dbb88) SHA1(20e3f6aeecce167371bda914f263daf53c50c839) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_pbmastm_output.pla", 0, 365, CRC(b355c4d9) SHA1(43cc971a4feacfddfe810c8983c65d9eef3ed57b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Stop Thief, by Bob Doyle - * TMS0980NLL MP6101B (die label 0980B-01A) - * 3-digit 7seg LED display, 6-level sound - - Stop Thief is actually a board game, the electronic device emulated here - (called Electronic Crime Scanner) is an accessory. To start a game, press - the ON button. Otherwise, it is in test-mode where you can hear all sounds. - For the patent romset, it needs to be turned off and on to exit test mode. - -***************************************************************************/ - -class stopthief_state : public hh_tms1k_state -{ -public: - stopthief_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void stopthief(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void stopthief_state::write_r(u16 data) -{ - // R0-R2: select digit - m_display->matrix(data & 7, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f); - - // R3-R8(tied together): speaker out - int level = 0; - for (int i = 0; m_o & 8 && i < 6; i++) - level += (data >> (i+3) & 1); - m_speaker->level_w(level); -} - -void stopthief_state::write_o(u16 data) -{ - // O0,O6: input mux - m_inp_mux = (data & 1) | (data >> 5 & 2); - - // O3: speaker on - // O0-O2,O4-O7: led segments A-G - m_o = data; -} - -u8 stopthief_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - [1] [2] [OFF] - [3] [4] [ON] - [5] [6] [T, TIP] - [7] [8] [A, ARREST] - [9] [0] [C, CLUE] -*/ - -static INPUT_PORTS_START( stopthief ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.1") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.2") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void stopthief_state::stopthief(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 425000); // approximation - m_maincpu->k().set(FUNC(stopthief_state::read_k)); - m_maincpu->r().set(FUNC(stopthief_state::write_r)); - m_maincpu->o().set(FUNC(stopthief_state::write_o)); - m_maincpu->power_off().set(FUNC(stopthief_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_stopthief); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[7] = { 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; - m_speaker->set_levels(7, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( stopthief ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( stopthiefp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen - * TMS1400NLL MP7313-N2 (die label MP7313) - * LED grid display, 1-bit sound - - Bank Shot is an electronic pool game. To select a game, repeatedly press - the [SELECT] button, then press [CUE UP] to start. Refer to the official - manual for more information. The game selections are: - 1: Straight Pool (1 player) - 2: Straight Pool (2 players) - 3: Poison Pool - 4: Trick Shots - - BTANB: Some of the other (not cue) balls temporarily flash brighter sometimes, - eg. the bottom one when they're placed. This happens on the real device. - -***************************************************************************/ - -class bankshot_state : public hh_tms1k_state -{ -public: - bankshot_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void bankshot(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bankshot_state::update_display() -{ - m_display->matrix(m_r & ~3, m_o); -} - -void bankshot_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R2,R3: input mux - m_inp_mux = data >> 2 & 3; - - // R2-R10: led select - m_r = data; - update_display(); -} - -void bankshot_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 bankshot_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - (note: remember that you can rotate the display in MAME) - - [SELECT [BALL UP] [BALL OVER] - SCORE] - - ------ led display ------ - - [ANGLE] [AIM] [CUE UP - SHOOT] -*/ - -static INPUT_PORTS_START( bankshot ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up/Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select/Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bankshot_state::bankshot(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF - m_maincpu->k().set(FUNC(bankshot_state::read_k)); - m_maincpu->r().set(FUNC(bankshot_state::write_r)); - m_maincpu->o().set(FUNC(bankshot_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_bri_levels(0.01, 0.08); // cue ball is brigher - config.set_default_layout(layout_bankshot); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bankshot ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Split Second - * TMS1400NLL MP7314-N2 (die label MP7314) - * LED grid display(default round LEDs, and rectangular shape ones), 1-bit sound - - This is an electronic handheld reflex gaming device, it's straightforward - to use. The included mini-games are: - 1, 2, 3: Mad Maze* - 4, 5: Space Attack* - 6: Auto Cross - 7: Stomp - 8: Speedball - - *: higher number indicates higher difficulty - - display layout, where number yx is lamp R(y).O(x) - - 00 02 04 - 10 01 12 03 14 05 16 - 11 13 15 - 20 21 22 23 24 25 26 - 31 33 35 - 30 41 32 43 34 45 36 - 51 53 55 - 40 61 42 63 44 65 46 - 71 73 75 - 50 60 52 62 54 64 56 - 70 72 74 - -***************************************************************************/ - -class splitsec_state : public hh_tms1k_state -{ -public: - splitsec_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void splitsec(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void splitsec_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void splitsec_state::write_r(u16 data) -{ - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R0-R7: led select - m_r = data; - update_display(); -} - -void splitsec_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 splitsec_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( splitsec ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void splitsec_state::splitsec(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF - m_maincpu->k().set(FUNC(splitsec_state::read_k)); - m_maincpu->r().set(FUNC(splitsec_state::write_r)); - m_maincpu->o().set(FUNC(splitsec_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - config.set_default_layout(layout_splitsec); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( splitsec ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Lost Treasure - The Electronic Deep-Sea Diving Game, - Featuring The Electronic Dive-Control Center - * TMS1100 M34038-NLL (die label 1100E, M34038) - * 11 LEDs, 4-bit sound - - This is a board game. The electronic accessory is the emulated part here. - -***************************************************************************/ - -class lostreas_state : public hh_tms1k_state -{ -public: - lostreas_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void lostreas(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void lostreas_state::write_r(u16 data) -{ - // R0-R10: leds - m_display->matrix(1, data); -} - -void lostreas_state::write_o(u16 data) -{ - // O0-O3: input mux - m_inp_mux = data & 0xf; - - // O4: 330 ohm resistor - speaker out - // O5: 220 ohm resistor - speaker out - // O6: 180 ohm resistor - speaker out - // O7: 68 ohm resistor - speaker out - m_speaker->level_w(data >> 4 & 0xf); -} - -u8 lostreas_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - (note: Canadian version differs slightly to accomodoate dual-language) - - [N-S(gold)] [1] [2] [3] [AIR] - [E-W(gold)] [4] [5] [6] [UP] - [N-S(silv)] [7] [8] [9] [$ VALUE] - [E-W(silv)] [CLEAR] -*/ - -static INPUT_PORTS_START( lostreas ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // air/up - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("$ Value") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("E-W (silver)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("N-S (silver)") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("E-W (gold)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("N-S (gold)") - - PORT_START("FAKE") // Air/Up buttons share the same position on the matrix - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Air") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up") -INPUT_PORTS_END - -void lostreas_state::lostreas(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 425000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(lostreas_state::read_k)); - m_maincpu->r().set(FUNC(lostreas_state::write_r)); - m_maincpu->o().set(FUNC(lostreas_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_lostreas); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // set volume levels - static const double speaker_levels[0x10] = - { 1.0/16.0, 1.0/15.0, 1.0/14.0, 1.0/13.0, 1.0/12.0, 1.0/11.0, 1.0/10.0, 1.0/9.0, 1.0/8.0, 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; - m_speaker->set_levels(16, speaker_levels); -} - -// roms - -ROM_START( lostreas ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) ) -ROM_END - - - - - -/*************************************************************************** - - Playskool Alphie - * TMS1000 (label not known yet) - * 5 LEDs, 1-bit sound - - This is an educational toy robot for young kids. It has 2 sliding arms: - the left arm(Alphie's right arm) is for questions, the other for answers. - Cardboard inlays are used for arm position labels. - - There are 4 play modes: - - S symbol: Alphie answers questions. The answers are always the same, - no matter the inlay: Q1=A3, Q2=A5, Q3=A4, Q4=A1, Q5=A2. - - * symbol: used with Lunar Landing board game - - X symbol: used with Robot Land board game - - music note: play a selection of 5 tunes - -***************************************************************************/ - -class alphie_state : public hh_tms1k_state -{ -public: - alphie_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void alphie(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void alphie_state::write_r(u16 data) -{ - // R1-R5, input mux (using d5 for Vss) - m_inp_mux = (data >> 1 & 0x1f) | 0x20; - - // R6-R10: leds - m_display->matrix(1, data >> 6); - - // R0: power off on falling edge (turn back on with button) - if (~data & m_r & 1) - power_off(); - - m_r = data; -} - -void alphie_state::write_o(u16 data) -{ - // O?: speaker out - m_speaker->level_w(data & 1); -} - -u8 alphie_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(6); -} - -// config - -static INPUT_PORTS_START( alphie ) - PORT_START("IN.0") // K1 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - - PORT_START("IN.1") // K2 - PORT_CONFNAME( 0x1f, 0x01, "Question" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x10, "5" ) - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x1f, 0x01, "Answer" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x10, "5" ) - - PORT_START("IN.3") // K8 - PORT_CONFNAME( 0x0f, 0x01, "Activity" ) - PORT_CONFSETTING( 0x01, "Questions" ) - PORT_CONFSETTING( 0x02, "Lunar Landing" ) - PORT_CONFSETTING( 0x04, "Robot Land" ) - PORT_CONFSETTING( 0x08, "Tunes" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<1>, 0x1f) PORT_NAME("Question Arm Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<1>, 0x1f) PORT_NAME("Question Arm Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<2>, 0x1f) PORT_NAME("Answer Arm Up") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<2>, 0x1f) PORT_NAME("Answer Arm Down") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) PORT_NAME("Activity Selector Left") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) PORT_NAME("Activity Selector Right") -INPUT_PORTS_END - -// output PLA is guessed -static const u16 alphie_output_pla[0x20] = -{ - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 -}; - -void alphie_state::alphie(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - m_maincpu->set_output_pla(alphie_output_pla); - m_maincpu->k().set(FUNC(alphie_state::read_k)); - m_maincpu->r().set(FUNC(alphie_state::write_r)); - m_maincpu->o().set(FUNC(alphie_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 5); - config.set_default_layout(layout_alphie); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alphie ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // " -ROM_END - - - - - -/*************************************************************************** - - Tandy Championship Football (model 60-2150) - * PCB label CYG-316 - * TMS1100NLL MP1193 (die label 1100B, MP1193) - * 7-digit 7seg LED display + LED grid, 1-bit sound - - Another clone of Mattel Football II. The original manufacturer is unknown, but - suspected to be Conic/E.R.S.(Electronic Readout Systems). - -***************************************************************************/ - -class tcfball_state : public hh_tms1k_state -{ -public: - tcfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tcfball(machine_config &config); - -protected: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void tcfball_state::update_display() -{ - // R8 enables leds, R9 enables digits - u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780); - u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask; - - m_display->matrix(sel, m_o); -} - -void tcfball_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R5-R7: input mux - m_inp_mux = data >> 5 & 7; - - // R8+R0-R3: select led - // R9+R0-R6: select digit - m_r = data; - update_display(); -} - -void tcfball_state::write_o(u16 data) -{ - // O0-O7: digit segments/led data - m_o = data; - update_display(); -} - -u8 tcfball_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( tcfball ) - PORT_START("IN.0") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.2") // R7 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // college - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void tcfball_state::tcfball(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=56K, C=24pF - m_maincpu->k().set(FUNC(tcfball_state::read_k)); - m_maincpu->r().set(FUNC(tcfball_state::write_r)); - m_maincpu->o().set(FUNC(tcfball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_segmask(0x77, 0x7f); - m_display->set_segmask(0x08, 0xff); // R3 has DP - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_tcfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tcfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) ) - - 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_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy Championship Football (model 60-2151) - * TMS1100NLL MP1183 (no decap) - * 7-digit 7seg LED display + LED grid, 1-bit sound - - The hardware is almost the same as the MP1193 one, they added an extra row of leds. - - known releases: - - World(1): Superbowl XV Football, published by E.R.S.(Electronic Readout Systems) - - World(2): Super-Pro Football, no brand - - USA: Championship Football (model 60-2151), published by Tandy - -***************************************************************************/ - -class tcfballa_state : public tcfball_state -{ -public: - tcfballa_state(const machine_config &mconfig, device_type type, const char *tag) : - tcfball_state(mconfig, type, tag) - { } - - void tcfballa(machine_config &config); -}; - -// handlers: uses the ones in tcfball_state - -// config - -static INPUT_PORTS_START( tcfballa ) - PORT_INCLUDE( tcfball ) - - PORT_MODIFY("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Display") -INPUT_PORTS_END - -void tcfballa_state::tcfballa(machine_config &config) -{ - tcfball(config); - - // basic machine hardware - m_maincpu->set_clock(375000); // approximation - RC osc. R=47K, C=50pF - - config.set_default_layout(layout_tcfballa); -} - -// roms - -ROM_START( tcfballa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_tcfballa_output.bin", 0, 0x20, CRC(887ad9a5) SHA1(a2bac48f555df098c1f1f0fa663e5bcb989b8987) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy Computerized Arcade (model 60-2159 or 60-2159A) - * TMS1100 MCU, label CD7282SL - * 12 lamps behind buttons, 1-bit sound - - known releases: - - World: Tandy-12: Computerized Arcade, published by Tandy - - World: Computerized Arcade, published by Tandy, Radio Shack brand. - This one is model 60-2495 from the mid-90s, perhaps different hardware! - - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as - 9-button version, a clone of Mego Fabulous Fred) - - This handheld contains 12 minigames. It looks and plays like Game Robot 9 by - Takatoku Toys (aka Mego's Fabulous Fred) from 1980, which in turn is a mix of - Merlin and Simon. Unlike Merlin and Simon, spin-offs were not as successful in - the USA. There were releases with and without the prefix "Tandy-12", I don't - know which name was more common. Also not worth noting is that it needed five - batteries; four C-cells and a 9-volt. - - Some of the games require accessories included with the toy (eg. the Baseball - game is played with a board representing the playing field). To start a game, - hold the [SELECT] button, then press [START] when the game button lights up. - As always, refer to the official manual for more information. - - See below at the input defs for a list of the games. - -***************************************************************************/ - -class tandy12_state : public hh_tms1k_state -{ -public: - tandy12_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tandy12(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tandy12_state::update_display() -{ - m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00)); -} - -void tandy12_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R5-R9: input mux - m_inp_mux = data >> 5 & 0x1f; - - // R0-R3: button lamps 9-12 - m_r = data; - update_display(); -} - -void tandy12_state::write_o(u16 data) -{ - // O0-O7: button lamps 1-8 - m_o = data; - update_display(); -} - -u8 tandy12_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - REPEAT-2 SPACE-2 - [O] OFF--ON [O] - - [purple]1 [blue]5 [l-green]9 - ORGAN TAG-IT TREASURE HUNT - - [l-orange]2 [turquoise]6 [red]10 - SONG WRITER ROULETTE COMPETE - - [pink]3 [yellow]7 [violet]11 - REPEAT BASEBALL FIRE AWAY - - [green]4 [orange]8 [brown]12 - TORPEDO REPEAT PLUS HIDE 'N SEEK - - [O] [O] [O] - START SELECT PLAY-2/HIT-7 -*/ - -static INPUT_PORTS_START( tandy12 ) - PORT_START("IN.0") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Button 12") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Button 11") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 9") - - PORT_START("IN.1") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start") - - PORT_START("IN.2") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 1") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 tandy12_output_pla[0x20] = -{ - // these are certain - 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, - 0x80, 0x00, 0x00, 0x00, 0x00, - - // rest is unused? - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -void tandy12_state::tandy12(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->set_output_pla(tandy12_output_pla); - m_maincpu->k().set(FUNC(tandy12_state::read_k)); - m_maincpu->r().set(FUNC(tandy12_state::write_r)); - m_maincpu->o().set(FUNC(tandy12_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 13); - config.set_default_layout(layout_tandy12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tandy12 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Tandy(Radio Shack division) Monkey See (1982 version) - * TMS1000 MP0271 (die label 1000E, MP0271), only half of ROM space used - * 2 LEDs(one red, one green), 1-bit sound - - This is the TMS1000 version, the one from 1977 has a MM5780. - To play, enter an equation followed by the ?-key, and the calculator will - tell you if it was right(green) or wrong(red). For example 1+2=3? - - known releases: - - USA(1): Monkey See, published by Tandy - - USA(2): Heathcliff, published by McNaught Syndicate in 1983 - -***************************************************************************/ - -class monkeysee_state : public hh_tms1k_state -{ -public: - monkeysee_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void monkeysee(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void monkeysee_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R5: speaker out - m_speaker->level_w(data >> 5 & 1); -} - -void monkeysee_state::write_o(u16 data) -{ - // O6,O7: leds - // other: N/C - m_display->matrix(1, data >> 6); -} - -u8 monkeysee_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( monkeysee ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") -INPUT_PORTS_END - -void monkeysee_state::monkeysee(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 250000); // approximation - RC osc. R=68K, C=47pF - m_maincpu->k().set(FUNC(monkeysee_state::read_k)); - m_maincpu->r().set(FUNC(monkeysee_state::write_r)); - m_maincpu->o().set(FUNC(monkeysee_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 2); - config.set_default_layout(layout_monkeysee); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( monkeysee ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy 3 in 1 Sports Arena (model 60-2178) - * PCB label HP-804 - * TMS1100 (just a datestamp label (8331), die label 1100B MP1231) - * 2x2-digit 7seg LED display + 47 other LEDs, 1-bit sound - - For Tandy Sports Arena (model 60-2158), see cmsport, this is a different game. - This version is very similar to ssports4 released a few years earlier. - - 3 overlays were included for the games (Tandy calls them graphic sheets), - MAME external artwork is needed for those. - - It is always in 2-player head-to-head mode, the Player switch is just meant - for allowing the other player to have full control over 2 defense spots. - -***************************************************************************/ - -class t3in1sa_state : public hh_tms1k_state -{ -public: - t3in1sa_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void t3in1sa(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void t3in1sa_state::update_display() -{ - m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); -} - -void t3in1sa_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1,R5,R7-R9: input mux - m_inp_mux = (data & 3) | (data >> 3 & 4) | (data >> 4 & 0x38); - - // R2: led data high - // R3-R7: led select - // R0,R1,R8,R9: digit select - m_r = data; - update_display(); -} - -void t3in1sa_state::write_o(u16 data) -{ - // O0-O7: led data low - m_o = data; - update_display(); -} - -u8 t3in1sa_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* physical button layout and labels are like this: - - ↑ - [ ] [ ] [ ] - TEAM-MATE PASS - ←[ ] [ ]→ shoot - ↗ ↖ - [ ] [ ] [ ] - STATUS ↓ KICK - pass - shoot - -Game and difficulty switches are under the yellow buttons, -player switch is under the red buttons. P1 is yellow, P2 is red. - -*/ - -static INPUT_PORTS_START( t3in1sa ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R5 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // AMATEUR - PORT_CONFSETTING( 0x01, "2" ) // PRO - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0e, 0x08, "Game Select" ) - PORT_CONFSETTING( 0x08, "Football" ) // F - PORT_CONFSETTING( 0x04, "Basketball" ) // B - PORT_CONFSETTING( 0x02, "Soccer" ) // S - - PORT_START("IN.4") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Up-Right / Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Team-Mate") - - PORT_START("IN.5") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Up-Right / Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass / Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Team-Mate") -INPUT_PORTS_END - -void t3in1sa_state::t3in1sa(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(t3in1sa_state::read_k)); - m_maincpu->r().set(FUNC(t3in1sa_state::write_r)); - m_maincpu->o().set(FUNC(t3in1sa_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x303, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_t3in1sa); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( t3in1sa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1231", 0x0000, 0x0800, CRC(1c24e5c2) SHA1(0b6c2edea27eba15e890d82475b91a5e9ef6c4b9) ) - - 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_t3in1sa_output.pla", 0, 365, CRC(de82a294) SHA1(7187666a510919b90798b92b9104ac5d6820d559) ) -ROM_END - - - - - -/*************************************************************************** - - Telesensory Systems, Inc.(TSI) Speech+ - * TMS1000 MCU, label TMS1007NL (die label 1000B, 1007A) - * TSI S14001A speech chip, GI S14007-A 2KB maskrom for samples - * 9-digit 7seg LED display - - This is a speaking calculator for the blind, the instructions that came - with it were on audio cassette. It was also released in 1978 by APH - (American Printing House for the Blind). - -***************************************************************************/ - -class speechp_state : public hh_tms1k_state -{ -public: - speechp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_speech(*this, "speech") - { } - - void speechp(machine_config &config); - -private: - required_device m_speech; - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void speechp_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void speechp_state::write_r(u16 data) -{ - // R5-R9: TSI C0-C5 - m_speech->data_w(data >> 5 & 0x3f); - - // R10: TSI START line - m_speech->start_w(data >> 10 & 1); - - // R0-R9: input mux - m_inp_mux = data & 0x3ff; - - // R0-R8: select digit - m_r = data; - update_display(); -} - -void speechp_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 speechp_state::read_k() -{ - // K: multiplexed inputs - return m_inputs[10]->read() | (read_inputs(10) & 7); -} - -// config - -static INPUT_PORTS_START( speechp ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") // Swap - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") // Clear - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speak") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") // Memory - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.9") // R9 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x00, "Verbose" ) - PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("IN.10") // K8 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Battery Status" ) - PORT_CONFSETTING( 0x08, "Low" ) - PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) -INPUT_PORTS_END - -void speechp_state::speechp(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(speechp_state::read_k)); - m_maincpu->r().set(FUNC(speechp_state::write_r)); - m_maincpu->o().set(FUNC(speechp_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_speechp); - - // sound hardware - SPEAKER(config, "mono").front_center(); - S14001A(config, m_speech, 25000); // approximation - m_speech->add_route(ALL_OUTPUTS, "mono", 0.75); -} - -// roms - -ROM_START( speechp ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) ) - - ROM_REGION( 0x0800, "speech", 0 ) - ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) ) -ROM_END - - - - - -/*************************************************************************** - - TI SR-16 (1974, first consumer product with TMS1000 series MCU) - * TMS1000 MCU label TMS1001NL (die label 1000, 1001A) - * 12-digit 7seg LED display - - TI SR-16 II (1975 version) - * TMS1000 MCU label TMS1016NL (die label 1000B, 1016A) - * notes: cost-reduced 'sequel', [10^x] was removed, and [pi] was added. - -***************************************************************************/ - -class tisr16_state : public hh_tms1k_state -{ -public: - tisr16_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tisr16(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void tisr16_state::update_display() -{ - m_display->matrix(m_r, m_o); - - // exponent sign is from R10 O1, and R10 itself only uses segment G - u8 r10 = m_display->read_row(10); - m_display->write_row(11, r10 << 5 & 0x40); - m_display->write_row(10, r10 & 0x40); -} - -void tisr16_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void tisr16_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 tisr16_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( tisr16 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("10" UTF8_POW_X) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( tisr16ii ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CD") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") -INPUT_PORTS_END - -void tisr16_state::tisr16(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq) - m_maincpu->k().set(FUNC(tisr16_state::read_k)); - m_maincpu->o().set(FUNC(tisr16_state::write_o)); - m_maincpu->r().set(FUNC(tisr16_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 8); - m_display->set_segmask(0xfff, 0xff); - config.set_default_layout(layout_tisr16); - - // no sound! -} - -// roms - -ROM_START( tisr16 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) ) -ROM_END - -ROM_START( tisr16ii ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1250/TI-1200 (1975 version), Spirit of '76 - * TMS0950 MCU label TMC0952NL, K0952 (die label 0950A 0952) - * 9-digit 7seg LED display - - TI-1250/TI-1200 (1976 version), TI-1400, TI-1450, TI-1205, TI-1255, LADY 1200, ABLE - * TMS0970 MCU label TMS0972NL ZA0348, JP0972A (die label 0970D-72A) - * 8-digit 7seg LED display, or 9 digits with leftmost unused - - As seen listed above, the basic 4-function TMS0972 calculator MCU was used - in many calculators. It was licensed to other manufacturers too, one funny - example being a Mattel Barbie handheld calculator. - - Some cheaper models lacked the memory buttons (the function itself still works). - The ABLE series was for educational purposes, with each having a small subset of - available buttons. - - TI-1270 - * TMS0970 MCU label TMC0974NL ZA0355, DP0974A (die label 0970D-74A) - * 8-digit 7seg LED display - * notes: almost same hardware as TMS0972 TI-1250, minor scientific functions - -***************************************************************************/ - -class ti1250_state : public hh_tms1k_state -{ -public: - ti1250_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti1270(machine_config &config); - void ti1250(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti1250_state::write_r(u16 data) -{ - // R0-R8: select digit - m_display->matrix(data, m_o); -} - -void ti1250_state::write_o(u16 data) -{ - // O1-O5,O7: input mux - // O0-O7: digit segments - m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); - m_o = data; -} - -u8 ti1250_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ti1250 ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("CS") // named either CS(Change Sign) or +/- - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("MC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") -INPUT_PORTS_END - -static INPUT_PORTS_START( ti1270 ) - PORT_INCLUDE( ti1250 ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") -INPUT_PORTS_END - -void ti1250_state::ti1250(machine_config &config) -{ - // basic machine hardware - TMS0950(config, m_maincpu, 200000); // approximation - RC osc. R=68K, C=68pf - m_maincpu->k().set(FUNC(ti1250_state::read_k)); - m_maincpu->o().set(FUNC(ti1250_state::write_o)); - m_maincpu->r().set(FUNC(ti1250_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0xff, 0xff); - m_display->set_segmask(0x100, 0x40); // R8 only has segment G connected - config.set_default_layout(layout_ti1250); - - // no sound! -} - -void ti1250_state::ti1270(machine_config &config) -{ - ti1250(config); - - // basic machine hardware - TMS0970(config.replace(), m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti1250_state::read_k)); - m_maincpu->o().set(FUNC(ti1250_state::write_o)); - m_maincpu->r().set(FUNC(ti1250_state::write_r)); - - config.set_default_layout(layout_ti1270); -} - -// roms - -ROM_START( ti1250 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) ) - ROM_REGION( 195, "maincpu:opla", 0 ) - ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - -ROM_START( ti125076 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - -ROM_START( ti1270 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI-2550 III, TI-1650/TI-1600, TI-1265 (they have the same chip) - * TMS1040 MCU label TMS1043NL ZA0352 (die label 1040A, 1043A) - * 9-digit cyan VFD display - - Only the TI-2550 III has the top button row (RV, SQRT, etc). - TI-1600 doesn't have the memory buttons. - -***************************************************************************/ - -class ti25503_state : public hh_tms1k_state -{ -public: - ti25503_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti25503(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti25503_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void ti25503_state::write_r(u16 data) -{ - // R0-R6: input mux - // R0-R8: select digit - m_r = m_inp_mux = data; - update_display(); -} - -void ti25503_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 ti25503_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -static INPUT_PORTS_START( ti25503 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") -INPUT_PORTS_END - -void ti25503_state::ti25503(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti25503_state::read_k)); - m_maincpu->o().set(FUNC(ti25503_state::write_o)); - m_maincpu->r().set(FUNC(ti25503_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_ti25503); - - // no sound! -} - -// roms - -ROM_START( ti25503 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) ) -ROM_END - - - - - -/*************************************************************************** - - TI-5100, more (see below) - * TMS1070 MCU label TMS1073NL or TMC1073NL (die label 1070B, 1073) - * 11-digit 7seg VFD (1 custom digit) - - This chip was also used in 3rd-party calculators, such as Toshiba BC-1015, - Panasonic JE1601U, Radio Shack EC2001, Triumph-Adler D100. The original - TI version did not have the 3 buttons at R4. - -***************************************************************************/ - -class ti5100_state : public hh_tms1k_state -{ -public: - ti5100_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti5100(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti5100_state::update_display() -{ - // extra segment on R10 - m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o); -} - -void ti5100_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void ti5100_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 ti5100_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( ti5100 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "K" ) // constant mode - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "DP" ) // display point - PORT_CONFSETTING( 0x00, "F" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // clear all? - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("EX") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("GPM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(UTF8_CAPITAL_DELTA"%") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R8 0x01 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R9 0x02 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("RM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) -INPUT_PORTS_END - -void ti5100_state::ti5100(machine_config &config) -{ - // basic machine hardware - TMS1070(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti5100_state::read_k)); - m_maincpu->o().set(FUNC(ti5100_state::write_o)); - m_maincpu->r().set(FUNC(ti5100_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 9); - m_display->set_segmask(0x7ff, 0xff); - config.set_default_layout(layout_ti5100); - - // no sound! -} - -// roms - -ROM_START( ti5100 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1073nl", 0x0000, 0x0400, CRC(94185933) SHA1(d2d9432f857b8530ac399f5097c6d412f06d8814) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti5100_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ti5100_output.pla", 0, 365, CRC(11f6f0f4) SHA1(f25cf6bd284ab4614746b2e3f98d42d2585e425a) ) -ROM_END - - - - - -/*************************************************************************** - - TMC098x series Majestic-line calculators - - TI-30, SR-40, TI-15(less buttons) and several by Koh-I-Noor - * TMS0980 MCU label TMC0981NL (die label 0980B-81F) - * 9-digit 7seg LED display - - Of note is a peripheral by Schoenherr, called the Braillotron. It acts as - a docking station to the TI-30, with an additional display made of magnetic - refreshable Braille cells. The TI-30 itself is slightly modified to wire - the original LED display to a 25-pin D-Sub connector. - - TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 - * TMS0980 MCU label TMC0982NL (die label 0980B-82F) - - TI Programmer - * TMS0980 MCU label ZA0675NL, JP0983AT (die label 0980B-83) - -***************************************************************************/ - -class ti30_state : public hh_tms1k_state -{ -public: - ti30_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti30(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti30_state::write_r(u16 data) -{ - // R0-R8: select digit - m_display->matrix(data, m_o); -} - -void ti30_state::write_o(u16 data) -{ - // O0-O2,O4-O7: input mux - // O0-O7: digit segments - m_inp_mux = (data & 7) | (data >> 1 & 0x78); - m_o = bitswap<8>(data,7,5,2,1,4,0,6,3); -} - -u8 ti30_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[7]->read() | read_inputs(7); -} - -// config - -static INPUT_PORTS_START( ti30 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE" UTF8_DOWN) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("DRG") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("INV") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("cos") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("sin") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("tan") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -static INPUT_PORTS_START( tiprog ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -static INPUT_PORTS_START( tibusan ) - // PORT_NAME lists functions under [2nd] as secondaries. - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X" " UTF8_POW_X"" UTF8_SQUAREROOT"y") // 2nd one implies xth root of y - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% " UTF8_CAPITAL_DELTA"%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("CST") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("MAR") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO m") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL b") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA"+ " UTF8_CAPITAL_SIGMA"-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("( AN-CI\"") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("x<>y L.R.") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(") 1/x") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("SUM x" UTF8_PRIME) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("FV") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("PMT") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("%i") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("PV") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC x" UTF8_PRIME) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void ti30_state::ti30(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 400000); // guessed - m_maincpu->k().set(FUNC(ti30_state::read_k)); - m_maincpu->o().set(FUNC(ti30_state::write_o)); - m_maincpu->r().set(FUNC(ti30_state::write_r)); - m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1fe, 0xff); - m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP - config.set_default_layout(layout_ti30); - - // no sound! -} - -// roms - -ROM_START( ti30 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( tibusan ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( tiprog ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_tiprog_micro.pla", 0, 1982, CRC(57043284) SHA1(0fa06d5865830ecdb3d870271cb92ac917bed3ca) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_tiprog_output.pla", 0, 352, BAD_DUMP CRC(125c4ee6) SHA1(b8d865c42fd37c3d9b92c5edbecfc831be558597) ) // corrected by hand - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1000 (1977 version) - * TMS1990 MCU label TMC1991NL (die label 1991-91A) - * 8-digit 7seg LED display - - TI-1000 (1978 version) - * TMS1990 MCU label TMC1992-4NL **not dumped yet - -***************************************************************************/ - -class ti1000_state : public hh_tms1k_state -{ -public: - ti1000_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti1000(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti1000_state::write_r(u16 data) -{ - // R0-R7: select digit - m_display->matrix(data, m_o); -} - -void ti1000_state::write_o(u16 data) -{ - // O0-O3,O5(?): input mux - // O0-O7: digit segments - m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); - m_o = bitswap<8>(data,7,4,3,2,1,0,6,5); -} - -u8 ti1000_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( ti1000 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.3") // O3 or O4? - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void ti1000_state::ti1000(machine_config &config) -{ - // basic machine hardware - TMS1990(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti1000_state::read_k)); - m_maincpu->o().set(FUNC(ti1000_state::write_o)); - m_maincpu->r().set(FUNC(ti1000_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_ti1270); - - // no sound! -} - -// roms - -ROM_START( ti1000 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) -ROM_END - - - - - -/*************************************************************************** - - TI WIZ-A-TRON - * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label 0970F-07B) - * 9-digit 7seg LED display(one custom digit) - -***************************************************************************/ - -class wizatron_state : public hh_tms1k_state -{ -public: - wizatron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void wizatron(machine_config &config); - -protected: - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void wizatron_state::write_r(u16 data) -{ - // R0-R8: select digit - - // 3rd digit only has A and G for =, though some newer hardware revisions - // (goes for both wizatron and lilprof) use a custom equals-sign digit here - - // 6th digit is custom(not 7seg), for math symbols, like this: - // \./ GAB - // --- F - // /.\ EDC - m_display->matrix(data, m_o); -} - -void wizatron_state::write_o(u16 data) -{ - // O1-O4: input mux - // O0-O6: digit segments A-G - // O7: N/C - m_inp_mux = data >> 1 & 0xf; - m_o = data & 0x7f; -} - -u8 wizatron_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( wizatron ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) -INPUT_PORTS_END - -void wizatron_state::wizatron(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(wizatron_state::read_k)); - m_maincpu->o().set(FUNC(wizatron_state::write_o)); - m_maincpu->r().set(FUNC(wizatron_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1ff^8, 0x7f); - m_display->set_segmask(8, 0x41); // equals sign - config.set_default_layout(layout_wizatron); - - // no sound! -} - -// roms - -ROM_START( wizatron ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI Little Professor (1976 version) - * TMS0970 MCU label TMS0975NL ZA0356, GP0975CS (die label 0970D-75C) - * 9-digit 7seg LED display(one custom digit) - - The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this - one is older). - -***************************************************************************/ - -class lilprof_state : public wizatron_state -{ -public: - lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : - wizatron_state(mconfig, type, tag) - { } - - void lilprof(machine_config &config); - -private: - virtual void write_o(u16 data) override; - virtual u8 read_k() override; -}; - -// handlers - -void lilprof_state::write_o(u16 data) -{ - // O1-O4,O7: input mux - // O0-O6: digit segments A-G - m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); - m_o = data; -} - -u8 lilprof_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( lilprof ) - PORT_INCLUDE( wizatron ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.4") // O7 - PORT_CONFNAME( 0x0f, 0x01, "Level") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) -INPUT_PORTS_END - -void lilprof_state::lilprof(machine_config &config) -{ - wizatron(config); - - // basic machine hardware - m_maincpu->k().set(FUNC(lilprof_state::read_k)); - m_maincpu->o().set(FUNC(lilprof_state::write_o)); -} - -// roms - -ROM_START( lilprof ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI Little Professor (1978 version) - * TMS1990 MCU label TMC1993NL (die label 1990C-c3C) - * 9-digit 7seg LED display(one custom digit) - - 1978 re-release, with on/off and level select on buttons instead of - switches. The casing was slightly revised in 1980 again, but same rom. - -***************************************************************************/ - -class lilprof78_state : public hh_tms1k_state -{ -public: - lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void lilprof78(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void lilprof78_state::write_r(u16 data) -{ - // update leds state - u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; - u16 r = (data & 7) | (data << 1 & 0x1f0); - m_display->matrix(r, seg); - - // 3rd digit A/G(equals sign) is from O7 - m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); - - // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) - m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); -} - -void lilprof78_state::write_o(u16 data) -{ - // O0-O3,O5(?): input mux - // O0-O6: digit segments A-G - // O7: 6th digit - m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); - m_o = data; -} - -u8 lilprof78_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( lilprof78 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.3") // O3 or O4? - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void lilprof78_state::lilprof78(machine_config &config) -{ - // basic machine hardware - TMS1990(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(lilprof78_state::read_k)); - m_maincpu->o().set(FUNC(lilprof78_state::write_o)); - m_maincpu->r().set(FUNC(lilprof78_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_wizatron); - - // no sound! -} - -// roms - -ROM_START( lilprof78 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1680, TI-2550-IV - * TMS1980 MCU label TMC1981NL (die label 1980A 81F) - * TMC0999NL 256x4 RAM (die label 0999B) - * 9-digit cyan VFD display(leftmost digit is custom) - - The extra RAM is for scrolling back through calculations. For some reason, - TI-2550-IV has the same hardware, this makes it very different from II and III. - -***************************************************************************/ - -class ti1680_state : public hh_tms1k_state -{ -public: - ti1680_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_ram(*this, "ram") - { } - - void ti1680(machine_config &config); - -private: - required_device m_ram; - - virtual void update_display(); - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ti1680_state::update_display() -{ - // note the extra segments on R9 and R3 - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80) | (m_r << 5 & 0x100)); -} - -void ti1680_state::write_r(u16 data) -{ - // R8,R0,R5,R6: TMC0999 data inputs - // R2,R4+R1/R7: TMC0999 control pins - m_ram->di_w(bitswap<4>(data,8,0,5,6)); - m_ram->adr_w(BIT(data, 2)); - m_ram->wr_w(BIT(data, 4) & BIT(data, 7)); - m_ram->rd_w(BIT(data, 4) & BIT(data, 1)); - - // R3-R8: input mux - m_inp_mux = data >> 3 & 0x3f; - - // R0-R8: select digit - // R9: digit DP segment - m_r = data; - update_display(); -} - -void ti1680_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; - update_display(); -} - -u8 ti1680_state::read_k() -{ - // K: multiplexed inputs, RAM data - return read_inputs(6) | m_ram->do_r(); -} - -// config - -static INPUT_PORTS_START( ti1680 ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("BST") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("RPL") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.5") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void ti1680_state::ti1680(machine_config &config) -{ - // basic machine hardware - TMS1980(config, m_maincpu, 300000); // approximation - m_maincpu->k().set(FUNC(ti1680_state::read_k)); - m_maincpu->o().set(FUNC(ti1680_state::write_o)); - m_maincpu->r().set(FUNC(ti1680_state::write_r)); - m_maincpu->power_off().set(FUNC(ti1680_state::auto_power_off)); - - TMC0999(config, m_ram); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1fe, 0xff); - config.set_default_layout(layout_ti1680); - - // no sound! -} - -// roms - -ROM_START( ti1680 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1981nl", 0x0000, 0x1000, CRC(8467c5a1) SHA1(d3a48f6c9dd41e2dc0e0cfafa84dac8d21aacaa3) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_ti1680_output.pla", 0, 525, CRC(188af340) SHA1(eaf707266dde0d708870ef5d8f985ce88d35b43e) ) -ROM_END - - - - - -/*************************************************************************** - - TI DataMan - * TMS1980 MCU label TMC1982NL (die label 1980A 82B) - * 10-digit cyan VFD display(3 digits are custom) - -***************************************************************************/ - -class dataman_state : public hh_tms1k_state -{ -public: - dataman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void dataman(machine_config &config); - -protected: - virtual void update_display(); - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void dataman_state::update_display() -{ - // note the extra segment on R9 - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80)); -} - -void dataman_state::write_r(u16 data) -{ - // R0-R4: input mux - // R0-R8: select digit - // R9: =(equals sign) segment - m_r = m_inp_mux = data; - update_display(); -} - -void dataman_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; - update_display(); -} - -u8 dataman_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[5]->read() | read_inputs(5); -} - -// config - -static INPUT_PORTS_START( dataman ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Memory Bank") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Go") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Force Out") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Number Guesser") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wipe Out") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.5") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Electro Flash") -INPUT_PORTS_END - -void dataman_state::dataman(machine_config &config) -{ - // basic machine hardware - TMS1980(config, m_maincpu, 300000); // patent says 300kHz - m_maincpu->k().set(FUNC(dataman_state::read_k)); - m_maincpu->o().set(FUNC(dataman_state::write_o)); - m_maincpu->r().set(FUNC(dataman_state::write_r)); - m_maincpu->power_off().set(FUNC(dataman_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_dataman); - - // no sound! -} - -// roms - -ROM_START( dataman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) -ROM_END - - - - - -/*************************************************************************** - - TI Math Marvel - * TMS1980 MCU label TMC1986A-NL (die label 1980A 86A) - * 9-digit cyan VFD display(2 digits are custom), 1-bit sound - - This is the same hardware as DataMan, with R8 connected to a piezo. - -***************************************************************************/ - -class mathmarv_state : public dataman_state -{ -public: - mathmarv_state(const machine_config &mconfig, device_type type, const char *tag) : - dataman_state(mconfig, type, tag) - { } - - void mathmarv(machine_config &config); - -private: - virtual void write_r(u16 data) override; -}; - -// handlers - -void mathmarv_state::write_r(u16 data) -{ - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // rest is same as dataman - dataman_state::write_r(data); -} - -// config - -static INPUT_PORTS_START( mathmarv ) - PORT_INCLUDE( dataman ) - - PORT_MODIFY("IN.4") // R4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Quest") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Checker") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Review") - - PORT_MODIFY("IN.5") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Zap") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Flash") -INPUT_PORTS_END - -void mathmarv_state::mathmarv(machine_config &config) -{ - dataman(config); - - // basic machine hardware - m_maincpu->r().set(FUNC(mathmarv_state::write_r)); - - config.set_default_layout(layout_mathmarv); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mathmarv ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) -ROM_END - - - - - -/*************************************************************************** - - Texas Instruments maze game (unreleased, from patent GB2040172A) - * TMS1000 (development version) - * 1 7seg LED digit, no sound - - The title of this game is unknown, the patent describes it simply as a maze game. - Several electronic maze game concepts are listed in the patent. The PCB schematic - and program source code is included for one of them: A predefined 12*8 maze, - walls close to the player are displayed on a 7seg digit. - - In the end Texas Instruments didn't release any electronic maze game. This version - is too simple and obviously unfinished, start and goal positions are always the same - and there is a lot of ROM space left for more levels. - -***************************************************************************/ - -class timaze_state : public hh_tms1k_state -{ -public: - timaze_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void timaze(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void timaze_state::write_r(u16 data) -{ - // R0: input mux - m_inp_mux = data & 1; -} - -void timaze_state::write_o(u16 data) -{ - // O3210: 7seg EGCD? - m_display->matrix(1, bitswap<8>(data, 7,1,6,0,3,2,5,4)); -} - -u8 timaze_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( timaze ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY -INPUT_PORTS_END - -void timaze_state::timaze(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=80K, C=27pF - m_maincpu->k().set(FUNC(timaze_state::read_k)); - m_maincpu->r().set(FUNC(timaze_state::write_r)); - m_maincpu->o().set(FUNC(timaze_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 8); - m_display->set_segmask(1, 0x5c); - config.set_default_layout(layout_timaze); - - // no sound! -} - -// roms - -ROM_START( timaze ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order -ROM_END - - - - - -/*************************************************************************** - - Texas Instruments Electronic Digital Thermostat - * TMS0970 MCU, label TMS0970NLL TMC0910B (die label 0970F-10E) - * 9-digit 7seg LED display, only 4 used - * temperature sensor, heat/cool/fan outputs - - This is a thermostat and digital clock. It's the 2nd one described in - patents US4388692 and US4298946. - -***************************************************************************/ - -class tithermos_state : public hh_tms1k_state -{ -public: - tithermos_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_60hz(*this, "ac_line") - { } - - void tithermos(machine_config &config); - -private: - required_device m_60hz; - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tithermos_state::write_r(u16 data) -{ - // D1-D4: select digit - m_display->matrix(data, m_o); - - // D6: heat/cool - // D8: A/D reset - m_r = data; -} - -void tithermos_state::write_o(u16 data) -{ - // SA-SP: input mux - // SA-SG: digit segments - m_o = m_inp_mux = data; -} - -u8 tithermos_state::read_k() -{ - // K: multiplexed inputs - u8 data = read_inputs(8); - - // when SB/SD/SP is high: - if (m_inp_mux & 0x8a) - { - // K1: 60hz from AC line - // K2: battery low? - // K8: A/D output (TODO) - data |= (m_60hz->signal_r()) ? 1 : 0; - } - - return data; -} - -// config - -static INPUT_PORTS_START( tithermos ) - PORT_START("IN.0") // SA - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Temp Row PM 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Time Row PM 2") - - PORT_START("IN.1") // SB - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // SC - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Temp Row PM 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Time Row PM 1") - - PORT_START("IN.3") // SD - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line - PORT_CONFNAME( 0x06, 0x04, "System") - PORT_CONFSETTING( 0x04, "Heat" ) - PORT_CONFSETTING( 0x00, "Off" ) - PORT_CONFSETTING( 0x02, "Cool" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output - - PORT_START("IN.4") // SE - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Temp Row AM 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Time Row AM 2") - - PORT_START("IN.5") // SF - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Temp Row AM 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Time Row AM 1") - - PORT_START("IN.6") // SG - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Temp / Actual") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Time / Clock") - - PORT_START("IN.7") // SP - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line - PORT_CONFNAME( 0x06, 0x04, "Mode") - PORT_CONFSETTING( 0x04, "Constant" ) - PORT_CONFSETTING( 0x00, "Day/Night" ) - PORT_CONFSETTING( 0x02, "Night" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output - - PORT_START("IN.8") - PORT_CONFNAME( 0x01, 0x00, "Fan") - PORT_CONFSETTING( 0x00, "On" ) - PORT_CONFSETTING( 0x01, "Auto" ) // same output as heat/cool -INPUT_PORTS_END - -void tithermos_state::tithermos(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(tithermos_state::read_k)); - m_maincpu->r().set(FUNC(tithermos_state::write_r)); - m_maincpu->o().set(FUNC(tithermos_state::write_o)); - - CLOCK(config, "ac_line", 60); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_tithermos); - - // no sound! -} - -// roms - -ROM_START( tithermos ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0910b", 0x0000, 0x0400, CRC(232011cf) SHA1(598ae8cecd98226fb5056c99ce9f47fd23785fd7) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_tithermos_micro.pla", 0, 860, CRC(a3bb8ca5) SHA1(006ea733440001c37a77d4ffbc4bd2a8fee212ac) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_tithermos_output.pla", 0, 352, CRC(eb3598fd) SHA1(2372ae17fb982cae2710bf8c348bf02b767daabd) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sub Wars (model 7-490) - * PCB label CSG201A(main), CSG201B(leds) - * TMS1200N2LL MP3352 (die label 1000C, MP3352) - * 4-digit 7seg LED display + 55 other LEDs, 1-bit sound - - Tiger/Yeno also published an LCD handheld called Sub Wars, it's not related. - - This handheld was modified and used as a prop in the 1981 movie Escape from - New York, Snake Plissken uses it as a homing device. - -***************************************************************************/ - -class subwars_state : public hh_tms1k_state -{ -public: - subwars_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void subwars(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void subwars_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void subwars_state::write_r(u16 data) -{ - // R0-R3: digit select - // R4-R12: led select - m_r = data; - update_display(); -} - -void subwars_state::write_o(u16 data) -{ - // O0-O6: led data - m_o = data; - update_display(); - - // O7: speaker out - m_speaker->level_w(BIT(data, 7)); -} - -// config - -static INPUT_PORTS_START( subwars ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void subwars_state::subwars(machine_config &config) -{ - // basic machine hardware - TMS1200(config, m_maincpu, 550000); // approximation - RC osc. R=24K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(subwars_state::write_r)); - m_maincpu->o().set(FUNC(subwars_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(13, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_subwars); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( subwars ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3352", 0x0000, 0x0400, CRC(5dece1e4) SHA1(65ef77b063c94ff4b6c83dace54ea2f75bd3d6a9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_subwars_output.pla", 0, 365, CRC(372b9bbc) SHA1(06a875e114b7757c6f4f1727416d1739ebe60931) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A) - * TMS1100 MP1215 (die label 1100B MP1215) - * 2-digit 7seg LED display + 40 other LEDs, 1-bit sound - - The games are on playcards(Tiger calls them that), the hardware detects which - game is inserted from a notch at the lower-right. The playcards also function - as an overlay. MAME external artwork is needed for those. - - Booting the handheld with no playcard inserted will initiate a halftime show. - - "Playmaker" is actually Tiger's trademark for the d-pad controller, this - controller term was also used in for example Deluxe Football, and 7 in 1 Sports - Stadium. The d-pad has a ball shape at the bottom that sits on a concave base. - It is patented under US4256931 (mid-1979, a couple of years before Nintendo's - Game & Watch d-pad with US4687200). - -***************************************************************************/ - -class playmaker_state : public hh_tms1k_state -{ -public: - playmaker_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void playmaker(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u8 m_notch = 0; // cartridge K1/K2 - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void playmaker_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_notch)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(playmaker_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge notch - const char *notch = image.get_feature("notch"); - m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0; - - return image_init_result::PASS; -} - -void playmaker_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void playmaker_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R3: input mux - m_inp_mux = data & 0xf; - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void playmaker_state::write_o(u16 data) -{ - // O0-O6: led data - m_o = data; - update_display(); -} - -u8 playmaker_state::read_k() -{ - // K: multiplexed inputs, cartridge notch from R3 - return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0); -} - -// config - -static INPUT_PORTS_START( playmaker ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot / P1 Skill") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill") -INPUT_PORTS_END - -void playmaker_state::playmaker(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=20K, C=250pF - m_maincpu->k().set(FUNC(playmaker_state::read_k)); - m_maincpu->r().set(FUNC(playmaker_state::write_r)); - m_maincpu->o().set(FUNC(playmaker_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x300, 0x7f); - m_display->set_bri_levels(0.004, 0.04); // player 1 leds are brighter - config.set_default_layout(layout_playmaker); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "playmaker_cart")); - cartslot.set_must_be_loaded(false); - cartslot.set_device_load(FUNC(playmaker_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("playmaker"); -} - -// roms - -ROM_START( playmaker ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1215", 0x0000, 0x0800, CRC(bfc7b6c8) SHA1(33f6e2b86fae2fd9e4b0a4b8dc842c257ca3047d) ) - - 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_playmaker_output.pla", 0, 365, CRC(0cd484d6) SHA1(4a9af9f3d18af504145690cb0f6444ff1aef26ca) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Deluxe Football with Instant Replay (model 7-550) - * TMS1400NLL MP7302 (die label TMS1400 MP7302) - * 4-digit 7seg LED display, 80 red/green LEDs, 1-bit sound - - According to the manual, player 1 is green, player 2 is red. But when - playing a 1-player game, the CPU controls green, so on MAME, player 1 - is the red side. - - Booting the handheld with the Score and Replay buttons held down will - initiate a halftime show. - -***************************************************************************/ - -class dxfootb_state : public hh_tms1k_state -{ -public: - dxfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void dxfootb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void dxfootb_state::update_display() -{ - // 2 led groups (double multiplexed) - u16 g1 = (m_r & 0x100) ? 0x7f : 0; - u16 g2 = (m_r & 0x80) ? 0x7f << 7 : 0; - m_display->matrix((m_r & g1) | (m_r << 7 & g2), m_o); -} - -void dxfootb_state::write_r(u16 data) -{ - // R9,R10: speaker out - m_speaker->level_w(data >> 9 & 3); - - // R3-R6: input mux - m_inp_mux = data >> 3 & 0xf; - - // R0-R6: led select - // R7,R8: group select - m_r = data; - update_display(); -} - -void dxfootb_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 dxfootb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( dxfootb ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Replay / Skill (Green)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score / Skill (Red)") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) -INPUT_PORTS_END - -void dxfootb_state::dxfootb(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(dxfootb_state::read_k)); - m_maincpu->r().set(FUNC(dxfootb_state::write_r)); - m_maincpu->o().set(FUNC(dxfootb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7+7, 8); - m_display->set_segmask(0x3c00, 0x7f); - config.set_default_layout(layout_dxfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( dxfootb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7302", 0x0000, 0x1000, CRC(a8077062) SHA1(c1318fe5c8f2db021d7d1264fc70158944045fa3) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_dxfootb_output.pla", 0, 557, CRC(a1b3d2c0) SHA1(8030e6dcd3878b58668c98cff36d93b764e1d67f) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Copy Cat (model 7-520) - * PCB label CC REV B - * TMS1000 MCU, label 69-11513 MP0919 (die label MP0919) - * 4 LEDs, 1-bit sound - - known releases: - - World: Copy Cat, published by Tiger - - USA(1): Follow Me, published by Sears - - USA(2): Electronic Repeat, published by Tandy - -***************************************************************************/ - -class copycat_state : public hh_tms1k_state -{ -public: - copycat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void copycat(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void copycat_state::write_r(u16 data) -{ - // R0-R3: leds - m_display->matrix(1, data & 0xf); - - // R4-R7: input mux - // R8-R10: N/C - m_inp_mux = data >> 4 & 0xf; -} - -void copycat_state::write_o(u16 data) -{ - // O0,O1: speaker out - // O2,O7: N/C, O3-O6: tied together but unused - m_speaker->level_w(data & 3); -} - -u8 copycat_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( copycat ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - - PORT_START("IN.1") // R5 - PORT_CONFNAME( 0x0f, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - - PORT_START("IN.2") // R6 - PORT_CONFNAME( 0x07, 0x01, "Game Select") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Best Play") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Play") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Replay") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void copycat_state::copycat(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 320000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(copycat_state::read_k)); - m_maincpu->r().set(FUNC(copycat_state::write_r)); - m_maincpu->o().set(FUNC(copycat_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_copycat); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( copycat ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Copy Cat (model 7-522) - * PCB label WS 8107-1 - * TMS1730 MCU, label MP3005N (die label 1700 MP3005) - * 4 LEDs, 1-bit sound - - This is a simplified rerelease of Copy Cat, 10(!) years later. The gameplay - is identical to Ditto. - - 3 variations exist, each with a different colored case. Let's assume that - they're on the same hardware. - - white case, yellow orange green red buttons and leds (same as model 7-520) - - yellow case, purple orange blue pink buttons, leds are same as older version - - transparent case, transparent purple orange blue red buttons, leds same as before - -***************************************************************************/ - -class copycatm2_state : public hh_tms1k_state -{ -public: - copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void copycatm2(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void copycatm2_state::write_r(u16 data) -{ - // R1-R4: leds - m_display->matrix(1, data >> 1 & 0xf); -} - -void copycatm2_state::write_o(u16 data) -{ - // O0,O6: speaker out - m_speaker->level_w((data & 1) | (data >> 5 & 2)); -} - -// config - -static INPUT_PORTS_START( copycatm2 ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") -INPUT_PORTS_END - -void copycatm2_state::copycatm2(machine_config &config) -{ - // basic machine hardware - TMS1730(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(copycatm2_state::write_r)); - m_maincpu->o().set(FUNC(copycatm2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_copycatm2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( copycatm2 ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Ditto (model 7-530) - * TMS1700 MCU, label MP1801-N2LL (die label 1700 MP1801) - * 4 LEDs, 1-bit sound - - known releases: - - World: Ditto, published by Tiger - - USA: Electronic Pocket Repeat (model 60-2152/60-2468A), published by Tandy - note: 1996 model 60-2482 MCU is a Z8, and is assumed to be a clone of Tiger Copycat Jr. - -***************************************************************************/ - -class ditto_state : public hh_tms1k_state -{ -public: - ditto_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ditto(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void ditto_state::write_r(u16 data) -{ - // R0-R3: leds - m_display->matrix(1, data & 0xf); -} - -void ditto_state::write_o(u16 data) -{ - // O5,O6: speaker out - m_speaker->level_w(data >> 5 & 3); -} - -// config - -static INPUT_PORTS_START( ditto ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Orange Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Red Button") -INPUT_PORTS_END - -void ditto_state::ditto(machine_config &config) -{ - // basic machine hardware - TMS1700(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(ditto_state::write_r)); - m_maincpu->o().set(FUNC(ditto_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ditto); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ditto ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger 7 in 1 Sports Stadium (model 7-555) - * TMS1400 MP7304 (die label TMS1400 MP7304A) - * 2x2-digit 7seg LED display + 39 other LEDs, 1-bit sound - - This handheld includes 7 games: 1: Basketball, 2: Hockey, 3: Soccer, - 4: Maze, 5: Baseball, 6: Football, 7: Raquetball. - MAME external artwork is needed for the switchable overlays. - - known releases: - - World: 7 in 1 Sports Stadium, published by Tiger - - USA: 7 in 1 Sports, published by Sears - -***************************************************************************/ - -class t7in1ss_state : public hh_tms1k_state -{ -public: - t7in1ss_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void t7in1ss(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void t7in1ss_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void t7in1ss_state::write_r(u16 data) -{ - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0-R2,R10: input mux - m_inp_mux = (data & 7) | (data >> 7 & 8); - - // R0-R3: digit select - // R4-R8: led select - m_r = data; - update_display(); -} - -void t7in1ss_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 t7in1ss_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( t7in1ss ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // R10 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void t7in1ss_state::t7in1ss(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(t7in1ss_state::read_k)); - m_maincpu->r().set(FUNC(t7in1ss_state::write_r)); - m_maincpu->o().set(FUNC(t7in1ss_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0xf, 0x7f); - m_display->set_bri_levels(0.004, 0.04); // player led is brighter - config.set_default_layout(layout_t7in1ss); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( t7in1ss ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_t7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronics) Break Up (manufactured in Japan) - * PCB label TOMY B.O. - * TMS1040 MP2726 TOMY WIPE (die label MP2726A) - * TMS1025N2LL I/O expander - * 2-digit 7seg display, 46 other leds, 1-bit sound - - known releases: - - USA: Break Up, published by Tomy - - Japan: Block Attack, published by Tomy - - UK: Break-In, published by Tomy - - led translation table: led zz from game PCB = MAME y.x: - - 00 = - 10 = 5.0 20 = 4.2 - 01 = 7.0 11 = 5.1 21 = 3.3 - 02 = 7.1 12 = 5.2 22 = 2.2 - 03 = 7.2 13 = 5.3 - 04 = 7.3 14 = 4.3 - 05 = 6.0 15 = 3.1 - 06 = 6.1 16 = 3.2 - 07 = 6.2 17 = 3.0 - 08 = 6.3 18 = 4.1 - 09 = 4.0 19 = 2.1 - - the 7seg panel is 0.* and 1.*(aka digit0/1), - and the 8(2*4) * 3 rectangular leds panel, where x=0,1,2,3: - - 9.* 11.* - 8.* 13.* - 10.* 12.* - -***************************************************************************/ - -class tbreakup_state : public hh_tms1k_state -{ -public: - tbreakup_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_expander(*this, "expander") - { } - - void tbreakup(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - virtual void machine_start() override; - -private: - required_device m_expander; - u8 m_exp_port[7] = { }; - void expander_w(offs_t offset, u8 data); - - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void tbreakup_state::machine_start() -{ - hh_tms1k_state::machine_start(); - save_item(NAME(m_exp_port)); -} - -void tbreakup_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void tbreakup_state::set_clock() -{ - // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K - m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 500000 : 325000); -} - -void tbreakup_state::update_display() -{ - // 7seg leds from R0,R1 and O0-O6 - m_display->matrix_partial(0, 2, m_r, m_o & 0x7f); - - // 22 round leds from O2-O7 and expander port 7 - m_display->matrix_partial(2, 6, m_o >> 2, m_exp_port[6]); - - // 24 rectangular leds from expander ports 1-6 (not strobed) - for (int y = 0; y < 6; y++) - m_display->write_row(y+8, m_exp_port[y]); -} - -void tbreakup_state::expander_w(offs_t offset, u8 data) -{ - // TMS1025 port 1-7 data - m_exp_port[offset] = data; -} - -void tbreakup_state::write_r(u16 data) -{ - // R6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // R7,R8: input mux - m_inp_mux = data >> 7 & 3; - - // R3-R5: TMS1025 port S - // R2: TMS1025 STD pin - m_expander->write_s(data >> 3 & 7); - m_expander->write_std(data >> 2 & 1); - - // R0,R1: select digit - m_r = ~data; - update_display(); -} - -void tbreakup_state::write_o(u16 data) -{ - // O0-O3: TMS1025 port H - m_expander->write_h(data & 0xf); - - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 tbreakup_state::read_k() -{ - // K4: fixed input - // K8: multiplexed inputs - return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8); -} - -// config - -static INPUT_PORTS_START( tbreakup ) - PORT_START("IN.0") // R7 K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Ball") - - PORT_START("IN.1") // R8 K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Lives ) ) - PORT_CONFSETTING( 0x00, "3" ) - PORT_CONFSETTING( 0x04, "5" ) - - PORT_START("IN.3") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tbreakup_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "Pro 1" ) - PORT_CONFSETTING( 0x01, "Pro 2" ) -INPUT_PORTS_END - -void tbreakup_state::tbreakup(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 325000); // see set_clock - m_maincpu->k().set(FUNC(tbreakup_state::read_k)); - m_maincpu->r().set(FUNC(tbreakup_state::write_r)); - m_maincpu->o().set(FUNC(tbreakup_state::write_o)); - - TMS1025(config, m_expander).set_ms(1); // MS tied high - m_expander->write_port1_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port2_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port3_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port4_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port5_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port6_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port7_callback().set(FUNC(tbreakup_state::expander_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2+6+6, 8); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_tbreakup); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tbreakup ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Power House Pinball - * PCB label TOMY P-B - * TMS1100 MP1180 TOMY PINB (die label MP1180) - * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - known releases: - - USA: Power House Pinball, published by Tomy - - Japan: Pinball, published by Tomy - - Europe: Flipper, published by Tomy - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 5.0 20 = 6.4 A = 3.0 - 1 = 3.3 11 = 5.5 21 = 6.5 B = 3.4 - 2 = 3.1 12 = 5.1 22 = 7.0 C = 3.5 - 3 = 3.2 13 = 5.2 23 = 7.1 D = 8.0 - 4 = 4.0 14 = 5.3 24 = 7.2 E = 8.1 - 5 = 4.1 15 = 6.0 25 = 7.3 F = 8.2 - 6 = 4.2 16 = 5.4 26 = 7.4 G = 8.3 - 7 = 4.3 17 = 6.1 - 8 = 4.4 18 = 6.2 - 9 = 4.5 19 = 6.3 - - NOTE!: MAME external artwork is required - -***************************************************************************/ - -class phpball_state : public hh_tms1k_state -{ -public: - phpball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void phpball(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(flipper_button) { update_display(); } - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void phpball_state::update_display() -{ - // rectangular LEDs under LEDs D,F and E,G are directly connected - // to the left and right flipper buttons - output them to 10.a and 9.a - u16 in1 = m_inputs[1]->read() << 7 & 0x600; - m_display->matrix((m_r & 0x1ff) | in1, m_o); -} - -void phpball_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R9: input mux - m_inp_mux = data >> 9 & 1; - - // R0-R2: digit select - // R0-R8: led select - m_r = data; - update_display(); -} - -void phpball_state::write_o(u16 data) -{ - // O0-O6: digit segment/led data - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 phpball_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[1]->read() | read_inputs(1); -} - -// config - -static INPUT_PORTS_START( phpball ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Plunger") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // Vss! - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) -INPUT_PORTS_END - -void phpball_state::phpball(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(phpball_state::read_k)); - m_maincpu->r().set(FUNC(phpball_state::write_r)); - m_maincpu->o().set(FUNC(phpball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_phpball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( phpball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) ) - - 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_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Super Sports-4 - * TMS1100 MP1219 (no decap) - * 4 7seg LEDs, 49 other LEDs, 1-bit sound - - The game is very similar to t3in1sa, even parts of the ROM match. But by - the time that one was released (in 1983 or 1984), U.S. Games did not exist - anymore. I suspect t3in1sa was programmed by the same (Hong Kong) company. - - This handheld includes 4 games: Basketball, Football, Soccer, Hockey. - MAME external artwork is needed for the switchable overlays. - -***************************************************************************/ - -class ssports4_state : public hh_tms1k_state -{ -public: - ssports4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ssports4(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ssports4_state::update_display() -{ - // note: R2 is an extra column - m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); -} - -void ssports4_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R9: led select/data - // R0,R1 and R8,R9 are 7segs - m_r = data; - update_display(); -} - -void ssports4_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 ssports4_state::read_k() -{ - // input mux is from R0,1,5,8,9 and O7 - m_inp_mux = (m_r & 3) | (m_r >> 3 & 4) | (m_r >> 5 & 0x18) | (m_o >> 2 & 0x20); - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ssports4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_16WAY PORT_NAME("P1 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_16WAY PORT_NAME("P1 Up-Right / Info") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_16WAY PORT_NAME("P1 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_16WAY PORT_NAME("P1 O.P.") // offensive player (modifier button) - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Right / Info") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 O.P.") - - PORT_START("IN.5") // O7 - PORT_CONFNAME( 0x03, 0x00, "Game Select" ) - PORT_CONFSETTING( 0x02, "Basketball" ) - PORT_CONFSETTING( 0x00, "Football" ) - PORT_CONFSETTING( 0x01, "Soccer" ) - PORT_CONFSETTING( 0x03, "Hockey" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ssports4_state::ssports4(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ssports4_state::read_k)); - m_maincpu->r().set(FUNC(ssports4_state::write_r)); - m_maincpu->o().set(FUNC(ssports4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x303, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_ssports4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssports4 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_ssports4_output.bin", 0, 0x20, CRC(cd6f162f) SHA1(3348edb697e996b5ab82be54076b9cd444e0f2b1) ) -ROM_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 xl25(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(k4_button) { update_halt(); } - -protected: - virtual void machine_reset() override; - -private: - void update_halt(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void xl25_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - update_halt(); -} - -// 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() & 4)); - m_maincpu->set_input_line(INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE); -} - -void xl25_state::update_display() -{ - m_display->matrix(m_r, m_o >> 1); -} - -void xl25_state::write_r(u16 data) -{ - // R0-R9: input mux, led select - m_inp_mux = data; - m_r = data; - update_display(); -} - -void xl25_state::write_o(u16 data) -{ - // O1-O3: led data - m_o = data; - update_display(); - - // O6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // O5(+K4): MCU halt - update_halt(); -} - -u8 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - 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, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void xl25_state::xl25(machine_config &config) -{ - // basic machine hardware - TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=5.6K, C=47pF - m_maincpu->k().set(FUNC(xl25_state::read_k)); - m_maincpu->r().set(FUNC(xl25_state::write_r)); - m_maincpu->o().set(FUNC(xl25_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 3); - config.set_default_layout(layout_xl25); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( xl25 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp4486a", 0x0000, 0x0400, CRC(bd84b515) SHA1(377fcc68a517260acd51eb9746cd62914a75d739) ) - - ROM_REGION( 922, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000c_xl25_micro.pla", 0, 922, CRC(8823e7f2) SHA1(676b0eace9d8730f2caa9087e8c51e540c7fabf8) ) - ROM_REGION( 558, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000c_xl25_output.pla", 0, 558, CRC(06ecc6e0) SHA1(e0fa1b9388948197b4de2edd3cd02fbde1dbabbb) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE ) - -COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // *** -CONS( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE ) - -COMP( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8 (Multi 8)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** -COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // *** -CONS( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ebball2, 0, 0, ebball2, ebball2, ebball2_state, empty_init, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ebball3, 0, 0, ebball3, ebball3, ebball3_state, empty_init, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, esbattle, 0, 0, esbattle, esbattle, esbattle_state, empty_init, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, blastit, 0, 0, blastit, blastit, blastit_state, empty_init, "Entex", "Blast It", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, einvader, 0, 0, einvader, einvader, einvader_state, empty_init, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, empty_init, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE ) -COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE ) - -COMP( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, elecbowl_state, empty_init, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // *** - -COMP( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -CONS( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons - Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** - -CONS( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -CONS( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // *** -CONS( 1977, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** -CONS( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** -CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** -CONS( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // *** - -CONS( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // *** -CONS( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, merlina, merlin, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** -CONS( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** -CONS( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** -CONS( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot - Electronic Pool", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure - The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie - The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, tandy12, 0, 0, tandy12, tandy12, tandy12_state, empty_init, "Tandy Corporation", "Tandy-12: Computerized Arcade", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** -CONS( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1976, speechp, 0, 0, speechp, speechp, speechp_state, empty_init, "Telesensory Systems, Inc.", "Speech+", MACHINE_SUPPORTS_SAVE ) - -COMP( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1975 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti125076, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, wizatron, 0, 0, wizatron, wizatron, wizatron_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1978, lilprof78, lilprof, 0, lilprof78, lilprof78, lilprof78_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, timaze, 0, 0, timaze, timaze, timaze_state, empty_init, "Texas Instruments", "unknown electronic maze game (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state, empty_init, "Texas Instruments", "Electronic Digital Thermostat", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) - -CONS( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1989, copycatm2, copycat, 0, copycatm2, copycatm2, copycatm2_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "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, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_tms1k.h b/src/mame/handheld/hh_tms1k.h deleted file mode 100644 index 7d9904e4377..00000000000 --- a/src/mame/handheld/hh_tms1k.h +++ /dev/null @@ -1,73 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/* - - TMS1000 MCU series tabletops/handhelds or other simple devices. - -*/ - -#ifndef MAME_INCLUDES_HH_TMS1K_H -#define MAME_INCLUDES_HH_TMS1K_H - -#pragma once - -#include "cpu/tms1000/tms1000.h" -#include "cpu/tms1000/tms1000c.h" -#include "cpu/tms1000/tms1100.h" -#include "cpu/tms1000/tms1400.h" -#include "cpu/tms1000/tms0970.h" -#include "cpu/tms1000/tms0980.h" -#include "cpu/tms1000/tms0270.h" -#include "cpu/tms1000/tp0320.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - - -class hh_tms1k_state : public driver_device -{ -public: - hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0), - m_out_power(*this, "power") - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - virtual DECLARE_INPUT_CHANGED_MEMBER(power_button); - - template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } - template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<18> m_inputs; // max 18 - output_finder<> m_out_power; // power state, eg. led - - // misc common - u16 m_r = 0U; // MCU R-pins data - u16 m_o = 0U; // MCU O-pins data - u32 m_inp_mux = 0U; // multiplexed inputs mask - bool m_power_on = false; - - u32 m_grid = 0U; // VFD/LED current row data - u32 m_plate = 0U; // VFD/LED current column data - - u8 read_inputs(int columns); - u8 read_rotated_inputs(int columns, u8 rowmask = 0xf); - virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off); - virtual void power_off(); - void set_power(bool state); - void switch_change(int sel, u32 mask, bool next); -}; - - -#endif // MAME_INCLUDES_HH_TMS1K_H diff --git a/src/mame/handheld/hh_ucom4.cpp b/src/mame/handheld/hh_ucom4.cpp deleted file mode 100644 index d270d5ce7c2..00000000000 --- a/src/mame/handheld/hh_ucom4.cpp +++ /dev/null @@ -1,3060 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton, Sean Riddle -/*************************************************************************** - -NEC uCOM4 MCU tabletops/handhelds or other simple devices, -most of them (emulated ones) are VFD electronic games/toys. - -known chips: - - serial device etc. ----------------------------------------------------------------- - 055 uPD546C 1978, Fidelity Checker Challenger (CR) -> fidel_checkc2.cpp - - @017 uPD552C 1979, Bambino UFO Master-Blaster Station (ET-02) - @042 uPD552C 1980, Tomy Cosmic Combat (TN-??) - @043 uPD552C 1979, Bambino Kick The Goal Soccer (ET-10) - *044 uPD552C 1979, Bambino Lucky Puck Ice Hockey (ET-08) - @048 uPD552C 1980, Tomy Tennis (TN-04) - @049 uPD552C 1981, Bambino Safari (ET-11) - @054 uPD552C 1980, Epoch Invader From Space - - @031 uPD553C 1979, Bambino Superstar Football (ET-03) - @049 uPD553C 1979, Mego Mini-Vid: Break Free - @055 uPD553C 1980, Bambino Space Laser Fight (ET-12) - *073 uPD553C 1980, Sony ST-J75 FM Stereo Tuner - @080 uPD553C 1980, Epoch Electronic Football - *102 uPD553C 1981, Bandai Block Out - @153 uPD553C 1981, Epoch Galaxy II - @160 uPD553C 1982, Tomy Pac Man (TN-08) - *167 uPD553C 1982, Sony SL models (betamax) (have dump) - @170 uPD553C 1982, Bandai Crazy Climber - @192 uPD553C 1982, Tomy Scramble (TN-10) - @202 uPD553C 1982, Epoch Astro Command - @206 uPD553C 1982, Epoch Dracula - *207 uPD553C 1982, Sony SL-J30 (tape/cd deck) - @209 uPD553C 1982, Tomy Caveman (TN-12) - @258 uPD553C 1984, Tomy Alien Chase (TN-16) - *296 uPD553C 1984, Epoch Computer Beam Gun Professional - - @511 uPD557LC 1980, Takatoku Toys Game Robot 9/Mego Fabulous Fred - @512 uPD557LC 1980, Castle Toy Tactix - @513 uPD557LC 1980, Castle Toy Name That Tune - - @060 uPD650C 1979, Mattel Computer Gin - 085 uPD650C 1980, Roland TR-808 -> roland_tr808.cpp - *127 uPD650C 198?, Sony OA-S1100 Typecorder (subcpu, have dump) - 128 uPD650C 1981, Roland TR-606 -> roland_tr606.cpp - 133 uPD650C 1982, Roland TB-303 -> roland_tb303.cpp - - (* means undumped unless noted, @ denotes it's in this driver) - - -Commonly used VFD(vacuum fluorescent display) are by NEC or Futaba. - -NEC FIP9AM20T (example, Epoch Astro Command) - grcss - -FIP = fluorescent indicator panel -g = number of grids -r = revision of the VFD -c = custom display -s = unique display part number - -============================================================================ - -ROM source notes when dumped from another publisher, but confident it's the same: -- astrocmd: Tandy Astro Command -- caveman: Tandy Caveman -- grobot9: Mego Fabulous Fred - -TODO: -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/ucom4/ucom4.h" -#include "video/pwm.h" -#include "video/hlcd0515.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork (complete) -#include "ctntune.lh" // clickable -#include "efball.lh" -#include "grobot9.lh" // clickable -#include "mcompgin.lh" -#include "mvbfree.lh" -#include "tactix.lh" // clickable - -// internal artwork (bezel overlay) -#include "tmtennis.lh" - -//#include "hh_ucom4_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_ucom4_state : public driver_device -{ -public: - hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_port[9] = { }; // MCU port A-I write data (optional) - u8 m_int = 0; // MCU INT pin state - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u32 m_plate = 0; // VFD current column data - - u8 read_inputs(int columns); - void refresh_interrupts(void); - void set_interrupt(int state); - - enum - { - PORTA = 0, - PORTB, - PORTC, - PORTD, - PORTE, - PORTF, - PORTG, - PORTH, - PORTI - }; -}; - - -// machine start/reset - -void hh_ucom4_state::machine_start() -{ - // register for savestates - save_item(NAME(m_port)); - save_item(NAME(m_int)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_ucom4_state::machine_reset() -{ - refresh_interrupts(); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_ucom4_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - -// interrupt handling - -void hh_ucom4_state::refresh_interrupts() -{ - m_maincpu->set_input_line(0, m_int ? ASSERT_LINE : CLEAR_LINE); -} - -void hh_ucom4_state::set_interrupt(int state) -{ - state = state ? 1 : 0; - - if (state != m_int) - { - if (machine().phase() >= machine_phase::RESET) - m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); - m_int = state; - } -} - -INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line) -{ - set_interrupt(newval); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Bambino UFO Master-Blaster Station (manufactured in Japan) - * PCB label Emix Corp. ET-02 - * NEC uCOM-44 MCU, label EMIX D552C 017 - * cyan VFD display Emix-101, with blue color overlay - - This is Bambino's first game, it is not known if ET-01 exists. Emix Corp. - wasn't initially a toy company, the first release was through Tomy. Emix - created the Bambino brand afterwards. It is claimed to be the first - computerized VFD game (true, unless TI Speak & Spell or M.E.M. Memoquiz - from 1978 are considered VFD games) - - known releases: - - Japan: "Missile Guerilla Warfare Maneuvers", published by Tomy - - World: UFO Master-Blaster Station, published by Bambino - -***************************************************************************/ - -class ufombs_state : public hh_ucom4_state -{ -public: - ufombs_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ufombs(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void ufombs_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3); - m_display->matrix(grid, plate); -} - -void ufombs_state::grid_w(offs_t offset, u8 data) -{ - // F,G,H0: vfd grid - int shift = (offset - PORTF) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ufombs_state::plate_w(offs_t offset, u8 data) -{ - // C,D012,I: vfd plate - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ufombs_state::speaker_w(u8 data) -{ - // E01: speaker out - m_speaker->level_w(data & 3); -} - -// config - -static INPUT_PORTS_START( ufombs ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("IN.0", 0x0a, EQUALS, 0x00) // pad in the middle, pressed when joystick is centered - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - - PORT_START("IN.1") // port B - PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ufombs_state::ufombs(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(ufombs_state::plate_w)); - m_maincpu->write_d().set(FUNC(ufombs_state::plate_w)); - m_maincpu->write_e().set(FUNC(ufombs_state::speaker_w)); - m_maincpu->write_f().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_g().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_h().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_i().set(FUNC(ufombs_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(243, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 10); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ufombs ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) ) - - ROM_REGION( 222395, "screen", 0) - ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Superstar Football (manufactured in Japan) - * PCB label Emix Corp. ET-03 - * NEC uCOM-43 MCU, label D553C 031 - * cyan VFD display Emix-102, with bezel - - The game was rereleased in 1982 as Classic Football (ET-0351), with an - improved cyan/green/red VFD. - - Press the Kick button to start the game, an automatic sequence follows. - Then choose a formation(A,B,C) and either pass the ball, and/or start - running. For more information, refer to the official manual. - -***************************************************************************/ - -class ssfball_state : public hh_ucom4_state -{ -public: - ssfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ssfball(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_b_r(); -}; - -// handlers - -void ssfball_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); - m_display->matrix(m_grid, plate); -} - -void ssfball_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid 0-7(,8) - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ssfball_state::plate_w(offs_t offset, u8 data) -{ - m_port[offset] = data; - - // E,F,G,H,I(not all!): vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // F3,G3: input mux + speaker - m_inp_mux = (m_port[PORTF] >> 3 & 1) | (m_port[PORTG] >> 2 & 2); - m_speaker->level_w(m_inp_mux); - - // E3: vfd grid 8 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -u8 ssfball_state::input_b_r() -{ - // B: input port 2, where B3 is multiplexed - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - [A] [B] [C] [PASS] [KICK/ - ^FORMATION^ DISPLAY] - - [^] - [<>] - (game lvl sw) [v] - 1<---OFF--->2 -*/ - -static INPUT_PORTS_START( ssfball ) - PORT_START("IN.0") // F3 port B3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Formation A") - - PORT_START("IN.1") // G3 port B3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Game Level" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.2") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Kick/Display") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Formation C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Formation B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed, handled in input_b_r - - PORT_START("IN.3") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pass") -INPUT_PORTS_END - -void ssfball_state::ssfball(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.3"); - m_maincpu->read_b().set(FUNC(ssfball_state::input_b_r)); - m_maincpu->write_c().set(FUNC(ssfball_state::grid_w)); - m_maincpu->write_d().set(FUNC(ssfball_state::grid_w)); - m_maincpu->write_e().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_f().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_g().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_h().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_i().set(FUNC(ssfball_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 482); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) - - ROM_REGION( 331352, "screen", 0) - ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) ) -ROM_END - -ROM_START( bmcfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) - - ROM_REGION( 331352, "screen", 0) - ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Kick The Goal Soccer - * PCB label Emix Corp. ET-10/08 (PCB is for 2 possible games) - * NEC uCOM-44 MCU, label D552C 043 - * cyan VFD display Emix-105, with bezel overlay - - Press the Display button twice to start the game. Action won't start until - player 1 presses one of the directional keys. In 2-player mode, player 2 - controls the goalkeeper, defensive players are still controlled by the CPU. - -***************************************************************************/ - -class bmsoccer_state : public hh_ucom4_state -{ -public: - bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bmsoccer(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_a_r(); -}; - -// handlers - -void bmsoccer_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2); - m_display->matrix(m_grid, plate); -} - -void bmsoccer_state::grid_w(offs_t offset, u8 data) -{ - // C01: input mux - if (offset == PORTC) - m_inp_mux = data & 3; - - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmsoccer_state::plate_w(offs_t offset, u8 data) -{ - // G3: speaker out - if (offset == PORTG) - m_speaker->level_w(data >> 3 & 1); - - // E012,F012,G012,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // E3: grid 8 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -u8 bmsoccer_state::input_a_r() -{ - // port A: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( bmsoccer ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Ball-carrier Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("Ball-carrier Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Ball-carrier Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Ball-carrier Up") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Left") // note: swap buttons if viewed from the same angle as player 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // port B - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Display/Banana Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") -INPUT_PORTS_END - -void bmsoccer_state::bmsoccer(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set(FUNC(bmsoccer_state::input_a_r)); - m_maincpu->read_b().set_ioport("IN.2"); - m_maincpu->write_c().set(FUNC(bmsoccer_state::grid_w)); - m_maincpu->write_d().set(FUNC(bmsoccer_state::grid_w)); - m_maincpu->write_e().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_f().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_g().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_h().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_i().set(FUNC(bmsoccer_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(271, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmsoccer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) ) - - ROM_REGION( 273796, "screen", 0) - ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Safari (manufactured in Japan) - * PCB label Emix Corp. ET-11 - * NEC uCOM-44 MCU, label EMIX D552C 049 - * cyan VFD display Emix-108 - -***************************************************************************/ - -class bmsafari_state : public hh_ucom4_state -{ -public: - bmsafari_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bmsafari(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void bmsafari_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3); - m_display->matrix(grid, plate); -} - -void bmsafari_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmsafari_state::plate_w(offs_t offset, u8 data) -{ - // E012,H,I: vfd plate - int shift = (offset == PORTE) ? 8 : (offset - PORTH) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // E3: grid 0 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -void bmsafari_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -// config - -static INPUT_PORTS_START( bmsafari ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x01, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY -INPUT_PORTS_END - -void bmsafari_state::bmsafari(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(bmsafari_state::grid_w)); - m_maincpu->write_d().set(FUNC(bmsafari_state::grid_w)); - m_maincpu->write_e().set(FUNC(bmsafari_state::plate_w)); - m_maincpu->write_g().set(FUNC(bmsafari_state::speaker_w)); - m_maincpu->write_h().set(FUNC(bmsafari_state::plate_w)); - m_maincpu->write_i().set(FUNC(bmsafari_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(248, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 10); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmsafari ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) ) - - ROM_REGION( 275386, "screen", 0) - ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Space Laser Fight (manufactured in Japan) - * PCB label Emix Corp. ET-12 - * NEC uCOM-43 MCU, label D553C 055 - * cyan VFD display Emix-104, with blue or green color overlay - - This is basically a revamp of their earlier Boxing game (ET-06), case and - buttons are exactly the same. - -***************************************************************************/ - -class splasfgt_state : public hh_ucom4_state -{ -public: - splasfgt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void splasfgt(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_b_r(); -}; - -// handlers - -void splasfgt_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); - m_display->matrix(m_grid, plate); -} - -void splasfgt_state::grid_w(offs_t offset, u8 data) -{ - // G,H,I0: vfd grid - int shift = (offset - PORTG) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // G(grid 0-3): input mux - m_inp_mux = m_grid & 0xf; - - // I2: vfd plate 6 - if (offset == PORTI) - plate_w(4 + PORTC, data >> 2 & 1); - else - update_display(); -} - -void splasfgt_state::plate_w(offs_t offset, u8 data) -{ - // F01: speaker out - if (offset == PORTF) - m_speaker->level_w(data & 3); - - // C,D,E,F23(,I2): vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -u8 splasfgt_state::input_b_r() -{ - // B: multiplexed buttons - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - * left = P1 side * * right = P2 side * (note: in 1P mode, switch sides between turns) - - [ JUMP ] [ HIGH ] (players sw) [ HIGH ] [ JUMP ] - 1<--->2 [START/ - [STRAIGHT] [MEDIUM] RESET] [MEDIUM] [STRAIGHT] - 1<---OFF--->2 - [ STOOP ] [ LOW ] (skill lvl sw) [ LOW ] [ STOOP ] -*/ - -static INPUT_PORTS_START( splasfgt ) - PORT_START("IN.0") // G0 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Position Straight") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Position Jump") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Position Stoop") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // G1 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Beam High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Beam Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Beam Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Position Straight") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Position Jump") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Position Stoop") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // G3 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Beam High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Beam Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Beam Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void splasfgt_state::splasfgt(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.4"); - m_maincpu->read_b().set(FUNC(splasfgt_state::input_b_r)); - m_maincpu->write_c().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_d().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_e().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_f().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_g().set(FUNC(splasfgt_state::grid_w)); - m_maincpu->write_h().set(FUNC(splasfgt_state::grid_w)); - m_maincpu->write_i().set(FUNC(splasfgt_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 476); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( splasfgt ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) ) - - ROM_REGION( 246609, "screen", 0) - ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Crazy Climber (manufactured in Japan) - * PCB labels SM-020/SM-021 - * NEC uCOM-43 MCU, label D553C 170 - * cyan/red/green VFD display NEC FIP6AM2-T no. 1-8 2, with partial color overlay and bezel - - known releases: - - Japan: FL Crazy Climbing, published by Bandai - - USA: Crazy Climber, published by Bandai - -***************************************************************************/ - -class bcclimbr_state : public hh_ucom4_state -{ -public: - bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bcclimbr(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void bcclimbr_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); - u32 plate = bitswap<24>(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bcclimbr_state::grid_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // H,I01: vfd grid - int shift = (offset - PORTH) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bcclimbr_state::plate_w(offs_t offset, u8 data) -{ - // C,D,E,F: vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( bcclimbr ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) -INPUT_PORTS_END - -void bcclimbr_state::bcclimbr(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_d().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_e().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_f().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_g().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_h().set(FUNC(bcclimbr_state::grid_w)); - m_maincpu->write_i().set(FUNC(bcclimbr_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(310, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bcclimbr ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) ) - - ROM_REGION( 219971, "screen", 0) - ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) ) -ROM_END - - - - - -/*************************************************************************** - - Castle Toy Tactix - * NEC uCOM-43 MCU, label D557LC 512 - * 16 LEDs behind buttons - - Tactix is similar to Merlin, for 1 or 2 players. In 2-player mode, simply - don't press the Comp Turn button. The four included minigames are: - 1: Capture (reversi) - 2: Jump-Off (peg solitaire) - 3: Triple Play (3 in a row) - 4: Concentration (memory) - -***************************************************************************/ - -class tactix_state : public hh_ucom4_state -{ -public: - tactix_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tactix(machine_config &config); - -private: - void leds_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void tactix_state::leds_w(offs_t offset, u8 data) -{ - // D,F: 4*4 led matrix - m_port[offset] = data; - m_display->matrix(m_port[PORTF], m_port[PORTD]); -} - -void tactix_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -void tactix_state::input_w(offs_t offset, u8 data) -{ - // C,E0: input mux - m_port[offset] = data; - m_inp_mux = (m_port[PORTE] << 4 & 0x10) | m_port[PORTC]; -} - -u8 tactix_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( tactix ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 13") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 14") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button 11") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 15") - - PORT_START("IN.3") // C3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 12") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 16") - - PORT_START("IN.4") // E0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("New Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Comp Turn") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tactix_state::tactix(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 200000); // approximation - m_maincpu->read_a().set(FUNC(tactix_state::input_r)); - m_maincpu->write_c().set(FUNC(tactix_state::input_w)); - m_maincpu->write_d().set(FUNC(tactix_state::leds_w)); - m_maincpu->write_e().set(FUNC(tactix_state::input_w)); - m_maincpu->write_f().set(FUNC(tactix_state::leds_w)); - m_maincpu->write_g().set(FUNC(tactix_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 4); - config.set_default_layout(layout_tactix); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tactix ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) ) -ROM_END - - - - - -/*************************************************************************** - - Castle Toy Name That Tune - * NEC uCOM-43 MCU, label D557LC 513 - * 2 lamps, 1 7seg(+2 fake 7segs above a power-on lamp, showing "0") - - This is a tabletop multiplayer game. Players are meant to place a bid, - and guess the song (by announcing it to everyone). - -***************************************************************************/ - -class ctntune_state : public hh_ucom4_state -{ -public: - ctntune_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ctntune(machine_config &config); - - // start button powers unit back on - DECLARE_INPUT_CHANGED_MEMBER(start_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } - -private: - void update_display(); - void _7seg_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void ctntune_state::update_display() -{ - u8 sel = m_port[PORTD] >> 3 & 1; // turn off display when power is off - u8 lamps = m_port[PORTD] & 3; - u8 digit = (m_port[PORTF] << 4 | m_port[PORTE]) & 0x7f; - - m_display->matrix(sel, lamps << 7 | digit); -} - -void ctntune_state::_7seg_w(offs_t offset, u8 data) -{ - // E,F012: 7seg data, F3: N/C - m_port[offset] = data; - update_display(); -} - -void ctntune_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -void ctntune_state::input_w(offs_t offset, u8 data) -{ - // D3: trigger power-off on falling edge - if (offset == PORTD && ~data & m_port[PORTD] & 8) - m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - - // C,D23: input mux - // D0,D1: yellow, red lamp - m_port[offset] = data; - m_inp_mux = (m_port[PORTD] << 2 & 0x30) | m_port[PORTC]; - update_display(); -} - -u8 ctntune_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ctntune ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Button 1") // defaults to keyboard Z row - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Button 5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Button 9") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Button 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("Button 10") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - - PORT_START("IN.3") // C3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Button 4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Button 8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") - - PORT_START("IN.4") // D2 port A - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Play Button") - - PORT_START("IN.5") // D3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, ctntune_state, start_button, 0) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ctntune_state::ctntune(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 200000); // approximation - m_maincpu->read_a().set(FUNC(ctntune_state::input_r)); - m_maincpu->write_c().set(FUNC(ctntune_state::input_w)); - m_maincpu->write_d().set(FUNC(ctntune_state::input_w)); - m_maincpu->write_e().set(FUNC(ctntune_state::_7seg_w)); - m_maincpu->write_f().set(FUNC(ctntune_state::_7seg_w)); - m_maincpu->write_g().set(FUNC(ctntune_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 7+2); - m_display->set_segmask(1, 0x7f); - config.set_default_layout(layout_ctntune); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ctntune ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d557lc-513", 0x0000, 0x0800, CRC(cd85ee23) SHA1(32b8fc8cb92fc1fd27da9148788a09d3bcd46a92) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Invader From Space (manufactured in Japan) - * PCB labels 36010(A/B) - * NEC uCOM-44 MCU, label D552C 054 - * cyan VFD display NEC FIP9AM18T tube no. 0D, with color overlay - - known releases: - - USA: Invader From Space, published by Epoch - - UK: Invader From Space, published by Grandstand - -***************************************************************************/ - -class invspace_state : public hh_ucom4_state -{ -public: - invspace_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void invspace(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void invspace_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8); - m_display->matrix(grid, plate); -} - -void invspace_state::grid_w(offs_t offset, u8 data) -{ - // I0: speaker out - if (offset == PORTI) - m_speaker->level_w(data & 1); - - // C,D,I1: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void invspace_state::plate_w(offs_t offset, u8 data) -{ - // E,F,G,H123: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( invspace ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void invspace_state::invspace(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(invspace_state::grid_w)); - m_maincpu->write_d().set(FUNC(invspace_state::grid_w)); - m_maincpu->write_e().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_f().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_g().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_h().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_i().set(FUNC(invspace_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(289, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( invspace ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) ) - - ROM_REGION( 110899, "screen", 0) - ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Electronic Football (manufactured in Japan) - * PCB labels 36020(A/B/C) - * NEC uCOM-43 MCU, label D553C 080 - * cyan VFD display NEC FIP10AM15T tube no. 0F, with bezel overlay - - known releases: - - USA: Electronic Football (aka Pro-Bowl Football), published by Epoch - - Japan: American Football, published by Epoch - -***************************************************************************/ - -class efball_state : public hh_ucom4_state -{ -public: - efball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void efball(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void efball_state::update_display() -{ - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7); - m_display->matrix(m_grid, plate); -} - -void efball_state::grid_w(offs_t offset, u8 data) -{ - // H2: speaker out - if (offset == PORTH) - m_speaker->level_w(data >> 2 & 1); - - // F,G,H01: vfd grid - int shift = (offset - PORTF) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void efball_state::plate_w(offs_t offset, u8 data) -{ - // D,E,I: vfd plate - int shift = (offset == PORTI) ? 8 : (offset - PORTD) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( efball ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Down-Field") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P1 Score-Time") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") - - PORT_START("IN.2") // port C - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Kick Return") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") -INPUT_PORTS_END - -void efball_state::efball(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->read_c().set_ioport("IN.2"); - m_maincpu->write_d().set(FUNC(efball_state::plate_w)); - m_maincpu->write_e().set(FUNC(efball_state::plate_w)); - m_maincpu->write_f().set(FUNC(efball_state::grid_w)); - m_maincpu->write_g().set(FUNC(efball_state::grid_w)); - m_maincpu->write_h().set(FUNC(efball_state::grid_w)); - m_maincpu->write_i().set(FUNC(efball_state::plate_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 11); - config.set_default_layout(layout_efball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( efball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Galaxy II (manufactured in Japan) - * PCB labels 19096/96062 - * NEC uCOM-43 MCU, label D553C 153 - * cyan/red VFD display NEC FIP10xM20T, with color overlay. x = multiple VFD - revisions exist, with different graphics: rev B no. 1-8, rev. D no. 2-21. - - known releases: - - USA: Galaxy II, published by Epoch - - Japan: Astro Wars, published by Epoch - - UK: Astro Wars, published by Grandstand - -***************************************************************************/ - -class galaxy2_state : public hh_ucom4_state -{ -public: - galaxy2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void galaxy2b(machine_config &config); - void galaxy2(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void galaxy2_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - u16 plate = bitswap<16>(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9); - m_display->matrix(grid, plate); -} - -void galaxy2_state::grid_w(offs_t offset, u8 data) -{ - // E3: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 3 & 1); - - // C,D,E01: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void galaxy2_state::plate_w(offs_t offset, u8 data) -{ - // F,G,H,I: vfd plate - int shift = (offset - PORTF) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( galaxy2 ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void galaxy2_state::galaxy2(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_d().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_e().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_f().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_g().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_h().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_i().set(FUNC(galaxy2_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(304, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 15); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void galaxy2_state::galaxy2b(machine_config &config) -{ - galaxy2(config); - - // video hardware - screen_device *screen = subdevice("screen"); - screen->set_size(306, 1080); - screen->set_visarea_full(); -} - -// roms - -ROM_START( galaxy2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) - - ROM_REGION( 325057, "screen", 0) - ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) ) -ROM_END - -ROM_START( galaxy2b ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) - - ROM_REGION( 266377, "screen", 0) - ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Astro Command (manufactured in Japan) - * PCB labels 96111/96112 - * NEC uCOM-43 MCU, label D553C 202 - * cyan/red VFD display NEC FIP9AM20T no. 42-42, with color overlay + bezel - - known releases: - - Japan: Astro Command, published by Epoch - - USA: Astro Command, published by Tandy - - UK: Scramble, published by Grandstand - -***************************************************************************/ - -class astrocmd_state : public hh_ucom4_state -{ -public: - astrocmd_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void astrocmd(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void astrocmd_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); - m_display->matrix(grid, plate); -} - -void astrocmd_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void astrocmd_state::plate_w(offs_t offset, u8 data) -{ - // E01,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - if (offset == PORTE) - { - // E2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // E3: vfd grid 8 - grid_w(offset, data >> 3 & 1); - } - else - update_display(); -} - -// config - -static INPUT_PORTS_START( astrocmd ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Missile") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void astrocmd_state::astrocmd(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(astrocmd_state::grid_w)); - m_maincpu->write_d().set(FUNC(astrocmd_state::grid_w)); - m_maincpu->write_e().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_f().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_g().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_h().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_i().set(FUNC(astrocmd_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 525); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( astrocmd ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) ) - - ROM_REGION( 335362, "screen", 0) - ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Dracula (manufactured in Japan) - * PCB label 96121 - * NEC uCOM-43 MCU, label D553C 206 - * cyan/red/green VFD display NEC FIP8BM20T no. 2-42 - - known releases: - - Japan: Dracula House, yellow case, published by Epoch - - USA: Dracula, red case, published by Epoch - - Other: Dracula, yellow case, published by Hales - -***************************************************************************/ - -class edracula_state : public hh_ucom4_state -{ -public: - edracula_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void edracula(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void edracula_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void edracula_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void edracula_state::plate_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // E,F,G,H,I01: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( edracula ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void edracula_state::edracula(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(edracula_state::grid_w)); - m_maincpu->write_d().set(FUNC(edracula_state::grid_w)); - m_maincpu->write_e().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_f().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_g().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_h().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_i().set(FUNC(edracula_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 526); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( edracula ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) - - ROM_REGION( 794532, "screen", 0) - ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Computer Gin - * NEC uCOM-43 MCU, label D650C 060 (die label same) - * Hughes HLCD0530 LCD driver, 5 by 14 segments LCD panel, no sound - -***************************************************************************/ - -class mcompgin_state : public hh_ucom4_state -{ -public: - mcompgin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag), - m_lcd(*this, "lcd") - { } - - void mcompgin(machine_config &config); - -private: - required_device m_lcd; - - void lcd_output_w(offs_t offset, u32 data); - void lcd_w(u8 data); -}; - -// handlers - -void mcompgin_state::lcd_output_w(offs_t offset, u32 data) -{ - // uses ROW0-4, COL11-24 - m_display->matrix(1 << offset, data); -} - -void mcompgin_state::lcd_w(u8 data) -{ - // E0: HLCD0530 _CS - // E1: HLCD0530 clock - // E2: HLCD0530 data in - m_lcd->cs_w(data & 1); - m_lcd->data_w(data >> 2 & 1); - m_lcd->clock_w(data >> 1 & 1); -} - -// config - -static INPUT_PORTS_START( mcompgin ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Deal / Gin") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Discard") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Draw") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Compare") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Score") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void mcompgin_state::mcompgin(machine_config &config) -{ - // basic machine hardware - NEC_D650(config, m_maincpu, 400_kHz_XTAL); // TDK FCR400K - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_e().set(FUNC(mcompgin_state::lcd_w)); - - // video hardware - HLCD0530(config, m_lcd, 500); // C=0.01uF - m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); - - PWM_DISPLAY(config, m_display).set_size(8, 24); - - config.set_default_layout(layout_mcompgin); - - // no sound! -} - -// roms - -ROM_START( mcompgin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) ) -ROM_END - - - - - -/*************************************************************************** - - Mego Mini-Vid: Break Free (manufactured in Japan) - * PCB label Mego 79 rev F - * NEC uCOM-43 MCU, label D553C 049 - * cyan VFD display Futaba DM-4.5 91 - -***************************************************************************/ - -class mvbfree_state : public hh_ucom4_state -{ -public: - mvbfree_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void mvbfree(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void mvbfree_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - m_display->matrix(grid, plate); -} - -void mvbfree_state::grid_w(offs_t offset, u8 data) -{ - // E23,F,G,H: vfd grid - int shift = (offset - PORTE) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // E01: plate 0,1 - if (offset == PORTE) - plate_w(2 + PORTC, data & 3); - else - update_display(); -} - -void mvbfree_state::plate_w(offs_t offset, u8 data) -{ - // C,D(,E01): vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void mvbfree_state::speaker_w(u8 data) -{ - // I0: speaker out - m_speaker->level_w(data & 1); -} - -// config - -static INPUT_PORTS_START( mvbfree ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // port B - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) // unimplemented p1/p2 buttons - PORT_CONFNAME( 0x0c, 0x04, "Game Select") - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFSETTING( 0x08, "3" ) -INPUT_PORTS_END - -void mvbfree_state::mvbfree(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(mvbfree_state::plate_w)); - m_maincpu->write_d().set(FUNC(mvbfree_state::plate_w)); - m_maincpu->write_e().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_f().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_g().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_h().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(14, 10); - config.set_default_layout(layout_mvbfree); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mvbfree ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) ) -ROM_END - - - - - -/*************************************************************************** - - Takatoku Toys(T.T) Game Robot 9 「ゲームロボット九」 - * PCB label GAME ROBOT 7520 - * NEC uCOM-43 MCU, label TTGR-512 (die label NEC D557 511) - * 9 lamps behind buttons - - known releases: - - Japan: Game Robot 9, published by Takatoku Toys - - USA: Fabulous Fred - The Ultimate Electronic Game, published by Mego - - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as - 12-button version, a clone of Tandy-12) - - Accessories were included for some of the minigames. - -***************************************************************************/ - -class grobot9_state : public hh_ucom4_state -{ -public: - grobot9_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void grobot9(machine_config &config); - -private: - void lamps_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(u8 data); - u8 input_r(); -}; - -// handlers - -void grobot9_state::lamps_w(offs_t offset, u8 data) -{ - if (offset == PORTE) - { - // E1: speaker out - m_speaker->level_w(data >> 1 & 1); - - // E3: input mux high bit - m_inp_mux = (m_inp_mux & 7) | (data & 8); - } - - // D,F,E0: lamps - m_port[offset] = data; - m_display->matrix(1, m_port[PORTD] | m_port[PORTF] << 4 | m_port[PORTE] << 8); -} - -void grobot9_state::input_w(u8 data) -{ - // C012: input mux low - m_inp_mux = (m_inp_mux & 8) | (data & 7); -} - -u8 grobot9_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( grobot9 ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_W) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_E) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_D) PORT_NAME("Button 4") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_C) PORT_NAME("Button 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_X) PORT_NAME("Button 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_A) PORT_NAME("Button 8") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_S) PORT_NAME("Button 9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Rest") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Eighth Note") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // E3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Hit") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") - - PORT_START("IN.4") // INT - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_ucom4_state, single_interrupt_line, 0) PORT_NAME("Start-Pitch") -INPUT_PORTS_END - -void grobot9_state::grobot9(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 160000); // approximation - m_maincpu->read_a().set(FUNC(grobot9_state::input_r)); - m_maincpu->write_c().set(FUNC(grobot9_state::input_w)); - m_maincpu->write_d().set(FUNC(grobot9_state::lamps_w)); - m_maincpu->write_e().set(FUNC(grobot9_state::lamps_w)); - m_maincpu->write_f().set(FUNC(grobot9_state::lamps_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 9); - config.set_default_layout(layout_grobot9); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( grobot9 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Cosmic Combat (manufactured in Japan) - * PCB label 2E1019-E01 - * NEC uCOM-44 MCU, label D552C 042 - * cyan VFD display NEC FIP32AM18Y tube no. 0E, with color overlay - - known releases: - - USA: Cosmic Combat, published by Tomy - - Japan: Space Attack, published by Tomy - -***************************************************************************/ - -class tccombat_state : public hh_ucom4_state -{ -public: - tccombat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tccombat(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tccombat_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4); - u32 plate = bitswap<24>(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6); - m_display->matrix(grid, plate); -} - -void tccombat_state::grid_w(offs_t offset, u8 data) -{ - // I1: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 1 & 1); - - // C,D,I0: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tccombat_state::plate_w(offs_t offset, u8 data) -{ - // E,F123,G,H: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tccombat ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY -INPUT_PORTS_END - -void tccombat_state::tccombat(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_c().set(FUNC(tccombat_state::grid_w)); - m_maincpu->write_d().set(FUNC(tccombat_state::grid_w)); - m_maincpu->write_e().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_f().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_g().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_h().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_i().set(FUNC(tccombat_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(300, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tccombat ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) ) - - ROM_REGION( 210960, "screen", 0) - ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Tennis (manufactured in Japan) - * PCB label TOMY TN-04 TENNIS - * NEC uCOM-44 MCU, label D552C 048 - * cyan VFD display NEC FIP11AM15T tube no. 0F, with overlay - - The initial release of this game was in 1979, known as Pro-Tennis, - it has a D553 instead of D552, with just a little over 50% ROM used. - - Press the Serve button to start, then hit the ball by pressing one of the - positional buttons when the ball flies over it. - -***************************************************************************/ - -class tmtennis_state : public hh_ucom4_state -{ -public: - tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmtennis(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void port_e_w(u8 data); - u8 input_r(offs_t offset); -}; - -void tmtennis_state::machine_reset() -{ - hh_ucom4_state::machine_reset(); - set_clock(); -} - -// handlers - -void tmtennis_state::set_clock() -{ - // MCU clock is from an LC circuit oscillating by default at ~360kHz, - // but on PRO1, the difficulty switch puts a capacitor across the LC circuit - // to slow it down to ~260kHz. - m_maincpu->set_unscaled_clock((m_inputs[1]->read() & 0x100) ? 260000 : 360000); -} - -void tmtennis_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void tmtennis_state::grid_w(offs_t offset, u8 data) -{ - // G,H,I: vfd grid - int shift = (offset - PORTG) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtennis_state::plate_w(offs_t offset, u8 data) -{ - // C,D,F: vfd plate - int shift = (offset == PORTF) ? 8 : (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtennis_state::port_e_w(u8 data) -{ - // E01: input mux - // E2: speaker out - // E3: N/C - m_inp_mux = data & 3; - m_speaker->level_w(data >> 2 & 1); -} - -u8 tmtennis_state::input_r(offs_t offset) -{ - // A,B: multiplexed buttons - return ~read_inputs(2) >> (offset*4); -} - -// config - -/* Pro-Tennis physical button layout and labels are like this: - - * left = P2/CPU side * * right = P1 side * - - [SERVE] [1] [2] [3] [3] [2] [1] [SERVE] - [4] [5] [6] [6] [5] [4] - - PRACTICE<--PRO1-->PRO2 1PLAYER<--OFF-->2PLAYER -*/ - -static INPUT_PORTS_START( tmtennis ) - PORT_START("IN.0") // E0 port A/B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Serve") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Serve") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("P1 Button 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("P1 Button 4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Button 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Button 5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Button 3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Button 6") - - PORT_START("IN.1") // E1 port A/B - PORT_CONFNAME( 0x101, 0x100, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tmtennis_state, difficulty_switch, 0) - PORT_CONFSETTING( 0x001, "Practice" ) - PORT_CONFSETTING( 0x100, "Pro 1" ) // -> difficulty_switch - PORT_CONFSETTING( 0x000, "Pro 2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Button 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Button 4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Button 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Button 5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P2 Button 3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 6") -INPUT_PORTS_END - -void tmtennis_state::tmtennis(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 360000); // see set_clock - m_maincpu->read_a().set(FUNC(tmtennis_state::input_r)); - m_maincpu->read_b().set(FUNC(tmtennis_state::input_r)); - m_maincpu->write_c().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_d().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_e().set(FUNC(tmtennis_state::port_e_w)); - m_maincpu->write_f().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmtennis_state::grid_w)); - m_maincpu->write_h().set(FUNC(tmtennis_state::grid_w)); - m_maincpu->write_i().set(FUNC(tmtennis_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 417); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 12); - config.set_default_layout(layout_tmtennis); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmtennis ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) ) - - ROM_REGION( 204490, "screen", 0) - ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Pac-Man (manufactured in Japan) - * PCB label TN-08 2E108E01 - * NEC uCOM-43 MCU, label D553C 160 - * cyan/red/green VFD display NEC FIP8AM18T no. 2-21 - * bright yellow round casing - - known releases: - - Japan: Puck Man, published by Tomy - - USA: Pac Man, published by Tomy - - UK: Puckman (Tomy), and also published by Grandstand as Munchman - - Australia: Pac Man-1, published by Futuretronics - - The game will start automatically after turning it on. This Pac Man refuses - to eat dots with his butt, you can only eat them going right-to-left. - -***************************************************************************/ - -class tmpacman_state : public hh_ucom4_state -{ -public: - tmpacman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmpacman(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tmpacman_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; - m_display->matrix(grid, plate); -} - -void tmpacman_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmpacman_state::plate_w(offs_t offset, u8 data) -{ - // E1: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 1 & 1); - - // E023,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tmpacman ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // port B - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tmpacman_state::tmpacman(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 430_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(tmpacman_state::grid_w)); - m_maincpu->write_d().set(FUNC(tmpacman_state::grid_w)); - m_maincpu->write_e().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_f().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_h().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_i().set(FUNC(tmpacman_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 508); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmpacman ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) ) - - ROM_REGION( 230216, "screen", 0) - ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Scramble (manufactured in Japan) - * PCB label TN-10 2E114E01 - * NEC uCOM-43 MCU, label D553C 192 - * cyan/red/green VFD display NEC FIP10CM20T no. 2-41 - - known releases: - - World: Scramble, published by Tomy - - USA: Scramble, published by Tandy - - UK: Astro Blaster, published by Hales (Epoch Astro Command was named Scramble) - - Germany: Rambler, published by Tomy - -***************************************************************************/ - -class tmscramb_state : public hh_ucom4_state -{ -public: - tmscramb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmscramb(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tmscramb_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; - m_display->matrix(m_grid, plate); -} - -void tmscramb_state::grid_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // C,D,I01: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmscramb_state::plate_w(offs_t offset, u8 data) -{ - // E,F,G,H: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tmscramb ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tmscramb_state::tmscramb(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(tmscramb_state::grid_w)); - m_maincpu->write_d().set(FUNC(tmscramb_state::grid_w)); - m_maincpu->write_e().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_f().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_h().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_i().set(FUNC(tmscramb_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 556); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmscramb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) ) - - ROM_REGION( 243830, "screen", 0) - ROM_LOAD( "tmscramb.svg", 0, 243830, CRC(300b098a) SHA1(9fde58ac0f4e4cfea05301346cbf5b1ced9fe973) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Caveman (manufactured in Japan) - * PCB label TN-12 2E114E03 - * NEC uCOM-43 MCU, label D553C 209 - * cyan/red/green VFD display NEC FIP8AM20T no. 2-42 - - known releases: - - World: Caveman, published by Tomy - - USA: Caveman, published by Tandy - - UK: Cave Man - Jr. Caveman vs Dinosaur, published by Grandstand - -***************************************************************************/ - -class tcaveman_state : public hh_ucom4_state -{ -public: - tcaveman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tcaveman(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tcaveman_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; - m_display->matrix(grid, plate); -} - -void tcaveman_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tcaveman_state::plate_w(offs_t offset, u8 data) -{ - // E3: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 3 & 1); - - // E012,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tcaveman ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x08, "Professional" ) -INPUT_PORTS_END - -void tcaveman_state::tcaveman(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_c().set(FUNC(tcaveman_state::grid_w)); - m_maincpu->write_d().set(FUNC(tcaveman_state::grid_w)); - m_maincpu->write_e().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_f().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_g().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_h().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_i().set(FUNC(tcaveman_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 559); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tcaveman ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) ) - - ROM_REGION( 306952, "screen", 0) - ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Alien Chase (manufactured in Japan) - * PCB label TN-16 2E121B01 - * NEC uCOM-43 MCU, label D553C 258 - * red/green VFD display NEC FIP9AM24T, with color overlay, 2-sided* - - *Player one views the VFD from the front (grid+filament side) while the - opposite player views it from the back side (through the conductive traces), - basically a mirror-image. - - To start the game, simply press [UP]. Hold a joystick direction to move around. - -***************************************************************************/ - -class alnchase_state : public hh_ucom4_state -{ -public: - alnchase_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void alnchase(machine_config &config); - -private: - void output_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void alnchase_state::output_w(offs_t offset, u8 data) -{ - if (offset <= PORTE) - { - // C,D,E0: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // C0(grid 0): input enable PL1 - // D0(grid 4): input enable PL2 - m_inp_mux = (m_grid & 1) | (m_grid >> 3 & 2); - - // E1: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 1 & 1); - } - - if (offset >= PORTE) - { - // E23,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; - } - - m_display->matrix(m_grid, m_plate); -} - -u8 alnchase_state::input_r() -{ - // A: multiplexed buttons - return read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - POWER SOUND LEVEL PLAYER - ON ON PRO TWO START - o o | | - | | | | [joystick] - | | o o - OFF OFF AMA ONE GAME 0,1,2,3 - - 1 PLAYER SIDE - - other player side only has a joystick -*/ - -static INPUT_PORTS_START( alnchase ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // on non-mirrored view, swap P2 left/right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - - PORT_START("IN.2") // port B - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x02, "Professional" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void alnchase_state::alnchase(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set(FUNC(alnchase_state::input_r)); - m_maincpu->read_b().set_ioport("IN.2"); - m_maincpu->write_c().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_d().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_e().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_f().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_g().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_h().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_i().set(FUNC(alnchase_state::output_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(365, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alnchase ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-258", 0x0000, 0x0800, CRC(c5284ff5) SHA1(6a20aaacc9748f0e0335958f3cea482e36153704) ) - - ROM_REGION( 576864, "screen", 0) - ROM_LOAD( "alnchase.svg", 0, 576864, CRC(fe7c7078) SHA1(0d201eeaeb291ded14c0759d1d3d5b2491cf0792) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel Electronics", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** - -CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE ) - -// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/rzone.cpp b/src/mame/handheld/rzone.cpp deleted file mode 100644 index abae24156fb..00000000000 --- a/src/mame/handheld/rzone.cpp +++ /dev/null @@ -1,355 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - - ** subclass of hh_sm510_state (includes/hh_sm510.h, drivers/hh_sm510.cpp) ** - - Tiger R-Zone driver - - This is a backwards console, the heart of the machine is the cartridge. - The console houses the controller, speaker, power, backlight, and a - polarizer filter for the screen. The cartridge has the MCU, optional - sound ROM, and the LCD screen in a translucent window. - - Console family: - - 1995: R-Zone HeadGear: Wearable headset, controller is separate, - red-on-black screen is reflected in front of the right eye. - 1996: R-Zone SuperScreen: Handheld console, inverted filter(aka black - LCD segments), optional background sheet as with standalone handhelds. - 1997: R-Zone X.P.G - Xtreme Pocket Game: Handheld version of HeadGear. - 1997: R-Zone DataZone: PDA with a built-in SuperScreen. - - TODO: - - softwarelist? it's impossible right now due to SVG initialization - - support for SuperScreen. SVG colors will need to be inverted, or maybe - with artwork or HLSL? - - add DataZone, will get its own driver - -***************************************************************************/ - -#include "emu.h" -#include "hh_sm510.h" - -#include "machine/timer.h" -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "rzone.lh" - - -namespace { - -class rzone_state : public hh_sm510_state -{ -public: - rzone_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag), - m_led_out(*this, "led"), - m_led_off(*this, "led_off") - { } - - void rzbatfor(machine_config &config); - void rztoshden(machine_config &config); - void rzindy500(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - output_finder<> m_led_out; - required_device m_led_off; - - int m_led_pin = 0; - int m_sctrl = 0; - int m_sclock = 0; - - TIMER_DEVICE_CALLBACK_MEMBER(led_off_callback) { m_led_out = m_led_pin ? 1 : 0; } - DECLARE_WRITE_LINE_MEMBER(led_w); - DECLARE_WRITE_LINE_MEMBER(audio_w); - DECLARE_WRITE_LINE_MEMBER(sctrl_w); - DECLARE_WRITE_LINE_MEMBER(sclock_w); - DECLARE_READ_LINE_MEMBER(sdata_r); - - void t1_write_r(u8 data); - void t1_write_s(u8 data); - virtual u8 input_r() override; - - void t2_update_audio(); - void t2_write_r(u8 data); - void t2_write_s(u8 data); -}; - - -// machine start - -void rzone_state::machine_start() -{ - hh_sm510_state::machine_start(); - - // resolve handlers - m_led_out.resolve(); - - // register for savestates - save_item(NAME(m_led_pin)); - save_item(NAME(m_sctrl)); - save_item(NAME(m_sclock)); -} - - -/*************************************************************************** - I/O -***************************************************************************/ - -// console - -WRITE_LINE_MEMBER(rzone_state::led_w) -{ - // LED: enable backlight - if (state) - m_led_out = 1; - - // delay led off to prevent flickering - if (!state && m_led_pin) - m_led_off->adjust(attotime::from_msec(30)); - - m_led_pin = state; -} - -WRITE_LINE_MEMBER(rzone_state::audio_w) -{ - // Audio: speaker out - m_speaker->level_w(state ? 1 : 0); -} - -WRITE_LINE_MEMBER(rzone_state::sctrl_w) -{ - // SCTRL: 74165 SH/LD: reload inputs while low - if (!state || !m_sctrl) - m_inp_mux = m_inputs[0]->read(); - - m_sctrl = state; -} - -WRITE_LINE_MEMBER(rzone_state::sclock_w) -{ - // SCLOCK: 74165 CLK: shift inputs on rising edge when 74165 SH/LD is high - if (m_sctrl && !m_sclock && state) - m_inp_mux >>= 1; - - m_sclock = state; -} - -READ_LINE_MEMBER(rzone_state::sdata_r) -{ - // SDATA: 74165 Q - sctrl_w(m_sctrl); // reload inputs if needed - return m_inp_mux & 1; -} - - -// cartridge type 1: simple SM510 - -void rzone_state::t1_write_r(u8 data) -{ - // R1: Audio - audio_w(data & 1); - - // R2: SCTRL - sctrl_w(data >> 1 & 1); -} - -void rzone_state::t1_write_s(u8 data) -{ - // S1: LED - led_w(data & 1); - - // S2: SCLOCK - sclock_w(data >> 1 & 1); -} - -u8 rzone_state::input_r() -{ - // K1: SDATA - return sdata_r(); -} - - -// cartridge type 2: simple SM512, 2 audio lines - -void rzone_state::t2_update_audio() -{ - audio_w((m_s >> 2 & 1) | (m_r & 1)); -} - -void rzone_state::t2_write_r(u8 data) -{ - // R: Audio - m_r = data; - t2_update_audio(); -} - -void rzone_state::t2_write_s(u8 data) -{ - // S1: SCTRL - sctrl_w(data & 1); - - // S2: SCLOCK - sclock_w(data >> 1 & 1); - - // S3: Audio - m_s = data; - t2_update_audio(); - - // S4: LED - led_w(data >> 3 & 1); -} - - - -/*************************************************************************** - Inputs -***************************************************************************/ - -static INPUT_PORTS_START( rzone ) - PORT_START("IN.0") - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // A - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // B - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) // C - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) // D - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) -INPUT_PORTS_END - - - -/*************************************************************************** - Machine Configs -***************************************************************************/ - -void rzone_state::rzbatfor(machine_config &config) -{ - // basic machine hardware - SM512(config, m_maincpu); // no external XTAL - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t2_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t2_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1368, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void rzone_state::rztoshden(machine_config &config) -{ - // basic machine hardware - SM510(config, m_maincpu); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1392, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void rzone_state::rzindy500(machine_config &config) -{ - // basic machine hardware - SM510(config, m_maincpu); // no external XTAL - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1425, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/*************************************************************************** - ROM Definitions -***************************************************************************/ - -ROM_START( rzbatfor ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-231, SM512 under epoxy (die label KMN1202) (not the same game as the standalone Tiger handheld) - ROM_LOAD( "12_02.program", 0x0000, 0x1000, CRC(27abdb52) SHA1(b356ff80b628244da588b4748404b78d7a57eccd) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "12_02.melody", 0x000, 0x100, CRC(d794746c) SHA1(f0706c5100c090c65fcb2d768b5a5b4a55b29e04) ) - - ROM_REGION( 652556, "screen", 0) - ROM_LOAD( "rzbatfor.svg", 0, 652556, CRC(4d850489) SHA1(31a2a1e9209c0f77dbc268cddbfa4a67478734a7) ) -ROM_END - -ROM_START( rztoshden ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-241, SM510 under epoxy (die label ML4) - ROM_LOAD( "ml4", 0x0000, 0x1000, CRC(282c641f) SHA1(f94e4a17ffe90adcc6046070034be9b777f72288) ) - - ROM_REGION( 857474, "screen", 0) - ROM_LOAD( "rztoshden.svg", 0, 857474, CRC(e4340f84) SHA1(4f040d3c7dc06d66b4f06942e610a64c11e5cd4d) ) -ROM_END - -ROM_START( rzindy500 ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-312, SM510 under epoxy (die label KMS10 22) - ROM_LOAD( "10_22", 0x0000, 0x1000, CRC(99a746d0) SHA1(64264499d45a566fa9a0801c20e7fa27eac18da6) ) - - ROM_REGION( 533411, "screen", 0) - ROM_LOAD( "rzindy500.svg", 0, 533411, CRC(cfc85677) SHA1(014b9123d81fba1488b4a22a6b6fd0c09e22c1ea) ) -ROM_END - -} // anonymous namespace - - - -/*************************************************************************** - Drivers -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1995, rzbatfor, 0, 0, rzbatfor, rzone, rzone_state, empty_init, "Tiger Electronics", "R-Zone: Batman Forever", MACHINE_SUPPORTS_SAVE ) -CONS( 1996, rztoshden, 0, 0, rztoshden, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Takara)", "R-Zone: Battle Arena Toshinden", MACHINE_SUPPORTS_SAVE ) -CONS( 1996, rzindy500, 0, 0, rzindy500, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Sega)", "R-Zone: Indy 500", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/tispeak.cpp b/src/mame/handheld/tispeak.cpp deleted file mode 100644 index 667647474f1..00000000000 --- a/src/mame/handheld/tispeak.cpp +++ /dev/null @@ -1,1909 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Jonathan Gevaryahu -// thanks-to:Sean Riddle, David Viens, Kevin Horton -/*************************************************************************** - - ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** - - Texas Instruments 1st-gen. handheld speech devices. - - These devices, mostly edu-toys, are based around an MCU(TMS0270/TMS1100), - TMS51xx speech, and VSM ROM(s). Newer devices, such as Speak & Music, - are based around the TMP50C40 and belong in another driver, probably. - - note: except for tntell, MAME external artwork is not required. But it - is objectively a large improvement. - ----------------------------------------------------------------------------- - -Known devices on this hardware: (* denotes not dumped) - - -ROM (and/or source) code obtained from patents: -Some of these may have pre-release bugs. - - Speak & Spell: US4189779 - Speak & Math: US4946391 - Touch & Tell: US4403965, EP0048835A2 (patent calls it "Speak & Seek") - Language Translator: US4631748 - - -Speak & Spell: - -This is the original Speak & Spell. TI had done educational toys before, like -Wiz-A-Tron or Little Professor. But the popularity of this product was much -above expectations. TI continued to manufacture many products for this line. - - Speak & Spell (US), 1978 - - MCU: TMC0271, label TMC0271NL DBS (die label 0271B T0270B) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB TMC0351NL - - VSM(2/2): 16KB TMC0352NL - - VFD: NEC FIP8A5AR no. 3A - - notes: keyboard has buttons instead of cheap membrane - - Speak & Spell (US), 1979 - - MCU: TMC0271, label TMC0271H-N2L FDS (die label 0271H T0270D) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB TMC0351N2L - - VSM(2/2): 16KB TMC0352N2L - - notes: fixed a funny bug with gibberish-talk when Module button is pressed - with no module inserted, MCU ROM contents differs from 1978 version - - Speak & Spell (US), 1980 - - MCU: same as 1979 version - - TMS51xx: TMC0281D - - VSM: 16KB CD2350(rev.A) - - notes: only 1 VSM, meaning much smaller internal vocabulary - - Speak & Spell (Japan), 1980 - - MCU: TMC0271 (assume same as US 1979 version) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2321 - - VSM(2/2): 16KB CD2322 - - notes: no local name for the product, words are in English but very low difficulty - - Speak & Spell (UK), 1978 - - MCU: TMC0271 (assume same as US 1978 version) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2303 - - VSM(2/2): 16KB CD2304 - - notes: voice data was manually altered to give it a UK accent, - here's a small anecdote from developer: - "(...) I cannot bear to listen the product even now. I remember the - word 'butcher' took 3 days - I still don't know if it sounds right." - - Speak & Spell (UK), 1981 - - MCU: TMC0271 (assume same as US 1979 version) - - TMS51xx: CD2801 - - VSM: 16KB CD62175 - - VFD: some seen with the one from Speak & Math(!) - - notes: this one has a dedicated voice actor - - Speak & Spell (Spanish, prototype), 1981 - - MCU: CD2701N2L P (die label T0270D 2701) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2319 - - VSM(2/2): 16KB CD2320 - - VFD: 8 digits with 14 segments, DP and accent mark - - Speak & Spell (France) "La Dictée Magique", 1980 - - MCU: CD2702, label CD2702AN2L (die label TMC0270F 2702A) - - TMS51xx: CD2801 - - VSM: 16KB CD2352 - - Speak & Spell (Germany) "Buddy", 1980 - - MCU & TMS51xx: same as French 1980 version - - VSM(1/2): 16KB CD2345* - - VSM(2/2): 16KB CD2346* - - Speak & Spell (Italy) "Grillo Parlante", 1982 - - MCU & TMS51xx: same as French 1980 version - - VSM: 16KB CD62190 - - VFD: same as Speak & Math - - notes: it appears that TI ran out of original snspell VFDs in the early 80s? - - Speak & Spell Compact (US), 1981 - - MCU: CD8011, label CD8011A-NL (die label 1100B) - - TMS51xx: TMC0281D - - VSM: 16KB CD2354, CD2354(rev.A) - - notes: no display, MCU is TMS1100 instead of TMS0270, overall similar to Touch & Tell - - Speak & Spell Compact (UK) "Speak & Write", 1981 - - MCU: same as US 1981 version - - TMS51xx: CD2801A - - VSM: 16KB CD62174(rev.A) - - notes: BTANB: gibberish when the module button is pressed (with module present), - anecdotes from the developer, the same person working on the original UK version: - "We included a pencil and writing pad - it was now about 'writing'.", - and one about the welcome message: - "I had to manually create a sentence of digital speech from thin air. - I had to write down a 20 character code which would create each 10/s - sound bite that made up the phrase "Welcome to Speak and Write". - It took me 1 week. (...) Even Larry Brantingham was amazed." - -Speak & Spell modules: -Note that they are interchangeable, eg. you can use a French module on a US Speak & Spell. - - English: - - Vowel Power: VSM: 16KB CD2302 - - Number Stumpers 4-6: VSM: 16KB CD2305 - - Number Stumpers 7-8: VSM: 16KB CD2307(rev.A) - - Basic Builders: VSM: 16KB CD2308 - - Mighty Verbs: VSM: 16KB CD2309(rev.B) - - Homonym Heroes: VSM: 16KB CD2310 - - Vowel Ventures: VSM: 16KB CD2347(rev.C) - - Noun Endings: VSM: 16KB CD2348 - - Magnificent Modifiers: VSM: 16KB CD2349 - - E.T. Fantasy: VSM: 16KB CD2360 - - French: - - No.1: Les Mots de Base: VSM: 16KB CD2353 (1st release was called "Module No. 1 de Jacques Capelovici") - - No.2: Les Mots Difficiles (aka Les Mots de Base): VSM: 16KB CD62177A - - No.3: Les Animaux Familiers: VSM: 16KB? CD62047* - - No.4: Les Magasins de la Rue: VSM: 16KB CD62048 - - No.5: Les Extra-Terrestres: VSM: 16KB? CD62178* - - Italian: - - Super Modulo: VSM: 16KB? CD62313* - - -Speak & Math: - - Speak & Math (US), 1980 (renamed to "Speak & Maths" in UK, but is the same product) - - MCU: CD2704, label CD2704B-N2L (die label TMC0270F 2704B) - 2nd revision?(mid-1982) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2392 - - VSM(2/2): 16KB CD2393 - - VFD: Futaba 9SY -02Z 7E - - notes: As with the Speak & Spell, the voice actor was a radio announcer. - However, the phrase "is greater than or less than" had to be added by one - of the TI employees in a hurry, the day before a demo. Apparently QA - never found out and it ended up in the final product. - - Speak & Math (US), 1986 - - MCU: CD2708, label CD2708N2L (die label TMC0270F 2708A) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2381 - - VSM(2/2): 4KB CD2614 - - Speak & Math 'Compact' (France) "Les Maths Magiques", 1986? - - MCU: CP3447-NL* (TMS1100?) - - TMS51xx: CD2801 - - VSM: 16KB? CD62173* - - notes: this is not the same as "Le Calcul Magique", that's from a - series centered around a TMS50C40 instead of MCU+TMS51xx - - -Speak & Read: - - Speak & Read (US), 1980 - - MCU: CD2705, label CD2705B-N2L (die label TMC0270E 2705B) - 2nd revision?(late-1981) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2394(rev.A) - - VSM(2/2): 16KB CD2395(rev.A) - - VFD: same as Language Tutor, rightmost digit unused - -Speak & Read modules: - - English: - - Sea Sights: VSM: 16KB CD2396(rev.A) - - Who's Who at the Zoo: VSM: 16KB CD2397 - - A Dog on a Log: VSM: 16KB CD3534(rev.A) - - The Seal That Could Fly: VSM: 16KB CD3535 - - A Ghost in the House: VSM: 16KB CD3536 - - On the Track: VSM: 16KB CD3538 - - The Third Circle: VSM: 16KB CD3539 - - The Millionth Knight: VSM: 16KB CD3540 - - -Touch & Tell: - - Touch & Tell (US), 1981 - - MCU: CD8012, label CD8012NL (die label 1100G CD8012) - - TMS51xx: CD2802 - - VSM: 4KB CD2610 - - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices - too, maybe an earlier version? - - Touch & Tell (UK), 1981 - - MCU & TMS51xx: same as US version - - VSM: 16KB CD62170 - - Touch & Tell (France) "Le Livre Magique", 1981 - - MCU & TMS51xx: same as US version - - VSM: 16KB CD62171 - - Touch & Tell (Germany) "Tipp & Sprich", 1981 - - MCU & TMS51xx: same as US version - - VSM: ?KB CD62172* - - Touch & Tell (Italy) "Libro Parlante", 1982 - - MCU & TMS51xx: same as US version - - VSM: ?KB CD62176* - - Vocaid (US), 1982 - - MCU & TMS51xx: same as Touch & Tell (US) - - VSM: 16KB CD2357 - - notes: MCU is the same as in Touch & Tell, but instead of a toddler's toy, - you get a serious medical aid device for the voice-impaired. The PCB is - identical, it includes the edge connector for modules but no external slot. - -Touch & Tell modules: - - English: - - Alphabet Fun: VSM: 4KB CD2611 - - Animal Friends: VSM: 16KB CD2355 - - Number Fun: VSM: 4KB CD2612*, CD2612(rev.A) - - All About Me: VSM: 4KB CD2613 - - World of Transportation: VSM: 16KB CD2361 - - Little Creatures: VSM: 16KB CD2362 - - E.T.: VSM: 16KB CD2363 - -Touch & Tell/Vocaid overlay reference: - - tntell CD2610: - - $04: a - Colors - - $01: b - Objects - - $05: c - Shapes - - $09: d - Home Scene - tntelluk CD62170, tntellfr CD62171: - - see tntell - - see numfun(not A) - - see animalfr - - $08: ? - Clown Face - - $0B: ? - Body Parts - vocaid CD2357: - - $1C: 1 - Leisure - - $1E: 2 - Telephone - - $1B: 3 - Bedside - - $1D: 4 - Alphabet - alphabet CD2611: - - $0E: 1a - Alphabet A-M - - $0D: 1b - Alphabet N-Z - - $0C: 1c - Letter Jumble A-M - - $0B: 1d - Letter Jumble N-Z - animalfr CD2355: - - $0A: 2a - Farm Animals - - $0F: 2b - At The Farm - - $0E: 2c - Animal Babies - - $0D: 2d - In The Jungle - numfun CD2612: - - $02/$0A(rev.A): 3a - Numbers 1-10 - - $03/$0F(rev.A): 3b - Numbers 11-30 - - $07/$0D(rev.A): 3c - How Many? - - $06/$0E(rev.A): 3d - Hidden Numbers - aboutme CD2613: - - $0E: 4a - Clown Face - - $0B: 4b - Body Parts - - $0D: 4c - Things to Wear - - $0C: 4d - Just For Me - wot CD2361: - - $0A: 5a - On Land - - $0B: 5b - In The Air - - $0C: 5c - On The Water - - $0D: 5d - In Space - - $10: 5e - What Belongs Here? - - $11: 5f - How It Used To Be - - $12: 5g - Word Fun - - $13: 5h - In the Surprise Garage - lilcreat CD2362: - - $14: 6a - In The Park - - $15: 6b - In The Sea - - $16: 6c - In The Woods - - $17: 6d - Whose House? - - $18: 6e - Hide & Seek - - $1A: 6f - Who Is It? - - $19: 6g - But It's Not - - $1B: 6h - Word Fun - et CD2363: - - $0F: 7a - The Adventure On Earth I - - $10: 7b - The Adventure On Earth II - - $11: 7c - Fun And Friendship I - - $12: 7d - Fun And Friendship II - - $13: 7e - E.T. The Star I - - $14: 7f - E.T. The Star II - - $15: 7g - Do You Remember? I - - $16: 7h - Do You Remember? II - - $00: none inserted, and $1F is for diagnostics - - -Magic Wand "Speaking Reader" or "Speak & Learn": - -Limited release barcode reader text-to-speech device, meant for children. -The text is coded as phonemes. Books were sold separately. - - Magic Wand "Speaking Reader" (US), 1982 - - MCU: C14007* (TMS1400?) - - TMS5220 - - VSM: 4KB? CD2228* - - Magic Wand "Speak & Learn" (US), 1983 - - notes: same hardware - - -Language Tutor/Translator: - -A later device, called Language Teacher, was released without speech hardware. - - Language Tutor (US), 1978 - - MCU: TMC0275* - - TMS51xx: CD2801 - - VFD: NEC FIP10xxx? - - notes: external module is required (see below) - -Language Tutor modules: - - - Ingles(1/4): VSM: 16KB CD2311 - - Ingles(2/4): VSM: 16KB CD2312 - - Ingles(3/4): VSM: 16KB CD2313 - - Ingles(4/4): VSM: 16KB CD2314 - - - Spanish(1/4): VSM: 16KB CD2315 - - Spanish(2/4): VSM: 16KB CD2316 - - Spanish(3/4): VSM: 16KB CD2317 - - Spanish(4/4): VSM: 16KB CD2318 - - - French(1/4): VSM: 16KB CD2327 - - French(2/4): VSM: 16KB CD2328 - - French(3/4): VSM: 16KB CD2329 - - French(4/4): VSM: 16KB CD2330 - - - German(1/4): VSM: 16KB CD2331 - - German(2/4): VSM: 16KB CD2332 - - German(3/4): VSM: 16KB CD2333 - - German(4/4): VSM: 16KB CD2334 - - - English(1/4): VSM: 16KB CD3526 - - English(2/4): VSM: 16KB CD3527 - - English(3/4): VSM: 16KB CD3528 - - English(4/4): VSM: 16KB CD3529 - - -Other manufacturers: - -Tiger Electronics K28 (model 7-232) Sold in Hong Kong, distributed in US as: -- Coleco: Talking Teacher -- Sears: Talkatron - Learning Computer - -1981 K28 models 7-230 and 7-231 are on different hardware, showing a different -keyboard, VFD display, and use the SC-01 speech chip. --> driver k28.cpp - - K28 model 7-232 (HK), 1985 - - MCU: TMS1400 MP7324 - - TMS51xx: TMS5110A - - VSM: 16KB CM62084 - - LCD: SMOS SMC1112 MCU to 8*14-seg display - -K28 modules: - - - Spelling I: VSM: 16KB CM62086 - - Spelling II: VSM: 16KB CM62085? - - Spelling III: VSM: 16KB CM62087 - - Expansion Module 1: VSM: 16KB CM62214? - assumed same VSM as CM62086 - - Expansion Module 2: VSM: 16KB CM62216 - assumed same VSM as the one in Spelling II - - Expansion Module 3: VSM: 16KB CM62215 - same VSM as CM62087 - - Expansion Module 4: VSM: 16KB CM62217 - - Expansion Module 5: VSM: 16KB CM62218* - - Expansion Module 6: VSM: 16KB CM62219 - - note: these won't work on the 1981 version(s) - ----------------------------------------------------------------------------- - - TODO: - - why doesn't lantutor work? - - emulate k28 LCD - - emulate other known devices - - -Dick Smith catalog numbers, taken from advertisements: - -X-1300, Y-1300 : T.I. Speak & Spell -X-1301 : Super Stumper 1 (for Speak & Spell) -X-1302 : Super Stumper 2 (for Speak & Spell) -X-1305 : Vowell Power (for Speak & Spell) -Y-1310 : T.I. Speak & Math -Y-1313 : T.I. Speak & Read -Y-1320 : T.I. Dataman - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" -#include "machine/timer.h" -#include "machine/tms6100.h" -#include "sound/tms5110.h" -#include "softlist_dev.h" -#include "speaker.h" -#include "render.h" - -// internal artwork -#include "k28m2.lh" -#include "snmath.lh" -#include "snread.lh" -#include "snspell.lh" -#include "snspellsp.lh" -#include "tntell.lh" // keyboard overlay - -namespace { - -// The master clock is a single stage RC oscillator into TMS5100 RCOSC: -// In an early 1979 Speak & Spell, C is 68pf, R is a 50kohm trimpot which is set to around 33.6kohm -// (measured in-circuit). CPUCLK is this osc freq /2, ROMCLK is this osc freq /4. -// The typical osc freq curve for TMS5100 is unknown. Let's assume it is set to the default frequency, -// which is 640kHz for 8KHz according to the TMS5100 documentation. - -#define MASTER_CLOCK 640000 - - -class tispeak_state : public hh_tms1k_state -{ -public: - tispeak_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_tms5100(*this, "tms5100"), - m_tms6100(*this, "tms6100"), - m_cart(*this, "cartslot"), - m_ol_out(*this, "ol%u", 1U) - { } - - void init_snspell(); - void init_tntell(); - void init_lantutor(); - - // machine configs - void tms5110_route(machine_config &config); - void sns_tmc0281(machine_config &config); - void sns_tmc0281d(machine_config &config); - void sns_cd2801(machine_config &config); - void snspellit(machine_config &config); - void snspellsp(machine_config &config); - void snspellc(machine_config &config); - void snspellcuk(machine_config &config); - void snmath(machine_config &config); - void snread(machine_config &config); - void tntell(machine_config &config); - void vocaid(machine_config &config); - void lantutor(machine_config &config); - void k28m2(machine_config &config); - -private: - virtual void power_off() override; - void update_display(); - - u8 snspell_read_k(); - void snmath_write_o(u16 data); - void snspell_write_o(u16 data); - void snspell_write_r(u16 data); - void lantutor_write_r(u16 data); - - u8 snspellc_read_k(); - void snspellc_write_o(u16 data); - void snspellc_write_r(u16 data); - u8 tntell_read_k(); - - void k28_update_display(u8 old, u8 data); - u8 k28_read_k(); - void k28_write_o(u16 data); - void k28_write_r(u16 data); - - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - - u8 tntell_get_hexchar(const char c); - TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay); - - void init_cartridge(); - - virtual void machine_start() override; - - // devices - required_device m_tms5100; - required_device m_tms6100; - optional_device m_cart; - - output_finder<5> m_ol_out; - - // cartridge - u32 m_cart_max_size = 0; - u8 *m_cart_base = nullptr; - - u8 m_overlay = 0; -}; - -void tispeak_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - m_ol_out.resolve(); - init_cartridge(); -} - - - -/*************************************************************************** - - Cartridge Handling - -***************************************************************************/ - -void tispeak_state::init_cartridge() -{ - if (m_cart != nullptr && m_cart->exists()) - { - std::string region_tag; - memory_region *src = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - if (src) - memcpy(m_cart_base, src->base(), src->bytes()); - } -} - -DEVICE_IMAGE_LOAD_MEMBER(tispeak_state::cart_load) -{ - u32 size = m_cart->common_get_size("rom"); - - if (size > m_cart_max_size) - { - image.seterror(image_error::INVALIDIMAGE, "Invalid file size"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); - - return image_init_result::PASS; -} - - -void tispeak_state::init_snspell() -{ - m_cart_max_size = 0x4000; - m_cart_base = memregion("tms6100")->base() + 0x8000; -} - -void tispeak_state::init_tntell() -{ - m_cart_max_size = 0x4000; - m_cart_base = memregion("tms6100")->base() + 0x4000; -} - -void tispeak_state::init_lantutor() -{ - m_cart_max_size = 0x10000; - m_cart_base = memregion("tms6100")->base(); -} - - - -/*************************************************************************** - - I/O - -***************************************************************************/ - -// common/snspell - -void tispeak_state::power_off() -{ - hh_tms1k_state::power_off(); - m_tms5100->reset(); -} - -void tispeak_state::update_display() -{ - u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; - m_display->matrix(m_grid & gridmask, m_plate); -} - -void tispeak_state::snspell_write_r(u16 data) -{ - // R13: power-off request, on falling edge - if (~data & m_r & 0x2000) - power_off(); - - // R0-R7: input mux and select digit (+R8 if the device has 9 digits) - // R15: filament on - // other bits: MCU internal use - m_r = m_inp_mux = data; - m_grid = data & 0x81ff; - update_display(); -} - -void tispeak_state::snspell_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and AP as d15: - // note: lantutor and snread VFD has an accent triangle instead of DP, and no AP - // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK) - m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); - update_display(); -} - -u8 tispeak_state::snspell_read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[8]->read() | read_inputs(8); -} - - -// snmath specific - -void tispeak_state::snmath_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and CT as d15: - // [DP],D,C,H,F,B,I,M,L,K,N,J,[CT],E,G,A (sidenote: TI KLMN = MAME MLNK) - m_plate = bitswap<16>(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15); - update_display(); -} - - -// lantutor specific - -void tispeak_state::lantutor_write_r(u16 data) -{ - // same as default, except R13 is used for an extra digit - m_r = m_inp_mux = data; - m_grid = data & 0xa1ff; - update_display(); -} - - -// snspellc specific - -void tispeak_state::snspellc_write_r(u16 data) -{ - // R10: TMS5100 PDC pin - m_tms5100->pdc_w(data >> 10 & 1); - - // R9: power-off request, on falling edge - if (~data & m_r & 0x200) - power_off(); - - // R0-R8: input mux - m_r = m_inp_mux = data; -} - -void tispeak_state::snspellc_write_o(u16 data) -{ - // O3210: TMS5100 CTL8124 - m_tms5100->ctl_w(bitswap<4>(data,3,0,1,2)); - m_o = data; -} - -u8 tispeak_state::snspellc_read_k() -{ - // K4: TMS5100 CTL1 - u8 k4 = m_tms5100->ctl_r() << 2 & 4; - - // K: multiplexed inputs (note: the Vss row is always on) - return k4 | m_inputs[9]->read() | read_inputs(9); -} - - -// tntell specific - -u8 tispeak_state::tntell_read_k() -{ - // K8: overlay code from R5,O4-O7 - u8 k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0; - - // rest is same as snpellc - return k8 | snspellc_read_k(); -} - -u8 tispeak_state::tntell_get_hexchar(const char c) -{ - if (c >= '0' && c <= '9') return c - '0'; - if (c >= 'A' && c <= 'F') return c - 'A' + 10; - if (c >= 'a' && c <= 'f') return c - 'a' + 10; - - return 0; -} - -TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) -{ - // Each keyboard overlay insert has 5 holes, used by the game to determine - // which one is active(if any). If it matches with the internal ROM or - // external module, the game continues. - - // pick overlay code from machine config, see comment section above for reference - m_overlay = m_inputs[10]->read(); - - // try to get it from (external) layout - if (m_overlay == 0x20) - { - // as output value, eg. with defstate (in decimal) - m_overlay = output().get_value("overlay_code") & 0x1f; - - // and from current view name ($ + 2 hex digits) - render_target *target = machine().render().first_target(); - const char *name = target->view_name(target->view()); - - for (int i = 0; name && i < strlen(name); i++) - if (name[i] == '$' && strlen(&name[i]) > 2) - m_overlay = (tntell_get_hexchar(name[i + 1]) << 4 | tntell_get_hexchar(name[i + 2])) & 0x1f; - } - - // overlay holes - for (int i = 0; i < 5; i++) - m_ol_out[i] = BIT(m_overlay, i); -} - - -// k28 specific - -void tispeak_state::k28_update_display(u8 old, u8 data) -{ - // ? -} - -void tispeak_state::k28_write_r(u16 data) -{ - // R1234: TMS5100 CTL8421 - u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f); - m_tms5100->ctl_w(r & 0xf); - - // R0: TMS5100 PDC pin - m_tms5100->pdc_w(data & 1); - - // R5: input mux high bit - m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100); - - // R6: power-off request, on falling edge - if (~data & m_r & 0x40) - power_off(); - - // R7-R10: LCD data - k28_update_display(m_r >> 7 & 0xf, data >> 7 & 0xf); - m_r = r; -} - -void tispeak_state::k28_write_o(u16 data) -{ - // O0-O7: input mux low - m_inp_mux = (m_inp_mux & ~0xff) | data; -} - -u8 tispeak_state::k28_read_k() -{ - // K: TMS5100 CTL, multiplexed inputs (also tied to R1234) - return m_tms5100->ctl_r() | read_inputs(9) | (m_r & 0xf); -} - - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - -static INPUT_PORTS_START( snspell ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module Select") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue") - - PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mystery Word") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellfr ) // French button names - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Efface") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Essaie") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME(u8"Arrét") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME(u8"Départ") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Rejoue") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repete") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aide") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mot Mystere") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Code Secret") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Lettre") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Dis-le") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellit ) // Italian button names - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Moduli") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Cancella") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Controllo") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Stop") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Via") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Ritorno") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Replica") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aiuto") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Indovina") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Codice") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Alfabeto") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Ripeti") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabet - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("CH") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("LL") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME(u8"Ñ") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("RR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Entra") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_NAME("Acento") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Listo") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Programa") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Borra") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Repite") - - PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Otra Vez") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Palabra Secreta") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Dilo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - - -static INPUT_PORTS_START( snmath ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("<") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME(">") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Repeat") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Mix It") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Number Stumper") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - - PORT_START("IN.7") - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.8") - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( snread ) - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Word Zapper") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Word Maker") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Read It") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Picture Read") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter Stumper") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Hear It") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - - -static INPUT_PORTS_START( lantutor ) - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Diacritical") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Space") - - PORT_MODIFY("IN.6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Translate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Learn") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Phrase") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Link") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Repeat") -INPUT_PORTS_END - - -static INPUT_PORTS_START( snspellc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Stumper") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Review") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - - PORT_START("IN.9") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellcuk ) - PORT_INCLUDE( snspellc ) - - PORT_MODIFY("IN.9") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) // just the label changed from Spell to Write -INPUT_PORTS_END - - -static INPUT_PORTS_START( tntell ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Grid 1-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Grid 1-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Grid 1-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Grid 1-3") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 2-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 2-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 2-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 2-3") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 3-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 3-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 3-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 3-3") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Grid 4-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 4-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 4-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 4-3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 5-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 5-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 5-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 5-3") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 5-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Grid 6-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 5-5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // overlay code - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 3-5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 2-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 4-5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Grid 1-5") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 3-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 2-6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Grid 4-6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Grid 1-6") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Grid 6-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Grid 6-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Grid 6-3") - - PORT_START("IN.9") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.10") - PORT_CONFNAME( 0x3f, 0x20, "Overlay Code" ) - PORT_CONFSETTING( 0x20, "From Artwork View" ) - PORT_CONFSETTING( 0x00, "$00 (None)" ) - PORT_CONFSETTING( 0x01, "$01" ) - PORT_CONFSETTING( 0x02, "$02" ) - PORT_CONFSETTING( 0x03, "$03" ) - PORT_CONFSETTING( 0x04, "$04" ) - PORT_CONFSETTING( 0x05, "$05" ) - PORT_CONFSETTING( 0x06, "$06" ) - PORT_CONFSETTING( 0x07, "$07" ) - PORT_CONFSETTING( 0x08, "$08" ) - PORT_CONFSETTING( 0x09, "$09" ) - PORT_CONFSETTING( 0x0a, "$0A" ) - PORT_CONFSETTING( 0x0b, "$0B" ) - PORT_CONFSETTING( 0x0c, "$0C" ) - PORT_CONFSETTING( 0x0d, "$0D" ) - PORT_CONFSETTING( 0x0e, "$0E" ) - PORT_CONFSETTING( 0x0f, "$0F" ) - PORT_CONFSETTING( 0x10, "$10" ) - PORT_CONFSETTING( 0x11, "$11" ) - PORT_CONFSETTING( 0x12, "$12" ) - PORT_CONFSETTING( 0x13, "$13" ) - PORT_CONFSETTING( 0x14, "$14" ) - PORT_CONFSETTING( 0x15, "$15" ) - PORT_CONFSETTING( 0x16, "$16" ) - PORT_CONFSETTING( 0x17, "$17" ) - PORT_CONFSETTING( 0x18, "$18" ) - PORT_CONFSETTING( 0x19, "$19" ) - PORT_CONFSETTING( 0x1a, "$1A" ) - PORT_CONFSETTING( 0x1b, "$1B" ) - PORT_CONFSETTING( 0x1c, "$1C" ) - PORT_CONFSETTING( 0x1d, "$1D" ) - PORT_CONFSETTING( 0x1e, "$1E" ) - PORT_CONFSETTING( 0x1f, "$1F (Diagnostic)" ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( k28m2 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A/1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J/0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Repeat") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C/3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('L') PORT_NAME("L/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Prompt") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D/4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('M') PORT_NAME(u8"M/×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E/5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('N') PORT_NAME(u8"N/÷") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("Module") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F/6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G/7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.7") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.8") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I/9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") -INPUT_PORTS_END - - - -/*************************************************************************** - - Machine Config - -***************************************************************************/ - -void tispeak_state::tms5110_route(machine_config &config) -{ - // sound hardware - m_tms5100->m0().set(m_tms6100, FUNC(tms6100_device::m0_w)); - m_tms5100->m1().set(m_tms6100, FUNC(tms6100_device::m1_w)); - m_tms5100->addr().set(m_tms6100, FUNC(tms6100_device::add_w)); - m_tms5100->data().set(m_tms6100, FUNC(tms6100_device::data_line_r)); - m_tms5100->romclk().set(m_tms6100, FUNC(tms6100_device::clk_w)); - m_tms5100->add_route(ALL_OUTPUTS, "mono", 0.5); -} - -void tispeak_state::snmath(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r)); - - m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r)); - m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w)); - m_maincpu->write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0x21ff, 0x3fff); - config.set_default_layout(layout_snmath); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - CD2801(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - - -void tispeak_state::sns_cd2801(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - - config.set_default_layout(layout_snspell); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snspell"); -} - -void tispeak_state::snspellit(machine_config &config) -{ - sns_cd2801(config); - - // basic machine hardware - config.set_default_layout(layout_snmath); -} - -void tispeak_state::sns_tmc0281(machine_config &config) -{ - sns_cd2801(config); - - // sound hardware - TMC0281(config.replace(), m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - -void tispeak_state::snspellsp(machine_config &config) -{ - sns_tmc0281(config); - - // basic machine hardware - config.set_default_layout(layout_snspellsp); -} - -void tispeak_state::sns_tmc0281d(machine_config &config) -{ - sns_cd2801(config); - - // sound hardware - TMC0281D(config.replace(), m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - - -void tispeak_state::snread(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - - config.set_default_layout(layout_snread); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snread", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snread"); -} - - -void tispeak_state::lantutor(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::lantutor_write_r)); - - config.set_default_layout(layout_snread); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "lantutor", "vsm,bin"); - m_cart->set_must_be_loaded(true); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("lantutor"); -} - - -void tispeak_state::snspellc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::snspellc_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); - - // no visual feedback! - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - TMC0281D(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snspell"); -} - -void tispeak_state::snspellcuk(machine_config &config) -{ - snspellc(config); - - // sound hardware - CD2801(config.replace(), m_tms5100, MASTER_CLOCK); // CD2801A! - tms5110_route(config); -} - - -void tispeak_state::vocaid(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::tntell_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); - - TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50)); - config.set_default_layout(layout_tntell); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - CD2802(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - -void tispeak_state::tntell(machine_config &config) -{ - vocaid(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tntell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("tntell"); -} - - -void tispeak_state::k28m2(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::k28_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::k28_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::k28_write_r)); - - config.set_default_layout(layout_k28m2); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - TMS5110A(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "k28m2", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("k28m2"); -} - - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( snspell ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351n2l.vsm", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) - ROM_LOAD( "tmc0352n2l.vsm", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) -ROM_END - -ROM_START( snspellp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "us4189779_tmc0271", 0x0000, 0x1000, CRC(d3f5a37d) SHA1(f75ab617a6067d4d3a954a9f86126d2089554df8) ) // typed in from patent US4189779, verified by 2 sources - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " -ROM_END - -ROM_START( snspellua ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) -ROM_END - -ROM_START( snspellub ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2350a.vsm", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) -ROM_END - -ROM_START( snspelluk ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2303.vsm", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) - ROM_LOAD( "cd2304.vsm", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) -ROM_END - -ROM_START( snspelluka ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62175.vsm", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) -ROM_END - -ROM_START( snspelljp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2321.vsm", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) - ROM_LOAD( "cd2322.vsm", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) -ROM_END - -ROM_START( snspellsp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2701n2l_p", 0x0000, 0x1000, CRC(5230612a) SHA1(3ec75b207380af2efe84e865fe83ea29e79e8eea) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2701_output.pla", 0, 1246, CRC(f26980bd) SHA1(8d0c98fe5240541cb53c1e1d14c2a4560e7a7f32) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2319.vsm", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) - ROM_LOAD( "cd2320.vsm", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) -ROM_END - -ROM_START( snspellfr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) -ROM_END - -ROM_START( snspellit ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) -ROM_END - - -ROM_START( snspellc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354.vsm", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) -ROM_END - -ROM_START( snspellca ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354a.vsm", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) -ROM_END - -ROM_START( snspellcuk ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62174a.vsm", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) -ROM_END - - -ROM_START( snmath ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2704b-n2l", 0x0000, 0x1000, CRC(7e06c7c5) SHA1(d60a35a8163ab593c31afc840a0d8a9b3a762f29) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) -ROM_END - -ROM_START( snmatha ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2708-n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2381.vsm", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) - ROM_LOAD( "cd2614.vsm", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) - ROM_RELOAD( 0x5000, 0x1000 ) - ROM_RELOAD( 0x6000, 0x1000 ) - ROM_RELOAD( 0x7000, 0x1000 ) -ROM_END - -ROM_START( snmathp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - // typed in from patent 4946391, verified with source code - // BTANB note: Mix It does not work at all, this is an original bug in the patent listing. There are probably other minor bugs too. - ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " -ROM_END - - -ROM_START( snread ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2705b-n2l", 0x0000, 0x1000, CRC(c235636e) SHA1(57b24dd8414bf76ec786a51d10cb8a5898b60e18) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2705_output.pla", 0, 1246, CRC(bf859848) SHA1(66b297fbf534968fa6db7413b99ef0e81cc35ddc) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2394a.vsm", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) - ROM_LOAD( "cd2395a.vsm", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) -ROM_END - - -ROM_START( lantutor ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "us4631748_tmc0275", 0x0000, 0x1000, CRC(22818845) SHA1(1a84f15fb18ca66b1f2bf7491d76fbc56068984d) ) // extracted visually from patent US4631748, verified with source code - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // not verified - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, BAD_DUMP CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // taken from snspell, mostly looks correct - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // cartridge area -ROM_END - - -ROM_START( tntell ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) -ROM_END - -ROM_START( tntelluk ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62170.vsm", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) -ROM_END - -ROM_START( tntellfr ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62171.vsm", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) -ROM_END - -ROM_START( tntellp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "us4403965_cd1100", 0x0000, 0x0800, BAD_DUMP CRC(863a1c9e) SHA1(f2f9eb0ae17eedd4ef2b887b34601e75b4f6c720) ) // typed in from patent US4403965/EP0048835A2, may have errors - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) // from cd8012, matches patent source code - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_us4403965_output.pla", 0, 365, CRC(66cfb3c3) SHA1(80a05e5d729518e1f35d8f26438f56e80ffbd003) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) -ROM_END - - -ROM_START( vocaid ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // same hw as tntell, but no external slot - ROM_LOAD( "cd2357.vsm", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) -ROM_END - - -ROM_START( k28m2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(08d15ab6) SHA1(5b0f6c53e6732a362c4bb25d966d4072fdd33db8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge - ROM_LOAD( "cm62084.vsm", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) -ROM_END - -} // anonymous namespace - - - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1979, snspell, 0, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspellp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snspellub, snspell, 0, sns_tmc0281d, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspellua, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspelluk, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1981, snspelluka, snspell, 0, sns_cd2801, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1979, snspelljp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1981, snspellsp, snspell, 0, snspellsp, snspellsp, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Spanish, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snspellfr, snspell, 0, sns_cd2801, snspellfr, tispeak_state, init_snspell, "Texas Instruments", u8"La Dictée Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellit, snspell, 0, snspellit, snspellit, tispeak_state, init_snspell, "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1981, snspellc, 0, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellca, snspellc, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellcuk, snspellc, 0, snspellcuk, snspellcuk, tispeak_state, init_snspell, "Texas Instruments", "Speak & Write (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1980, snmath, 0, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1986, snmatha, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snmathp, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IS_INCOMPLETE ) - -COMP( 1980, snread, 0, 0, snread, snread, tispeak_state, init_snspell, "Texas Instruments", "Speak & Read (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, init_lantutor, "Texas Instruments", "Language Tutor (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) - -COMP( 1981, tntell, 0, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -COMP( 1980, tntellp, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -COMP( 1981, tntelluk, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -COMP( 1981, tntellfr, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1982, vocaid, 0, 0, vocaid, tntell, tispeak_state, empty_init, "Texas Instruments", "Vocaid", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1985, k28m2, 0, 0, k28m2, k28m2, tispeak_state, init_snspell, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/handheld/tispellb.cpp b/src/mame/handheld/tispellb.cpp deleted file mode 100644 index 3826fcae96c..00000000000 --- a/src/mame/handheld/tispellb.cpp +++ /dev/null @@ -1,452 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - - ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** - - Texas Instruments Spelling B hardware - - The Spelling B was introduced together with the Speak & Spell. It is a - handheld educational toy with booklet. Two revisions of the hardware exist. - (* indicates not dumped) - - 1st revision: - - Spelling B (US), 1978 - - TMS0270 MCU TMC0272 (die label 0272A T0270B) - - TMS1980 MCU TMC1984 (die label 1980A 84A) - - 8-digit cyan VFD display (seen with and without apostrophe) - - Spelling ABC (UK), 1979: exact same hardware as US version - - 2nd revision: - - Spelling B (US), 1979 - - TMS0270 MCU TMC0274 - - TMC0355 4KB VSM ROM CD2602 - - 8-digit cyan VFD display - - 1-bit sound (indicated by a music note symbol on the top-right of the casing) - - note: much rarer than the 1978 version, not much luck finding one on eBay - - Spelling ABC (UK), 1979: exact same hardware as US version - - Spelling ABC (Germany), 1979: different VSM - - TMC0355 4KB VSM ROM CD2607* - - Mr. Challenger (US), 1979 - - TMS0270 MCU TMC0273 - - TMC0355 4KB VSM ROM CD2601 - - 8-digit cyan VFD display - - 1-bit sound - - Letterlogic (UK), 1980: exact same hardware as US Mr. Challenger - - Letterlogic (France), 1980: different VSM - - TMC0355 4KB VSM ROM CD2603* - - Letterlogic (Germany), 1980: different VSM - - TMC0355 4KB VSM ROM CD2604* - - ----------------------------------------------------------------------------- - - TODO: - - spellb fetches wrong word sometimes (on lv1 SPOON and ANT) - roms were doublechecked - - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "machine/tms6100.h" -#include "speaker.h" - -// internal artwork -#include "spellb.lh" - - -class tispellb_state : public hh_tms1k_state -{ -public: - tispellb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_subcpu(*this, "subcpu"), - m_tms6100(*this, "tms6100") - { } - - void rev1(machine_config &config); - void rev2(machine_config &config); - - virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override; - -private: - // devices - optional_device m_subcpu; - optional_device m_tms6100; - - u8 m_rev1_ctl = 0; - u16 m_sub_o = 0; - u16 m_sub_r = 0; - - virtual void power_off() override; - void power_subcpu(); - void update_display(); - - u8 main_read_k(); - void main_write_o(u16 data); - void main_write_r(u16 data); - - u8 rev1_ctl_r(); - void rev1_ctl_w(u8 data); - u8 sub_read_k(); - void sub_write_o(u16 data); - void sub_write_r(u16 data); - - void rev2_write_o(u16 data); - void rev2_write_r(u16 data); - - virtual void machine_start() override; -}; - -void tispellb_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_rev1_ctl)); - save_item(NAME(m_sub_o)); - save_item(NAME(m_sub_r)); -} - - - -/*************************************************************************** - - I/O - -***************************************************************************/ - -// common - -void tispellb_state::power_subcpu() -{ - if (m_subcpu) - m_subcpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); -} - -void tispellb_state::power_off() -{ - hh_tms1k_state::power_off(); - power_subcpu(); -} - -void tispellb_state::update_display() -{ - // almost same as snspell - u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; - m_display->matrix(m_grid & gridmask, m_plate); -} - -void tispellb_state::main_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and AP as d15, same as snspell - m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); - update_display(); -} - -void tispellb_state::main_write_r(u16 data) -{ - // R13: power-off request, on falling edge - if (~data & m_r & 0x2000) - power_off(); - - // R0-R6: input mux - // R0-R7: select digit - // R15: filament on - m_r = data; - m_inp_mux = data & 0x7f; - m_grid = data & 0x80ff; - update_display(); -} - -u8 tispellb_state::main_read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[7]->read() | read_inputs(7); -} - - -// 1st revision mcu/mcu comms - -void tispellb_state::rev1_ctl_w(u8 data) -{ - // main CTL write data - m_rev1_ctl = data & 0xf; -} - -u8 tispellb_state::sub_read_k() -{ - // sub K8421 <- main CTL3210 - return m_rev1_ctl; -} - -void tispellb_state::sub_write_o(u16 data) -{ - // sub O write data - m_sub_o = data; -} - -u8 tispellb_state::rev1_ctl_r() -{ - // main CTL3210 <- sub O6043 - return bitswap<4>(m_sub_o,6,0,4,3); -} - -void tispellb_state::sub_write_r(u16 data) -{ - // sub R: unused? - m_sub_r = data; -} - - -// 2nd revision specifics - -void tispellb_state::rev2_write_o(u16 data) -{ - // SEG DP: speaker out - m_speaker->level_w(data >> 15 & 1); - - // SEG DP and SEG AP are not connected to VFD, rest is same as rev1 - main_write_o(data & 0x6fff); -} - -void tispellb_state::rev2_write_r(u16 data) -{ - // R12: TMC0355 CS - // R4: TMC0355 M1 - // R6: TMC0355 M0 - m_tms6100->cs_w(data >> 12 & 1); - m_tms6100->m1_w(data >> 4 & 1); - m_tms6100->m0_w(data >> 6 & 1); - m_tms6100->clk_w(1); - m_tms6100->clk_w(0); - - // rest is same as rev1 - main_write_r(data); -} - - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - -INPUT_CHANGED_MEMBER(tispellb_state::power_button) -{ - hh_tms1k_state::power_button(field, param, oldval, newval); - power_subcpu(); -} - -static INPUT_PORTS_START( spellb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Memory") PORT_CHAR('=') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Clue") PORT_CHAR('-') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") PORT_CHAR(8) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") PORT_CHAR(13) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") PORT_CHAR('7') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Level") PORT_CHAR('/') - - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter") PORT_CHAR('3') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word") PORT_CHAR('4') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble") PORT_CHAR('5') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With") PORT_CHAR('2') -INPUT_PORTS_END - - -static INPUT_PORTS_START( mrchalgr ) - PORT_INCLUDE( spellb ) // same key layout as spellb - - PORT_MODIFY("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("2nd Player") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Score") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Crazy Letters") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Guesser") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Word Challenge") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") -INPUT_PORTS_END - - - -/*************************************************************************** - - Machine Config - -***************************************************************************/ - -void tispellb_state::rev1(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); - m_maincpu->o().set(FUNC(tispellb_state::main_write_o)); - m_maincpu->r().set(FUNC(tispellb_state::main_write_r)); - m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r)); - m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w)); - - TMS1980(config, m_subcpu, 350000); // approximation - m_subcpu->k().set(FUNC(tispellb_state::sub_read_k)); - m_subcpu->o().set(FUNC(tispellb_state::sub_write_o)); - m_subcpu->r().set(FUNC(tispellb_state::sub_write_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_spellb); - - // no sound! -} - - -void tispellb_state::rev2(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); - m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o)); - m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r)); - m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r)); - m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w)); - - TMS6100(config, m_tms6100, 350000); - m_tms6100->enable_4bit_mode(true); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_spellb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( spellb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0272nl", 0x0000, 0x1000, CRC(f90318ff) SHA1(7cff03fafbc66b0e07b3c70a513fbb0b11eef4ea) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(3e021cbd) SHA1(c9bdfe10601b8a5a70442fe4805e4bfed8bbed35) ) - - ROM_REGION( 0x1000, "subcpu", 0 ) - ROM_LOAD( "tmc1984nl", 0x0000, 0x1000, CRC(78c9c83a) SHA1(6307fe2a0228fd1b8d308fcaae1b8e856d40fe57) ) - - ROM_REGION( 1246, "subcpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "subcpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "subcpu:opla", 0 ) - ROM_LOAD( "tms1980_spellb_output.pla", 0, 525, CRC(1e26a719) SHA1(eb031aa216fe865bc9e40b070ca5de2b1509f13b) ) -ROM_END - -ROM_START( spellb79 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0274n2l", 0x0000, 0x1000, CRC(98e3bd32) SHA1(e79b59ac29b0183bf1ee8d84b2944450c5e5d8fb) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_spellb79_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) - - ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2602.vsm", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) -ROM_END - - -ROM_START( mrchalgr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0273nll", 0x0000, 0x1000, CRC(ef6d23bd) SHA1(194e3b022c299e99a731bbcfba5bf8a3a9f0d07e) ) // matches patent US4421487 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) - - ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2601.vsm", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) -ROM_END - - - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1978, spellb, 0, 0, rev1, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1979, spellb79, spellb, 0, rev2, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1979 version)", MACHINE_SUPPORTS_SAVE ) - -COMP( 1979, mrchalgr, 0, 0, rev2, mrchalgr, tispellb_state, empty_init, "Texas Instruments", "Mr. Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 2772b22f690..92826a0549a 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -16482,7 +16482,7 @@ heromem // E34 (c) 1997 Taito hexion // GX122 (c) 1992 hexionb // bootleg -@source:handheld/hh_cop400.cpp +@source:misc_handheld/hh_cop400.cpp bship82 // Milton Bradley copspa // National Semiconductor ctstein // Castle Toy @@ -16505,7 +16505,7 @@ solution // SCAT unkeinv // Gordon Barlow Design vidchal // Select Merchandise -@source:handheld/hh_cops1.cpp +@source:misc_handheld/hh_cops1.cpp cambrp // Sinclair mbaskb // Mattel mhockey // Mattel @@ -16514,7 +16514,7 @@ msoccer // Mattel qkracerm // National Semiconductor qkspeller // National Semiconductor -@source:handheld/hh_hmcs40.cpp +@source:misc_handheld/hh_hmcs40.cpp alnattck // Coleco bambball // Bambino bbtime // Bandai @@ -16557,11 +16557,11 @@ vinvader // VTech wantgman // Actronics / Hanzawa zackman // Bandai -@source:handheld/hh_melps4.cpp +@source:misc_handheld/hh_melps4.cpp cfrogger // Coleco gjungler // Gakken -@source:handheld/hh_pic16.cpp +@source:misc_handheld/hh_pic16.cpp drdunk // Kmart flash // Ideal hccbaskb // Tiger Electronics @@ -16577,7 +16577,7 @@ ttfballa // Toytronic us2pfball // US Games uspbball // US Games -@source:handheld/hh_pps41.cpp +@source:misc_handheld/hh_pps41.cpp brainbaf // Mattel dunksunk // Kmart ftri1 // Fonas @@ -16590,7 +16590,7 @@ rdqa // Selchow & Righter scrabsen // Selchow & Righter smastmind // Invicta -@source:handheld/hh_rw5000.cpp +@source:misc_handheld/hh_rw5000.cpp autorace // Mattel gravity // Mattel mbaseb // Mattel @@ -16603,7 +16603,7 @@ rw24k // Rockwell rw30r // Rockwell rw31r // Rockwell -@source:handheld/hh_sm510.cpp +@source:misc_handheld/hh_sm510.cpp atakaast // Elektronika auslalom // Elektronika bassmate // Telko @@ -16753,7 +16753,7 @@ txmenpx // Tiger vespovar // Elektronika vfutbol // Elektronika -@source:handheld/hh_tms1k.cpp +@source:misc_handheld/hh_tms1k.cpp alphie // Playskool arcmania // Milton Bradley arrball // A-One LSI @@ -16862,7 +16862,7 @@ wizatron // Texas Instruments xl25 // Vulcan zodiac // Coleco -@source:handheld/hh_ucom4.cpp +@source:misc_handheld/hh_ucom4.cpp alnchase // Tomy astrocmd // Epoch bcclimbr // Bandai @@ -24273,7 +24273,7 @@ rs70_648 // @source:skeleton/monon_color.cpp mononcol // (c) 2011 M&D -@source:ritam/monty.cpp +@source:misc_handheld/monty.cpp mmonty // Ritam monty // Ritam @@ -37016,7 +37016,7 @@ rx78 // @source:casio/rz1.cpp rz1 // 1986 Casio -@source:handheld/rzone.cpp +@source:misc_handheld/rzone.cpp rzbatfor // rzindy500 // rztoshden // @@ -37658,7 +37658,7 @@ scorpio // @source:konami/scotrsht.cpp scotrsht // GX545 (c) 1985 -@source:selchow/scrablex.cpp +@source:misc_handheld/scrablex.cpp scrablex // Selchow & Righter @source:galaxian/scramble.cpp @@ -41201,10 +41201,10 @@ taitotz // @source:taito/taitowlf.cpp pf2012 // E59 (c) 1997 Taito -@source:parker/talkingbb.cpp +@source:misc_handheld/talkingbb.cpp talkingbb -@source:parker/talkingfb.cpp +@source:misc_handheld/talkingfb.cpp talkingfb @source:bandai/tamag1.cpp @@ -41682,7 +41682,7 @@ tc2048 // 198? TC2048 ts2068 // 1983 TS2068 uk2086 // 1986 UK2086 -@source:handheld/tispeak.cpp +@source:misc_handheld/tispeak.cpp k28m2 // Tiger Electronics lantutor // snmath // @@ -41708,7 +41708,7 @@ tntellp // tntelluk // vocaid // -@source:handheld/tispellb.cpp +@source:misc_handheld/tispellb.cpp mrchalgr // spellb // spellb79 // @@ -43541,7 +43541,7 @@ wicat // @source:pinball/wico.cpp aftor // -@source:parker/wildfire.cpp +@source:misc_handheld/wildfire.cpp wildfire // Parker Bros @source:misc/wildpkr.cpp diff --git a/src/mame/mess.flt b/src/mame/mess.flt index af4e27613d8..5511546845e 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -298,19 +298,6 @@ gamepark/gp32.cpp gridcomp/gridcomp.cpp grundy/newbrain.cpp h01x/h01x.cpp -handheld/hh_cop400.cpp -handheld/hh_cops1.cpp -handheld/hh_hmcs40.cpp -handheld/hh_melps4.cpp -handheld/hh_pic16.cpp -handheld/hh_pps41.cpp -handheld/hh_rw5000.cpp -handheld/hh_sm510.cpp -handheld/hh_tms1k.cpp -handheld/hh_ucom4.cpp -handheld/rzone.cpp -handheld/tispeak.cpp -handheld/tispellb.cpp hartung/gmaster.cpp hds/hds200.cpp heathkit/et3400.cpp @@ -475,6 +462,24 @@ midway/astrohome.cpp mips/mips.cpp misc/3do.cpp misc/vectrex.cpp +misc_handheld/hh_cop400.cpp +misc_handheld/hh_cops1.cpp +misc_handheld/hh_hmcs40.cpp +misc_handheld/hh_melps4.cpp +misc_handheld/hh_pic16.cpp +misc_handheld/hh_pps41.cpp +misc_handheld/hh_rw5000.cpp +misc_handheld/hh_sm510.cpp +misc_handheld/hh_tms1k.cpp +misc_handheld/hh_ucom4.cpp +misc_handheld/monty.cpp +misc_handheld/rzone.cpp +misc_handheld/scrablex.cpp +misc_handheld/talkingbb.cpp +misc_handheld/talkingfb.cpp +misc_handheld/tispeak.cpp +misc_handheld/tispellb.cpp +misc_handheld/wildfire.cpp mit/tx0.cpp mits/altair.cpp mits/mits680b.cpp @@ -578,9 +583,6 @@ osborne/vixen.cpp osi/osi.cpp palm/palm.cpp palm/palmz22.cpp -parker/talkingbb.cpp -parker/talkingfb.cpp -parker/wildfire.cpp pc/asst128.cpp pc/compc.cpp pc/europc.cpp @@ -623,7 +625,6 @@ rca/studio2.cpp rca/vip.cpp regnecentralen/rc702.cpp regnecentralen/rc759.cpp -ritam/monty.cpp rm/rm380z.cpp rm/rmnimbus.cpp robotron/a5105.cpp @@ -706,7 +707,6 @@ segacons/segapico.cpp segacons/segapm.cpp segacons/sg1000.cpp segacons/svmu.cpp -selchow/scrablex.cpp sequential/prophet600.cpp sgi/4dpi.cpp sgi/crimson.cpp diff --git a/src/mame/misc_handheld/README.md b/src/mame/misc_handheld/README.md new file mode 100644 index 00000000000..7a55da33a82 --- /dev/null +++ b/src/mame/misc_handheld/README.md @@ -0,0 +1,4 @@ +# **src/mame/misc_handheld** # + +Folder for miscellaneous handheld/tabletop drivers, where the number of drivers is too small to place them in specific company folders. +This also includes the hh_ collection drivers. \ No newline at end of file diff --git a/src/mame/misc_handheld/hh_cop400.cpp b/src/mame/misc_handheld/hh_cop400.cpp new file mode 100644 index 00000000000..587d1575207 --- /dev/null +++ b/src/mame/misc_handheld/hh_cop400.cpp @@ -0,0 +1,2506 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +National Semiconductor COPS(COP400 MCU series) handhelds or other simple +devices, mostly LED electronic games/toys. + +TODO: +- why does h2hbaskbc(and clones) need a workaround on writing L pins? +- plus1: which sensor position is which colour? +- vidchal: Add screen and gun cursor with brightness detection callback, + and softwarelist for the video tapes. We'd also need a VHS player device. + The emulated lightgun itself appears to be working fine(eg. add a 30hz + timer to IN.3 to score +100) +- solution release year, most chips on the PCB were from 1984, but this one + was dumped from a licensed product branded for the VWR company, so it + could be later than the initial release + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/cop400/cop400.h" +#include "video/pwm.h" +#include "machine/timer.h" +#include "sound/spkrdev.h" +#include "sound/dac.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "bship82.lh" // clickable +#include "ctstein.lh" // clickable +#include "einvaderc.lh" +#include "funjacks.lh" // clickable +#include "funrlgl.lh" // clickable +#include "funtag.lh" // clickable +#include "h2hbaskbc.lh" +#include "h2hhockeyc.lh" +#include "h2hsoccerc.lh" +#include "lafootb.lh" +#include "lchicken.lh" // clickable +#include "lightfgt.lh" // clickable +#include "mbaskb2.lh" +#include "mdallas.lh" +#include "msoccer2.lh" +#include "qkracer.lh" +#include "scat.lh" +#include "unkeinv.lh" +#include "vidchal.lh" + +//#include "hh_cop400_test.lh" // common test-layout - use external artwork + + +class hh_cop400_state : public driver_device +{ +public: + hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_l = 0; // MCU port L write data + u8 m_g = 0; // MCU port G write data + u8 m_d = 0; // MCU port D write data + int m_so = 0; // MCU SO line state + int m_sk = 0; // MCU SK line state + u16 m_inp_mux = ~0; // multiplexed inputs mask + + u16 read_inputs(int columns, u16 colmask = ~0); +}; + + +// machine start/reset + +void hh_cop400_state::machine_start() +{ + // register for savestates + save_item(NAME(m_l)); + save_item(NAME(m_g)); + save_item(NAME(m_d)); + save_item(NAME(m_so)); + save_item(NAME(m_sk)); + save_item(NAME(m_inp_mux)); +} + +void hh_cop400_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_cop400_state::read_inputs(int columns, u16 colmask) +{ + // active low + u16 ret = ~0 & colmask; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (~m_inp_mux >> i & 1) + ret &= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button) +{ + // when an input is directly wired to MCU reset pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Castle Toy Einstein + * COP421 MCU label ~/927 COP421-NEZ/N + * 4 lamps, 1-bit sound + + This is a Simon clone, the tones are not harmonic. Two models exist, each + with a different batteries setup, assume they're same otherwise. + +***************************************************************************/ + +class ctstein_state : public hh_cop400_state +{ +public: + ctstein_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void ctstein(machine_config &config); + +private: + void write_g(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void ctstein_state::write_g(u8 data) +{ + // G0-G2: input mux + m_inp_mux = data & 7; +} + +void ctstein_state::write_l(u8 data) +{ + // L0-L3: button lamps + m_display->matrix(1, data & 0xf); +} + +u8 ctstein_state::read_l() +{ + // L4-L7: multiplexed inputs + return read_inputs(3, 0xf) << 4 | 0xf; +} + +// config + +static INPUT_PORTS_START( ctstein ) + PORT_START("IN.0") // G0 port L + PORT_CONFNAME( 0x0f, 0x01^0x0f, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01^0x0f, "1" ) + PORT_CONFSETTING( 0x02^0x0f, "2" ) + PORT_CONFSETTING( 0x04^0x0f, "3" ) + PORT_CONFSETTING( 0x08^0x0f, "4" ) + + PORT_START("IN.1") // G1 port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SELECT ) PORT_NAME("Best Score") + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Red Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Green Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Blue Button") +INPUT_PORTS_END + +void ctstein_state::ctstein(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_g().set(FUNC(ctstein_state::write_g)); + m_maincpu->write_l().set(FUNC(ctstein_state::write_l)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ctstein); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ctstein ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Basketball/Hockey/Soccer (model 2150/2160/2170) + * COP420 MCU label COP420L-NEZ/N + * 2-digit 7seg display, 41 other leds, 1-bit sound + + 3 Head to Head games were released using this MCU/ROM. They play very much + the same, only differing on game time. The PCB is pre-configured on G1+IN2 + and IN3 to select the game. + + An earlier revision of this runs on TMS1000, see hh_tms1k.cpp driver. Model + numbers are the same. From the outside, an easy way to spot the difference is + the Start/Display button: TMS1000 version button label is D, COP420 one is a *. + The COP420 version also plays much slower. + +***************************************************************************/ + +class h2hbaskbc_state : public hh_cop400_state +{ +public: + h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void h2hsoccerc(machine_config &config); + void h2hbaskbc(machine_config &config); + void h2hhockeyc(machine_config &config); + +private: + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); +}; + +// handlers + +void h2hbaskbc_state::write_d(u8 data) +{ + // D: led select + m_d = data & 0xf; +} + +void h2hbaskbc_state::write_g(u8 data) +{ + // G: led select, input mux + m_inp_mux = data; + m_g = data & 0xf; +} + +void h2hbaskbc_state::write_l(u8 data) +{ + // D2,D3 double as multiplexer + u16 mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00); + u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask; + + // D2+G0,G1 are 7segs + // L0-L6: digit segments A-G, L0-L4: led data + m_display->matrix(sel, data); +} + +u8 h2hbaskbc_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(4, 7) | (m_inputs[4]->read() & 8); +} + +// config + +static INPUT_PORTS_START( h2hbaskbc ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start/Display") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // factory set + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x04, "Factory Test" ) + PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN.4") // IN3 (factory set) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hhockeyc ) + PORT_INCLUDE( h2hbaskbc ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hsoccerc ) + PORT_INCLUDE( h2hhockeyc ) + + PORT_MODIFY("IN.1") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) +INPUT_PORTS_END + +void h2hbaskbc_state::h2hbaskbc(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 1000000); // approximation - RC osc. R=43K, C=101pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(h2hbaskbc_state::write_d)); + m_maincpu->write_g().set(FUNC(h2hbaskbc_state::write_g)); + m_maincpu->write_l().set(FUNC(h2hbaskbc_state::write_l)); + m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_h2hbaskbc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void h2hbaskbc_state::h2hhockeyc(machine_config &config) +{ + h2hbaskbc(config); + config.set_default_layout(layout_h2hhockeyc); +} + +void h2hbaskbc_state::h2hsoccerc(machine_config &config) +{ + h2hbaskbc(config); + config.set_default_layout(layout_h2hsoccerc); +} + +// roms + +ROM_START( h2hbaskbc ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) ) +ROM_END + +#define rom_h2hhockeyc rom_h2hbaskbc // dumped from Basketball +#define rom_h2hsoccerc rom_h2hbaskbc // " + + + + + +/*************************************************************************** + + Entex Space Invader + * COP444L MCU label /B138 COPL444-HRZ/N INV II (die label HRZ COP 444L/A) + * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + The first version was on TMS1100 (see hh_tms1k.c), this is the reprogrammed + second release with a gray case instead of black. + +***************************************************************************/ + +class einvaderc_state : public hh_cop400_state +{ +public: + einvaderc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void einvaderc(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + DECLARE_WRITE_LINE_MEMBER(write_sk); + DECLARE_WRITE_LINE_MEMBER(write_so); + void write_l(u8 data); +}; + +// handlers + +void einvaderc_state::update_display() +{ + u8 l = bitswap<8>(m_l,7,6,0,1,2,3,4,5); + u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff; + + m_display->matrix(grid, l); +} + +void einvaderc_state::write_d(u8 data) +{ + // D: led grid 0-3 (D0-D2 are 7segs) + m_d = data; + update_display(); +} + +void einvaderc_state::write_g(u8 data) +{ + // G: led grid 4-7 + m_g = data; + update_display(); +} + +WRITE_LINE_MEMBER(einvaderc_state::write_sk) +{ + // SK: speaker out + led grid 8 + m_speaker->level_w(state); + m_sk = state; + update_display(); +} + +WRITE_LINE_MEMBER(einvaderc_state::write_so) +{ + // SO: led grid 9 + m_so = state; + update_display(); +} + +void einvaderc_state::write_l(u8 data) +{ + // L: led state/segment + m_l = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( einvaderc ) + PORT_START("IN.0") // port IN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "Amateur" ) + PORT_CONFSETTING( 0x00, "Professional" ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) +INPUT_PORTS_END + +void einvaderc_state::einvaderc(machine_config &config) +{ + // basic machine hardware + COP444L(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->read_in().set_ioport("IN.0"); + m_maincpu->write_d().set(FUNC(einvaderc_state::write_d)); + m_maincpu->write_g().set(FUNC(einvaderc_state::write_g)); + m_maincpu->write_sk().set(FUNC(einvaderc_state::write_sk)); + m_maincpu->write_so().set(FUNC(einvaderc_state::write_so)); + m_maincpu->write_l().set(FUNC(einvaderc_state::write_l)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(919, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_einvaderc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvaderc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) ) + + ROM_REGION( 82104, "mask", 0) + ROM_LOAD( "einvaderc.svg", 0, 82104, CRC(0013227f) SHA1(44a3ac48c947369231f010559331ad16fcbef7be) ) +ROM_END + + + + + +/*************************************************************************** + + Gordon Barlow Design electronic Space Invaders game (unreleased, from patent US4345764) + * COP421 (likely a development chip) + * 36+9 LEDs, 1-bit sound + + This game is presumedly unreleased. The title is unknown, the patent simply names + it "Hand-held electronic game". There is no mass-manufacture company assigned + to it either. The game seems unfinished(no scorekeeping, some bugs), and the design + is very complex. Player ship and bullets are on a moving "wand", a 2-way mirror + makes it appear on the same plane as the enemies and barriers. + +***************************************************************************/ + +class unkeinv_state : public hh_cop400_state +{ +public: + unkeinv_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void unkeinv(machine_config &config); + +private: + void update_display(); + void write_g(u8 data); + void write_d(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void unkeinv_state::update_display() +{ + m_display->matrix(m_g << 4 | m_d, m_l); +} + +void unkeinv_state::write_g(u8 data) +{ + // G0,G1: led select part + // G2,G3: input mux + m_g = ~data & 0xf; + update_display(); +} + +void unkeinv_state::write_d(u8 data) +{ + // D0-D3: led select part + m_d = ~data & 0xf; + update_display(); +} + +void unkeinv_state::write_l(u8 data) +{ + // L0-L7: led data + m_l = ~data & 0xff; + update_display(); +} + +u8 unkeinv_state::read_l() +{ + u8 ret = 0xff; + + // L0-L5+G2: positional odd + // L0-L5+G3: positional even + u8 pos = m_inputs[1]->read(); + if (m_g & 4 && pos & 1) + ret ^= (1 << (pos >> 1)); + if (m_g & 8 && ~pos & 1) + ret ^= (1 << (pos >> 1)); + + // L7+G3: fire button + if (m_g & 8 && m_inputs[0]->read()) + ret ^= 0x80; + + return ret & ~m_l; +} + +// config + +static INPUT_PORTS_START( unkeinv ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") + PORT_BIT( 0x0f, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(12) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) +INPUT_PORTS_END + +void unkeinv_state::unkeinv(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // frequency guessed + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_g().set(FUNC(unkeinv_state::write_g)); + m_maincpu->write_d().set(FUNC(unkeinv_state::write_d)); + m_maincpu->write_l().set(FUNC(unkeinv_state::write_l)); + m_maincpu->read_l().set(FUNC(unkeinv_state::read_l)); + m_maincpu->read_l_tristate().set_constant(0xff); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 8); + config.set_default_layout(layout_unkeinv); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( unkeinv ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality +ROM_END + + + + + +/*************************************************************************** + + LJN I Took a Lickin' From a Chicken + * COP421 MCU label ~/005 COP421-NJC/N + * 11 leds, 1-bit sound, motor to a chicken on a spring + + This toy includes 4 games: Tic Tac Toe, Chicken Sez, and Total Recall I/II. + + known releases: + - USA: I Took a Lickin' From a Chicken, published by LJN + - Japan: Professor Chicken's Genius Classroom 「にわとり博士の天才教室」, published by Bandai + (not sure if it's the same ROM, or just licensed the outer shell) + +***************************************************************************/ + +class lchicken_state : public hh_cop400_state +{ +public: + lchicken_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag), + m_motor_pos_out(*this, "motor_pos"), + m_motor_on_out(*this, "motor_on") + { } + + void lchicken(machine_config &config); + + DECLARE_READ_LINE_MEMBER(motor_switch_r); + +protected: + virtual void machine_start() override; + +private: + output_finder<> m_motor_pos_out; + output_finder<> m_motor_on_out; + + u8 m_motor_pos = 0; + TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); + + void write_l(u8 data); + void write_d(u8 data); + void write_g(u8 data); + u8 read_g(); +}; + +void lchicken_state::machine_start() +{ + hh_cop400_state::machine_start(); + + m_motor_pos_out.resolve(); + m_motor_on_out.resolve(); + + // register for savestates + save_item(NAME(m_motor_pos)); +} + +// handlers + +READ_LINE_MEMBER(lchicken_state::motor_switch_r) +{ + return m_motor_pos > 0xe8; // approximation +} + +TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick) +{ + if (~m_inp_mux & 8) + { + m_motor_pos++; + m_motor_pos_out = 100 * (m_motor_pos / (float)0x100); + } +} + +void lchicken_state::write_l(u8 data) +{ + // L0-L3: led data + // L4-L6: led select + // L7: N/C + m_display->matrix(data >> 4 & 7, ~data & 0xf); +} + +void lchicken_state::write_d(u8 data) +{ + // D0-D3: input mux + // D3: motor on + m_inp_mux = data & 0xf; + m_motor_on_out = ~data >> 3 & 1; +} + +void lchicken_state::write_g(u8 data) +{ + m_g = data; +} + +u8 lchicken_state::read_g() +{ + // G0-G3: multiplexed inputs + return read_inputs(4, m_g); +} + +// config + +static INPUT_PORTS_START( lchicken ) + PORT_START("IN.0") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(lchicken_state, motor_switch_r) +INPUT_PORTS_END + +void lchicken_state::lchicken(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(lchicken_state::write_l)); + m_maincpu->write_d().set(FUNC(lchicken_state::write_d)); + m_maincpu->write_g().set(FUNC(lchicken_state::write_g)); + m_maincpu->read_g().set(FUNC(lchicken_state::read_g)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); + + TIMER(config, "chicken_motor").configure_periodic(FUNC(lchicken_state::motor_sim_tick), attotime::from_msec(6000/0x100)); // ~6sec for a full rotation + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 4); + config.set_default_layout(layout_lchicken); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lchicken ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Jacks (model 1603) + * COP410L MCU die bonded directly to PCB (die label COP410L/B NGS) + * 8 LEDs, 1-bit sound + +***************************************************************************/ + +class funjacks_state : public hh_cop400_state +{ +public: + funjacks_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funjacks(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_g(); +}; + +// handlers + +void funjacks_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funjacks_state::write_d(u8 data) +{ + // D: led grid + input mux + m_inp_mux = data; + m_d = ~data & 0xf; + update_display(); +} + +void funjacks_state::write_l(u8 data) +{ + // L0,L1: led state + m_l = data & 3; + update_display(); +} + +void funjacks_state::write_g(u8 data) +{ + // G1: speaker out + m_speaker->level_w(data >> 1 & 1); + m_g = data; +} + +u8 funjacks_state::read_l() +{ + // L4,L5: multiplexed inputs + return read_inputs(3, 0x30) | m_l; +} + +u8 funjacks_state::read_g() +{ + // G1: speaker out state + // G2,G3: inputs + return m_inputs[3]->read() | (m_g & 2); +} + +// config + +static INPUT_PORTS_START( funjacks ) + PORT_START("IN.0") // D0 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) + + PORT_START("IN.1") // D1 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) + + PORT_START("IN.2") // D2 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // positioned at 1 o'clock on panel, increment clockwise + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) + + PORT_START("IN.3") // port G + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speaker + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void funjacks_state::funjacks(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=56pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funjacks_state::write_d)); + m_maincpu->write_l().set(FUNC(funjacks_state::write_l)); + m_maincpu->write_g().set(FUNC(funjacks_state::write_g)); + m_maincpu->read_l().set(FUNC(funjacks_state::read_l)); + m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 2); + config.set_default_layout(layout_funjacks); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funjacks ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Red Light Green Light (model 1604) + * COP410L MCU die bonded directly to PCB (die label COP410L/B NHZ) + * 14 LEDs, 1-bit sound + + known releases: + - USA: Funtronics: Red Light Green Light, published by Mattel + - USA(rerelease): Funtronics: Hot Wheels Drag Race, published by Mattel + +***************************************************************************/ + +class funrlgl_state : public hh_cop400_state +{ +public: + funrlgl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funrlgl(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); +}; + +// handlers + +void funrlgl_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funrlgl_state::write_d(u8 data) +{ + // D: led grid + m_d = ~data & 0xf; + update_display(); +} + +void funrlgl_state::write_l(u8 data) +{ + // L0-L3: led state + // L4-L7: N/C + m_l = ~data & 0xf; + update_display(); +} + +void funrlgl_state::write_g(u8 data) +{ + // G3: speaker out + m_speaker->level_w(data >> 3 & 1); +} + +// config + +static INPUT_PORTS_START( funrlgl ) + PORT_START("IN.0") // port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, 0) +INPUT_PORTS_END + +void funrlgl_state::funrlgl(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 800000); // approximation - RC osc. R=51K, C=91pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funrlgl_state::write_d)); + m_maincpu->write_l().set(FUNC(funrlgl_state::write_l)); + m_maincpu->read_l_tristate().set_constant(0xff); + m_maincpu->write_g().set(FUNC(funrlgl_state::write_g)); + m_maincpu->read_g().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 4); + m_display->set_bri_levels(0.005, 0.1); // top led is brighter + config.set_default_layout(layout_funrlgl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funrlgl ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Tag (model 1497) + * COP410L MCU die bonded directly to PCB (die label COP410L/B GTJ) + * 7 LEDs, 7 buttons, 1-bit sound + +***************************************************************************/ + +class funtag_state : public hh_cop400_state +{ +public: + funtag_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funtag(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_g(); +}; + +// handlers + +void funtag_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funtag_state::write_d(u8 data) +{ + // D: led grid + input mux + m_inp_mux = data; + m_d = ~data & 0xf; + update_display(); +} + +void funtag_state::write_l(u8 data) +{ + // L0,L1: led state + m_l = data & 3; + update_display(); +} + +void funtag_state::write_g(u8 data) +{ + // G2: speaker out + m_speaker->level_w(data >> 2 & 1); +} + +u8 funtag_state::read_l() +{ + // L2: difficulty switch + return m_inputs[4]->read() | 8; +} + +u8 funtag_state::read_g() +{ + // G0,G1: multiplexed inputs + // G3: start button + return read_inputs(3, 3) | m_inputs[3]->read() | 4; +} + +// config + +static INPUT_PORTS_START( funtag ) + PORT_START("IN.0") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) + + PORT_START("IN.1") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) + + PORT_START("IN.2") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) + + PORT_START("IN.3") // port G + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START ) + + PORT_START("IN.4") // port L + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void funtag_state::funtag(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=47K, C=91pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funtag_state::write_d)); + m_maincpu->write_l().set(FUNC(funtag_state::write_l)); + m_maincpu->write_g().set(FUNC(funtag_state::write_g)); + m_maincpu->read_l().set(FUNC(funtag_state::read_l)); + m_maincpu->read_g().set(FUNC(funtag_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 2); + config.set_default_layout(layout_funtag); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funtag ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_gtj", 0x0000, 0x0200, CRC(ce565da6) SHA1(34e5f39e32f220007d353c93787c1a6d117592c1) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Basketball 2 (model 1645), Soccer 2 (model 1642) + * PCB label: MA6037/38 + * dual COP420L MCUs, dies bonded to PCB (see romdefs for rom serials) + * 4001, die also bonded to PCB + * 2-digit 7seg display, 36 other leds, 1-bit sound + + The clock generator was measured ~527kHz for mbaskb2, ~483kHz for msoccer2, + meaning that the internal divider is 8. Main MCU SK connects to the other + MCU CKO pin, probably for syncing serial I/O. + + These two are on the same hardware, see patents US4341383 and US4372556 + for detailed descriptions of the games. + +***************************************************************************/ + +class mbaskb2_state : public hh_cop400_state +{ +public: + mbaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag), + m_subcpu(*this, "subcpu"), + m_on_timer(*this, "on_timer") + { } + + void mbaskb2(machine_config &config); + void msoccer2(machine_config &config); + + DECLARE_CUSTOM_INPUT_MEMBER(switch_r); + +protected: + virtual void machine_reset() override; + +private: + required_device m_subcpu; + required_device m_on_timer; + + void update_display(); + void shared_write_l(u8 data); + void main_write_g(u8 data); + void sub_write_g(u8 data); + void sub_write_d(u8 data); + u8 sub_read_in(); +}; + +void mbaskb2_state::machine_reset() +{ + hh_cop400_state::machine_reset(); + m_on_timer->adjust(attotime::from_msec(5)); +} + +// handlers + +void mbaskb2_state::update_display() +{ + m_display->matrix(~(m_d << 4 | m_g), m_l); +} + +void mbaskb2_state::shared_write_l(u8 data) +{ + // L: led data (though it's unlikely that maincpu will write valid led data to it) + m_l = m_maincpu->l_r() | m_subcpu->l_r(); + update_display(); +} + +void mbaskb2_state::main_write_g(u8 data) +{ + // G1: speaker out + m_speaker->level_w(data >> 1 & 1); +} + +void mbaskb2_state::sub_write_g(u8 data) +{ + // G: led select (low), input mux + m_g = m_inp_mux = data & 0xf; + update_display(); +} + +void mbaskb2_state::sub_write_d(u8 data) +{ + // D: led select (high) + m_d = data & 0xf; + update_display(); +} + +u8 mbaskb2_state::sub_read_in() +{ + // IN: multiplexed inputs + return read_inputs(3, 0xf); +} + +// config + +CUSTOM_INPUT_MEMBER(mbaskb2_state::switch_r) +{ + // The power switch is off-1-2, and the game relies on power-on starting at 1, + // otherwise msoccer2 boots up to what looks like a factory test mode. + return (m_inputs[3]->read() & 1) | (m_on_timer->enabled() ? 1 : 0); +} + +static INPUT_PORTS_START( mbaskb2 ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Shoot") + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Defense: Man") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Defense: Zone") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Defense: Press") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mbaskb2_state, switch_r) + + PORT_START("IN.3") + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( msoccer2 ) + PORT_INCLUDE( mbaskb2 ) + + PORT_MODIFY("IN.2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Low/High Kick") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Teammate") +INPUT_PORTS_END + +void mbaskb2_state::mbaskb2(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 500000); // approximation + m_maincpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed + m_maincpu->write_g().set(FUNC(mbaskb2_state::main_write_g)); + m_maincpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); + m_maincpu->read_l().set(m_subcpu, FUNC(cop400_cpu_device::l_r)); + m_maincpu->read_l_tristate().set_constant(0x80); + m_maincpu->read_si().set(m_subcpu, FUNC(cop400_cpu_device::so_r)); + + COP420(config, m_subcpu, 500000); // same as maincpu + m_subcpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed + m_subcpu->write_d().set(FUNC(mbaskb2_state::sub_write_d)); + m_subcpu->write_g().set(FUNC(mbaskb2_state::sub_write_g)); + m_subcpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); + m_subcpu->read_l().set(m_maincpu, FUNC(cop400_cpu_device::l_r)); + m_subcpu->read_l_tristate().set_constant(0x80); + m_subcpu->read_in().set(FUNC(mbaskb2_state::sub_read_in)); + m_subcpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); + m_subcpu->read_cko().set(m_maincpu, FUNC(cop400_cpu_device::sk_r)); + + config.set_perfect_quantum(m_maincpu); + + TIMER(config, "on_timer").configure_generic(nullptr); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(0xc0, 0x7f); + m_display->set_bri_levels(0.008, 0.04); // offense is brighter + config.set_default_layout(layout_mbaskb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void mbaskb2_state::msoccer2(machine_config &config) +{ + mbaskb2(config); + config.set_default_layout(layout_msoccer2); +} + +// roms + +ROM_START( mbaskb2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l_nmp", 0x0000, 0x0400, CRC(afc44378) SHA1(e96435bd1d0b2bea5140efdfe21f4684f2525075) ) + + ROM_REGION( 0x0400, "subcpu", 0 ) + ROM_LOAD( "cop420l_nmq", 0x0000, 0x0400, CRC(70943f6f) SHA1(3f711d8b7c7c5dd13c68bf1ef980d2f784b748f4) ) +ROM_END + +ROM_START( msoccer2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l_nnm", 0x0000, 0x0400, CRC(c9169aca) SHA1(525486e8a18ec6132e53f9be582b2667172230a9) ) + + ROM_REGION( 0x0400, "subcpu", 0 ) + ROM_LOAD( "cop420l_nnk", 0x0000, 0x0400, CRC(a84dd5f4) SHA1(5d269816248319a2bca1708d5022af455d52682d) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Look Alive! Football (model 1998) + * COP421L MCU die bonded directly to PCB (rom serial HCJ) + * 2 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + For a detailed description, see patent US4582323. 1st-person view versions + for Baseball and Basketball were also announced, but not released. + +***************************************************************************/ + +class lafootb_state : public hh_cop400_state +{ +public: + lafootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void lafootb(machine_config &config); + +private: + void update_display(); + void write_l(u8 data); + void write_d(u8 data); + u8 read_g(); +}; + +// handlers + +void lafootb_state::update_display() +{ + m_display->matrix(~m_d, m_l); +} + +void lafootb_state::write_l(u8 data) +{ + // L: led data + m_l = data; + update_display(); +} + +void lafootb_state::write_d(u8 data) +{ + // D: led select, D2,D3: input mux + m_d = data & 0xf; + m_inp_mux = data >> 2 & 3; + update_display(); +} + +u8 lafootb_state::read_g() +{ + // G: multiplexed inputs + return read_inputs(2, 7) | (m_inputs[2]->read() & 8); +} + +// config + +static INPUT_PORTS_START( lafootb ) + PORT_START("IN.0") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Right / Home") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick / Yards to go") + + PORT_START("IN.1") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Left / Visitors") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Up / Time") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass / Status") + + PORT_START("IN.2") // G3 + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void lafootb_state::lafootb(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 900000); // approximation - RC osc. R=51K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(lafootb_state::write_l)); + m_maincpu->write_d().set(FUNC(lafootb_state::write_d)); + m_maincpu->read_g().set(FUNC(lafootb_state::read_g)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1920, 864); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0x4, 0x7f); + m_display->set_segmask(0x8, 0xff); // right digit has dp + m_display->set_bri_levels(0.005); + config.set_default_layout(layout_lafootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lafootb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421l_hcj", 0x0000, 0x0400, CRC(a9cc1e94) SHA1(7a39f5a5f10b8a2bd72da3ff3f3fcfaad35ead5f) ) + + ROM_REGION( 38608, "mask", 0) + ROM_LOAD( "lafootb.svg", 0, 38608, CRC(35387445) SHA1(7cd9db170820fc84d47545c3db8d991b2c5f4f7f) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Dalla$ (J.R. handheld) + * COP444 MCU label COP444L-HYN/N + * 8-digit 7seg display, 1-bit sound + + This is a board game, only the handheld device is emulated here. + +***************************************************************************/ + +class mdallas_state : public hh_cop400_state +{ +public: + mdallas_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void mdallas(machine_config &config); + +private: + void update_display(); + void write_l(u8 data); + void write_d(u8 data); + void write_g(u8 data); + u8 read_in(); +}; + +// handlers + +void mdallas_state::update_display() +{ + m_display->matrix(~(m_d << 4 | m_g), m_l); +} + +void mdallas_state::write_l(u8 data) +{ + // L: digit segment data + m_l = data; + update_display(); +} + +void mdallas_state::write_d(u8 data) +{ + // D: select digit, input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); + m_d = data & 0xf; + update_display(); +} + +void mdallas_state::write_g(u8 data) +{ + // G: select digit, input mux low + m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); + m_g = data & 0xf; + update_display(); +} + +u8 mdallas_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(6, 0xf); +} + +// config + +/* physical button layout and labels are like this: + + < ON> [YES] [NO] [NEXT] + [] + [7] [8] [9] [STATUS] + [4] [5] [6] [ASSETS] + [1] [2] [3] [START] + [CLEAR] [0] [MOVE] [ENTER] +*/ + +static INPUT_PORTS_START( mdallas ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Start") + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Assets") + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Status") + + PORT_START("IN.4") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("West") // W + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Next") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("East") // E + + PORT_START("IN.5") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("No") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Yes") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("South") // S + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("North") // N +INPUT_PORTS_END + +void mdallas_state::mdallas(machine_config &config) +{ + // basic machine hardware + COP444L(config, m_maincpu, 900000); // approximation - RC osc. R=57K, C=101pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(mdallas_state::write_l)); + m_maincpu->write_d().set(FUNC(mdallas_state::write_d)); + m_maincpu->write_g().set(FUNC(mdallas_state::write_g)); + m_maincpu->read_in().set(FUNC(mdallas_state::read_in)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_mdallas); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mdallas ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cop444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Plus One + * COP410L MCU in 8-pin DIP, label ~/029 MM 57405 (die label COP410L/B NNE) + * orientation sensor(4 directions), 1-bit sound + + This is a board game, each player needs to rotate a triangular pyramid + shaped piece the same as the previous player, plus 1. + +***************************************************************************/ + +class plus1_state : public hh_cop400_state +{ +public: + plus1_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void plus1(machine_config &config); + +private: + void write_d(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void plus1_state::write_d(u8 data) +{ + // D0?: speaker out + m_speaker->level_w(data & 1); +} + +void plus1_state::write_l(u8 data) +{ + m_l = data; +} + +u8 plus1_state::read_l() +{ + // L: IN.1, mask with output + return m_inputs[1]->read() & m_l; +} + +// config + +static INPUT_PORTS_START( plus1 ) + PORT_START("IN.0") // port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Sensor Position 3") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sensor Position 1") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Sensor Position 4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sensor Position 2") + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void plus1_state::plus1(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=51K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(plus1_state::write_d)); + m_maincpu->read_g().set_ioport("IN.0"); + m_maincpu->write_l().set(FUNC(plus1_state::write_l)); + m_maincpu->read_l().set(FUNC(plus1_state::read_l)); + + // no visual feedback! + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( plus1 ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Lightfight + * COP421L MCU label /B119 COP421L-HLA/N + * LED matrix, 1-bit sound + + Xbox-shaped electronic game for 2 or more players, with long diagonal buttons + next to each outer LED. The main object of the game is to pinpoint a light + by pressing 2 buttons. To start, press a skill-level button(P2 button 7/8/9) + after selecting a game mode(P1 button 6-10). + + The game variations are: + 1: LightFight + 2: NightFight + 3: RiteSite + 4: QuiteBrite + 5: RightLight + +***************************************************************************/ + +class lightfgt_state : public hh_cop400_state +{ +public: + lightfgt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void lightfgt(machine_config &config); + +private: + void update_display(); + DECLARE_WRITE_LINE_MEMBER(write_so); + void write_d(u8 data); + void write_l(u8 data); + u8 read_g(); +}; + +// handlers + +void lightfgt_state::update_display() +{ + u8 grid = (m_so | m_d << 1) ^ 0x1f; + m_display->matrix(grid, m_l); +} + +WRITE_LINE_MEMBER(lightfgt_state::write_so) +{ + // SO: led grid 0 (and input mux) + m_so = state; + update_display(); +} + +void lightfgt_state::write_d(u8 data) +{ + // D: led grid 1-4 (and input mux) + m_d = data; + update_display(); +} + +void lightfgt_state::write_l(u8 data) +{ + // L0-L4: led state + // L5-L7: N/C + m_l = data & 0x1f; + update_display(); +} + +u8 lightfgt_state::read_g() +{ + // G: multiplexed inputs + m_inp_mux = m_d << 1 | m_so; + return read_inputs(5, 0xf); +} + +// config + +static INPUT_PORTS_START( lightfgt ) + PORT_START("IN.0") // SO port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) // note: button 1 is on the left side from player perspective + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_COCKTAIL + + PORT_START("IN.1") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_COCKTAIL + + PORT_START("IN.2") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_COCKTAIL + + PORT_START("IN.3") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_COCKTAIL + + PORT_START("IN.4") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_COCKTAIL +INPUT_PORTS_END + +void lightfgt_state::lightfgt(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 950000); // approximation - RC osc. R=82K, C=56pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_so().set(FUNC(lightfgt_state::write_so)); + m_maincpu->write_d().set(FUNC(lightfgt_state::write_d)); + m_maincpu->write_l().set(FUNC(lightfgt_state::write_l)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 5); + config.set_default_layout(layout_lightfgt); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lightfgt ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1982 version) + * COP420 MCU label COP420-JWE/N + + see hh_tms1k.cpp bship driver for more information + +***************************************************************************/ + +class bship82_state : public hh_cop400_state +{ +public: + bship82_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void bship82(machine_config &config); + +private: + void write_d(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_in(); + DECLARE_WRITE_LINE_MEMBER(write_so); +}; + +// handlers + +void bship82_state::write_d(u8 data) +{ + // D: input mux + m_inp_mux = data; +} + +void bship82_state::write_g(u8 data) +{ + // G0-G2: speaker out via 3.9K, 2.2K, 1.0K resistor + // G3: enable speaker + m_speaker->level_w((data & 8) ? (data & 7) : 0); +} + +u8 bship82_state::read_l() +{ + // L: multiplexed inputs + return read_inputs(4, 0xff); +} + +u8 bship82_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(4, 0xf00) >> 8; +} + +WRITE_LINE_MEMBER(bship82_state::write_so) +{ + // SO: led + m_display->matrix(1, state); +} + +// config + +static INPUT_PORTS_START( bship82 ) + PORT_START("IN.0") // D0 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // D1 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") + + PORT_START("IN.2") // D2 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") // CLE + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 A") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 B") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 C") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 D") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 E") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 F") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 G") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 H") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 I") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 J") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // D3 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") // CM + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 1") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 2") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 3") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 4") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 5") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 6") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 7") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 8") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 9") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 10") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Fire") + + PORT_START("IN.4") // SI + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch +INPUT_PORTS_END + +void bship82_state::bship82(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 750000); // approximation - RC osc. R=14K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(bship82_state::write_d)); + m_maincpu->write_g().set(FUNC(bship82_state::write_g)); + m_maincpu->read_l().set(FUNC(bship82_state::read_l)); + m_maincpu->read_in().set(FUNC(bship82_state::read_in)); + m_maincpu->write_so().set(FUNC(bship82_state::write_so)); + m_maincpu->read_si().set_ioport("IN.4"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship82); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/7.0, 2.0/7.0, 3.0/7.0, 4.0/7.0, 5.0/7.0, 6.0/7.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bship82 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Racer (COP420 version) + * COP420 MCU label COP420-NPG/N + * 8-digit 7seg led display(1 custom digit), 1 green led, no sound + + This is the COP420 version, they removed support for the link cable. + The first release was on a MM5799 MCU, see hh_cops1.cpp. + +***************************************************************************/ + +class qkracer_state : public hh_cop400_state +{ +public: + qkracer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void qkracer(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); + DECLARE_WRITE_LINE_MEMBER(write_sk); +}; + +// handlers + +void qkracer_state::update_display() +{ + m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l); +} + +void qkracer_state::write_d(u8 data) +{ + // D: select digit, D3: input mux low bit + m_inp_mux = (m_inp_mux & ~1) | (data >> 3 & 1); + m_d = data & 0xf; + update_display(); +} + +void qkracer_state::write_g(u8 data) +{ + // G: select digit, input mux + m_inp_mux = (m_inp_mux & 1) | (data << 1 & 0x1e); + m_g = data & 0xf; + update_display(); +} + +void qkracer_state::write_l(u8 data) +{ + // L0-L6: digit segment data + m_l = data & 0x7f; + update_display(); +} + +u8 qkracer_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(5, 0xf); +} + +WRITE_LINE_MEMBER(qkracer_state::write_sk) +{ + // SK: green led + m_sk = state; + update_display(); +} + +// config + +static INPUT_PORTS_START( qkracer ) + PORT_START("IN.0") // D3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") + + PORT_START("IN.1") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.2") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void qkracer_state::qkracer(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 950000); // approximation - RC osc. R=47K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(qkracer_state::write_d)); + m_maincpu->write_g().set(FUNC(qkracer_state::write_g)); + m_maincpu->write_l().set(FUNC(qkracer_state::write_l)); + m_maincpu->read_in().set(FUNC(qkracer_state::read_in)); + m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0xdf, 0x7f); + m_display->set_segmask(0x20, 0x41); // equals sign + config.set_default_layout(layout_qkracer); + + // no sound! +} + +// roms + +ROM_START( qkracer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor Cops Pocket Assistant (CPA) + * COP444 MCU label COP444L-JXY/N + * 8-digit 7seg display, 1-bit sound + + It's a programmable COP400 series MCU simulator, on a COP400 series MCU. + Note that this MCU doesn't have executable RAM, so it truly is a simulator. + The hardware/PCB and the green clamshell are identical to Mattel Dalla$. + +***************************************************************************/ + +// handlers: see mdallas_state + +// config + +static INPUT_PORTS_START( copspa ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / CLRA") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / LQID") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / COMP") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / CAB") + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / RC") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / SC") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / ASC") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / CBA") + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / SKC") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / SKE") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_NAME("A / JP") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_NAME("B / JSR") + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_NAME("C / LBI") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_NAME("D / SMB") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_NAME("E / RMB") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_NAME("F / SKMB") + + PORT_START("IN.4") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_NAME("Prog") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("SS / AISC") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("Run / STII") + + PORT_START("IN.5") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_NAME("Exec / LD") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_NAME("Reset / X") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_NAME("Modify / XIS") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_NAME("Disp / XDS") +INPUT_PORTS_END + +// roms + +ROM_START( copspa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cop444l-jxy_n", 0x0000, 0x0800, CRC(8e5da5d2) SHA1(d557a5ede206fa0dff7b549acef9e0ef48e48c8a) ) +ROM_END + + + + + +/*************************************************************************** + + SCAT specialist calculators + * COP404LSN-5 MCU (no internal ROM) + * 2KB EPROM (ETC2716Q) + * 8-digit 7seg led display + + SCAT = aka South Carolina(SC) Applied Technology, Inc. + + Known products, assumed to be all on the same hardware: + - The Dimension (aka Feet & Inch Calculator) + - The Solution + - Metalmate + + CKI was measured ~1.469MHz, but D0 was measured ~77.44Hz so that means real + clock speed is a bit higher than CKI measurement, and the clock divider is 32. + +***************************************************************************/ + +class scat_state : public hh_cop400_state +{ +public: + scat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void scat(machine_config &config); + +private: + void main_map(address_map &map); + + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); +}; + +// handlers + +void scat_state::update_display() +{ + m_display->matrix(~(m_d | m_g << 4), bitswap<8>(m_l,0,1,2,3,4,5,6,7)); +} + +void scat_state::write_d(u8 data) +{ + // D: select digit, input mux (low) + m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); + m_d = data & 0xf; + update_display(); +} + +void scat_state::write_g(u8 data) +{ + // G: select digit, input mux (high) + m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); + m_g = data & 0xf; + update_display(); +} + +void scat_state::write_l(u8 data) +{ + // L: digit segment data + m_l = data; + update_display(); +} + +u8 scat_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(6, 0xf); +} + +void scat_state::main_map(address_map &map) +{ + map(0x0000, 0x07ff).rom(); +} + +// config + +static INPUT_PORTS_START( solution ) + PORT_START("IN.0") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / Enter") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / ppm") + + PORT_START("IN.1") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Atoms / Mole") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Atomic Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / %") + + PORT_START("IN.2") // D2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Density Wntd.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Orig. Density") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Eq. Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / Normal") + + PORT_START("IN.3") // D3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Conc. Wntd.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Orig. Conc.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Fmla. Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / Molar") + + PORT_START("IN.4") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Milli.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Micro.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Gram") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Liter") + + PORT_START("IN.5") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Known Vol.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Known Wt.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Dil. Wntd.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") +INPUT_PORTS_END + +void scat_state::scat(machine_config &config) +{ + // basic machine hardware + COP404L(config, m_maincpu, 1500000); // R/C OSC via MM74C14N + m_maincpu->set_config(COP400_CKI_DIVISOR_32, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->set_addrmap(AS_PROGRAM, &scat_state::main_map); + m_maincpu->write_d().set(FUNC(scat_state::write_d)); + m_maincpu->write_g().set(FUNC(scat_state::write_g)); + m_maincpu->write_l().set(FUNC(scat_state::write_l)); + m_maincpu->read_in().set(FUNC(scat_state::read_in)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_scat); + + // no sound! +} + +// roms + +ROM_START( solution ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "etc2716q", 0x0000, 0x0800, CRC(cf990f88) SHA1(6d505fdc94028cbdf6445df9e9451156a9d5f372) ) // no custom label +ROM_END + + + + + +/*************************************************************************** + + Select Merchandise Video Challenger + * COP420 MCU label COP420-TDX/N + * 6-digit 7seg led display, 3 other leds, 4-bit sound + + This is a lightgun with scorekeeping. The "games" themselves were released + on VHS tapes. To determine scoring, the lightgun detects strobe lighting + from objects in the video. + + known releases: + - Japan: Video Challenger, published by Takara + - UK: Video Challenger, published by Bandai + - Canada: Video Challenger, published by Irwin + +***************************************************************************/ + +class vidchal_state : public hh_cop400_state +{ +public: + vidchal_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void vidchal(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + DECLARE_WRITE_LINE_MEMBER(write_sk); +}; + +// handlers + +void vidchal_state::update_display() +{ + m_display->matrix(m_d | m_sk << 6, m_l); +} + +void vidchal_state::write_d(u8 data) +{ + // D: CD4028BE to digit select + m_d = 1 << data & 0x3f; + update_display(); +} + +void vidchal_state::write_l(u8 data) +{ + // L: digit segment data + m_l = bitswap<8>(data,0,3,1,5,4,7,2,6); + update_display(); +} + +WRITE_LINE_MEMBER(vidchal_state::write_sk) +{ + // SK: hit led + m_sk = state; + update_display(); +} + +// config + +static INPUT_PORTS_START( vidchal ) + PORT_START("IN.0") // port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Light Sensor") +INPUT_PORTS_END + +void vidchal_state::vidchal(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 900000); // approximation + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(vidchal_state::write_d)); + m_maincpu->write_g().set("dac", FUNC(dac_byte_interface::data_w)); + m_maincpu->write_l().set(FUNC(vidchal_state::write_l)); + m_maincpu->read_in().set_ioport("IN.0"); + m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6+1, 8); + m_display->set_segmask(0x3f, 0xff); + config.set_default_layout(layout_vidchal); + + // sound hardware + SPEAKER(config, "mono").front_center(); + DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC +} + +// roms + +ROM_START( vidchal ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, einvaderc_state, empty_init, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, unkeinv, 0, 0, unkeinv, unkeinv, unkeinv_state, empty_init, "Gordon Barlow Design", "unknown electronic Space Invaders game (patent)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) + +CONS( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, mbaskb2, 0, 0, mbaskb2, mbaskb2, mbaskb2_state, empty_init, "Mattel Electronics", "Basketball 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, msoccer2, 0, 0, msoccer2, msoccer2, mbaskb2_state, empty_init, "Mattel Electronics", "Soccer 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, lafootb, 0, 0, lafootb, lafootb, lafootb_state, empty_init, "Mattel Electronics", "Look Alive! Football", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, mdallas, 0, 0, mdallas, mdallas, mdallas_state, empty_init, "Mattel Electronics", "Dalla$ (J.R. handheld)", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** +CONS( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight - The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, bship82, bship, 0, bship82, bship82, bship82_state, empty_init, "Milton Bradley", "Electronic Battleship (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1979, qkracer, 0, 0, qkracer, qkracer, qkracer_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "Cops Pocket Assistant", MACHINE_SUPPORTS_SAVE ) + +COMP( 1984, solution, 0, 0, scat, solution, scat_state, empty_init, "SCAT", "The Solution", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1987, vidchal, 0, 0, vidchal, vidchal, vidchal_state, empty_init, "Select Merchandise", "Video Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_cops1.cpp b/src/mame/misc_handheld/hh_cops1.cpp new file mode 100644 index 00000000000..62134295653 --- /dev/null +++ b/src/mame/misc_handheld/hh_cops1.cpp @@ -0,0 +1,850 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +National Semiconductor COPS(MM57 MCU series) handhelds + +MCU die label for MM5799 games says MM4799, but they are in fact MM5799. + +ROM source notes when dumped from another publisher, but confident it's the same: +- cambrp: Radio Shack EC-4001 Programmable + +TODO: +- qkracerm link cable (already tested locally and it works, so driver notes + and MCU serial emulation are good enough) + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/cops1/mm5799.h" +#include "machine/ds8874.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "cambrp.lh" +#include "mbaskb.lh" +#include "mhockey.lh" +#include "mhockeya.lh" +#include "msoccer.lh" +#include "qkracerm.lh" +#include "qkspeller.lh" + +//#include "hh_cops1_test.lh" // common test-layout - use external artwork + + +class hh_cops1_state : public driver_device +{ +public: + hh_cops1_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<9> m_inputs; // max 9 + + u16 m_inp_mux = 0; + u16 m_grid = 0; + + // MCU output pin state + u8 m_s = 0; + u8 m_do = 0; + u8 m_f = 0; + int m_blk = false; + + u8 read_inputs(int columns); +}; + + +// machine start/reset + +void hh_cops1_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_s)); + save_item(NAME(m_do)); + save_item(NAME(m_f)); + save_item(NAME(m_blk)); +} + +void hh_cops1_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_cops1_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Mattel Basketball (model 2437) + * PCB label: MA 6017/18/19 + * MM5799 MCU die bonded directly to PCB (die label MM4799 C NCX) + * 4001 and 74154, also bonded to PCB + * 2-digit 7seg led display, 21 leds, 2-bit sound + + Mattel Soccer (model 2678) + * MCU die label MM4799 C NDC + * same hardware as Basketball + + Mattel Hockey (model 2946) + * MCU die label MM4799 C NFR + * same hardware as Basketball + + Judging from videos online, there are two versions of Basketball. One where + the display shows "12" at power-on(as on MAME), and one that shows "15". + + There's also an older version of Hockey, it has the same ROM as Soccer. + This version wasn't sold in the USA. It is commonly known as the Canadian + version, though it was also released in Europe and Japan. + +***************************************************************************/ + +class mbaskb_state : public hh_cops1_state +{ +public: + mbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag) + { } + + void mbaskb(machine_config &config); + void msoccer(machine_config &config); + void mhockey(machine_config &config); + void mhockeya(machine_config &config); + +private: + void update_display(); + void write_do(u8 data); + void write_blk(int state); + void write_s(u8 data); + void write_f(u8 data); + u8 read_f(); +}; + +// handlers + +void mbaskb_state::update_display() +{ + // DO4321: 74154 CBAD + u8 d = (m_do >> 1 & 7) | (m_do << 3 & 8); + u16 sel = m_blk ? (1 << d) : 0; + + // 74154 output 2,6: speaker out + u8 spk = bitswap<2>(sel, 6,2); + m_speaker->level_w(spk); + + // 74154 output 3-5,10-13: digit/led select + u8 dsp = bitswap<7>(sel, 11,4,12,5,13,3,10); + m_display->matrix((m_f << 5 & 0x80) | dsp, m_s); +} + +void mbaskb_state::write_do(u8 data) +{ + // DO: 74154 inputs + m_do = data; + update_display(); +} + +void mbaskb_state::write_blk(int state) +{ + // BLK: 74154 enable + m_blk = state; + update_display(); +} + +void mbaskb_state::write_s(u8 data) +{ + // Sa-Sg: digit segment/led data + m_s = data; + update_display(); +} + +void mbaskb_state::write_f(u8 data) +{ + // F3: led data + m_f = data; + update_display(); +} + +u8 mbaskb_state::read_f() +{ + // F1: difficulty switch + // F2: N/C or tied high + return m_inputs[2]->read() | (m_f & 2); +} + +// config + +static INPUT_PORTS_START( mbaskb ) + PORT_START("IN.0") // port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // INB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // both buttons + + PORT_START("IN.2") // F1 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( mhockeya ) + PORT_INCLUDE( mbaskb ) + + PORT_MODIFY("IN.2") // F2 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_CUSTOM ) // tied high to select Hockey +INPUT_PORTS_END + +void mbaskb_state::mbaskb(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 370000); // approximation + m_maincpu->write_do().set(FUNC(mbaskb_state::write_do)); + m_maincpu->write_blk().set(FUNC(mbaskb_state::write_blk)); + m_maincpu->write_s().set(FUNC(mbaskb_state::write_s)); + m_maincpu->write_f().set(FUNC(mbaskb_state::write_f)); + m_maincpu->read_f().set(FUNC(mbaskb_state::read_f)); + m_maincpu->read_k().set_ioport("IN.0"); + m_maincpu->read_inb().set_ioport("IN.1"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(3, 0x7f); + m_display->set_bri_levels(0.015, 0.2); // ball led is brighter + config.set_default_layout(layout_mbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void mbaskb_state::msoccer(machine_config &config) +{ + mbaskb(config); + config.set_default_layout(layout_msoccer); + + m_display->set_bri_levels(0.005, 0.05, 0.2); // goalie is darker +} + +void mbaskb_state::mhockey(machine_config &config) +{ + mbaskb(config); + config.set_default_layout(layout_mhockey); +} + +void mbaskb_state::mhockeya(machine_config &config) +{ + msoccer(config); + config.set_default_layout(layout_mhockeya); +} + +// roms + +ROM_START( mbaskb ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ncx", 0x0000, 0x0200, CRC(d0e5fce1) SHA1(04708c043a763bf92d765095e9551388a1d967e8) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( msoccer ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( mhockeya ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( mhockey ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_nfr", 0x0000, 0x0200, CRC(979e5c5b) SHA1(e6c81572f47d93f4c13472f477aac67e05841976) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Racer (MM5799 version) + * MM5799 MCU die bonded directly to PCB (die label MM4799 C DUZ) + * DS8874 LED driver, die bonded to PCB as well + * 8-digit 7seg led display(1 custom digit), 1 green led, no sound + * optional link cable to compete with another player (see patent US4051605) + + This is the first version of QuizKid Racer, the 2nd release is on a + COP420 MCU, see hh_cop400.cpp. + +***************************************************************************/ + +class qkracerm_state : public hh_cops1_state +{ +public: + qkracerm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void qkracerm(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + u8 read_f(); + u8 read_k(); + int read_si(); +}; + +// handlers + +void qkracerm_state::update_display() +{ + m_display->matrix(m_grid, m_s); +} + +void qkracerm_state::ds8874_output_w(u16 data) +{ + // DS8874 outputs: digit select, input mux + m_grid = ~data; + m_inp_mux = m_grid >> 3; + update_display(); +} + +void qkracerm_state::write_do(u8 data) +{ + // DO1: DS8874 CP + // DO4: DS8874 _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 3)); +} + +void qkracerm_state::write_s(u8 data) +{ + // Sa-Sg: digit segment data + // Sp: link data out + m_s = data; + update_display(); +} + +u8 qkracerm_state::read_f() +{ + // F1: N/C + // F2: link cable detected + // F3: link data in + return m_maincpu->f_output_r() & 1; +} + +u8 qkracerm_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +int qkracerm_state::read_si() +{ + // SI: link master(1)/slave(0) + return 0; +} + +// config + +static INPUT_PORTS_START( qkracerm ) + PORT_START("IN.0") // DS8874 OUT 4 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") + + PORT_START("IN.1") // DS8874 OUT 5 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.2") // DS8874 OUT 6 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // DS8874 OUT 7 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // DS8874 OUT 8 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void qkracerm_state::qkracerm(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 220000); // approximation + m_maincpu->set_option_ram_d12(true); + m_maincpu->set_option_lb_10(5); + m_maincpu->write_do().set(FUNC(qkracerm_state::write_do)); + m_maincpu->write_s().set(FUNC(qkracerm_state::write_s)); + m_maincpu->read_f().set(FUNC(qkracerm_state::read_f)); + m_maincpu->read_k().set(FUNC(qkracerm_state::read_k)); + m_maincpu->read_si().set(FUNC(qkracerm_state::read_si)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(qkracerm_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0xdf, 0x7f); + m_display->set_segmask(0x20, 0x41); // equals sign + config.set_default_layout(layout_qkracerm); + + // no sound! +} + +// roms + +ROM_START( qkracerm ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_duz", 0x0000, 0x0200, CRC(8b484d2a) SHA1(809e902a11e23bed010ac795ab8dc50e5c1869dc) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_qkracerm_output.pla", 0, 254, CRC(f095fc51) SHA1(e3321d5cc4ecef363df7ef94f47e860c7a6d8c7e) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Speller + * MM5799 MCU die bonded directly to PCB (die label MM4799 C NDF) + * 2-digit 7seg led display, green led, red led, no sound + + The manual included 99 pictures for matching the words, with increased + difficulty. For example 10 = owl, 90 = kangaroo. + + Modes: + - Spell: match numbered picture with word + - Learn: same as Spell, but only the 1st letter + - Game: player 1 enters word, player 2 needs to guess it + +***************************************************************************/ + +class qkspeller_state : public hh_cops1_state +{ +public: + qkspeller_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag) + { } + + void qkspeller(machine_config &config); + +private: + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + void write_f(u8 data); + u8 read_f(); + u8 read_k(); +}; + +// handlers + +void qkspeller_state::update_display() +{ + m_display->matrix((m_f << 1 & 0xc) | (m_do & 3), m_inp_mux); +} + +void qkspeller_state::write_do(u8 data) +{ + // DO1,DO2: digit select + m_do = data; + update_display(); +} + +void qkspeller_state::write_s(u8 data) +{ + // S: digit segment data, input mux + m_inp_mux = data; + update_display(); +} + +void qkspeller_state::write_f(u8 data) +{ + // F2,F3: led data + m_f = data; + update_display(); +} + +u8 qkspeller_state::read_f() +{ + // F1: 3-pos switch (GND, floating, Vcc) + if (m_inputs[8]->read() == 2) + return m_f; + else + return (m_inputs[8]->read() & 1) | (m_f & ~1); +} + +u8 qkspeller_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +static INPUT_PORTS_START( qkspeller ) + PORT_START("IN.0") // Sa port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + + PORT_START("IN.1") // Sb port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + + PORT_START("IN.2") // Sc port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + + PORT_START("IN.3") // Sd port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + + PORT_START("IN.4") // Se port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_NAME("Erase") + + PORT_START("IN.5") // Sf port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // Sg port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.7") // Sp port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Start") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Next") + + PORT_START("IN.8") // F1 + PORT_CONFNAME( 0x03, 0x00, "Mode" ) + PORT_CONFSETTING( 0x00, "Spell" ) + PORT_CONFSETTING( 0x02, "Learn" ) + PORT_CONFSETTING( 0x01, "Game" ) + + PORT_START("TEST.0") // INB test pad + PORT_CONFNAME( 0x01, 0x00, "Factory Test 1" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("TEST.1") // DO3 test pad + PORT_CONFNAME( 0x01, 0x00, "Factory Test 2" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) +INPUT_PORTS_END + +void qkspeller_state::qkspeller(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 220000); // approximation + m_maincpu->write_do().set(FUNC(qkspeller_state::write_do)); + m_maincpu->write_s().set(FUNC(qkspeller_state::write_s)); + m_maincpu->write_f().set(FUNC(qkspeller_state::write_f)); + m_maincpu->read_f().set(FUNC(qkspeller_state::read_f)); + m_maincpu->read_k().set(FUNC(qkspeller_state::read_k)); + m_maincpu->read_inb().set_ioport("TEST.0"); + m_maincpu->read_do3().set_ioport("TEST.1"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_qkspeller); + + // no sound! +} + +// roms + +ROM_START( qkspeller ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndf", 0x0000, 0x0200, CRC(0f497a12) SHA1(78eb79dcc414ed2a955450ffb3be431ecc2edb0c) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + + + + + +/*************************************************************************** + + Sinclair Radionics Cambridge Programmable + * MM5799 MCU (label MM5799NBP/N, die label MM4799 C NBP) + * DS8874 LED driver, 9-digit 7seg led display + + It's a programmable pocket calculator, up to 36 steps. 2 MCU revisions + are known: MM5799EHY and MM5799NBP. + + 4 program libraries were available: + - Vol. 1: General / Finance / Statistics + - Vol. 2: Mathematics + - Vol. 3: Physics & Engineering + - Vol. 4: Electronics + + Paste example: CCSS200SR 2-32+.12131*.5=.5.201=50.200 CSS200C + Now enter a value under 70, followed by RUN, to calculate its factorial. + + known releases: + - World: Cambridge Programmable, published by Sinclair Radionics + - USA: EC-4001 Programmable, published by Tandy Corporation, Radio Shack brand + +***************************************************************************/ + +class cambrp_state : public hh_cops1_state +{ +public: + cambrp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void cambrp(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + u8 read_f(); + u8 read_k(); +}; + +// handlers + +void cambrp_state::update_display() +{ + m_display->matrix(m_grid, m_s); +} + +void cambrp_state::ds8874_output_w(u16 data) +{ + // DS8874 outputs: digit select, input mux + m_grid = ~data; + m_inp_mux = m_grid >> 2; + update_display(); +} + +void cambrp_state::write_do(u8 data) +{ + // DO1: DS8874 CP + // DO4: DS8874 _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 3)); +} + +void cambrp_state::write_s(u8 data) +{ + // S: digit segment data + // (DS8874 low battery out also connects to Sp) + m_s = data; + update_display(); +} + +u8 cambrp_state::read_f() +{ + // F2: K3, other: N/C + return (~read_inputs(6) >> 1 & 2) | (m_maincpu->f_output_r() & ~2); +} + +u8 cambrp_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( cambrp ) + PORT_START("IN.0") // DS8874 OUT 3 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / stop / +/-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / () / R>D") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('=') PORT_NAME("= / -") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("Up/Downshift") + + PORT_START("IN.1") // DS8874 OUT 4 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / " UTF8_SQUAREROOT "x / go if neg") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / sin / arcsin") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') PORT_NAME("- / -x / F") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR('C') PORT_NAME("C/CE / step") + + PORT_START("IN.2") // DS8874 OUT 5 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / sto / go to") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / cos / arccos") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') PORT_NAME(u8"÷ / 1/x / G") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("RUN / learn") + + PORT_START("IN.3") // DS8874 OUT 6 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / ChN/# / D>R") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / tan / arctan") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') PORT_NAME("+ / 2x / E") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // DS8874 OUT 7 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / ln x / e" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_NAME("./EE/_ / Downshift / A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') PORT_NAME("× / x" UTF8_POW_2 " / .") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // DS8874 OUT 8 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / rcl / MEx") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cambrp_state::cambrp(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 200000); // approximation + m_maincpu->set_option_ram_d12(true); + m_maincpu->set_option_lb_10(4); + m_maincpu->write_do().set(FUNC(cambrp_state::write_do)); + m_maincpu->write_s().set(FUNC(cambrp_state::write_s)); + m_maincpu->read_f().set(FUNC(cambrp_state::read_f)); + m_maincpu->read_k().set(FUNC(cambrp_state::read_k)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(cambrp_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_cambrp); + + // no sound! +} + +// roms + +ROM_START( cambrp ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm5799nbp_n", 0x0000, 0x0200, CRC(f4e9063b) SHA1(04b7bf24e994cd453584d233405621f8110feded) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_cambrp_output.pla", 0, 254, CRC(eb882256) SHA1(acd77c066a7b7d18c3ea10f137a45ab83d1c53e1) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1978, mbaskb, 0, 0, mbaskb, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Basketball (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, msoccer, 0, 0, msoccer, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Soccer (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mhockey, 0, 0, mhockey, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, US version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mhockeya, mhockey, 0, mhockeya, mhockeya, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, export version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1977, qkracerm, qkracer, 0, qkracerm, qkracerm, qkracerm_state, empty_init, "National Semiconductor", "QuizKid Racer (MM5799 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NODEVICE_LAN ) +CONS( 1978, qkspeller, 0, 0, qkspeller, qkspeller, qkspeller_state, empty_init, "National Semiconductor", "QuizKid Speller", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** + +COMP( 1977, cambrp, 0, 0, cambrp, cambrp, cambrp_state, empty_init, "Sinclair Radionics", "Cambridge Programmable", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_hmcs40.cpp b/src/mame/misc_handheld/hh_hmcs40.cpp new file mode 100644 index 00000000000..347d603f2fb --- /dev/null +++ b/src/mame/misc_handheld/hh_hmcs40.cpp @@ -0,0 +1,5345 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/*************************************************************************** + +Hitachi HMCS40 MCU tabletops/handhelds or other simple devices, +most of them are VFD electronic games/toys. + +known chips: + + serial device etc. +---------------------------------------------------------------- + @A07 HD38750 1979, Bambino Knock-Em Out Boxing (ET-06B) + @A08 HD38750 1979, Bambino Dribble Away Basketball (ET-05) + @A45 HD38750 1981, VTech Invaders + *A56 HD38750 1981, Actronics(Hanzawa) Twinvader (small brown version) + *A58 HD38750 1981, Actronics(Hanzawa) Challenge Racer/Ludotronic(Hanzawa) Grand Prix Turbo + *A62 HD38750 1982, Actronics(Hanzawa) Pack'n Maze + @A67 HD38750 1982, Romtec Pucki & Monsters (ET-803) + + @A04 HD38800 1980, Gakken Heiankyo Alien + A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp + *A20 HD38800 1981, Entex Super Space Invader 2 + @A25 HD38800 1981, Coleco Alien Attack + @A27 HD38800 1981, Bandai Packri Monster + @A31 HD38800 1981, Entex Select-A-Game cartridge: Space Invader 2 -> sag.cpp - also used in 2nd version of Super Space Invader 2! + A36 HD38800 1981, Entex Select-A-Game cartridge: Pac-Man 2 -> " + A37 HD38800 1981, Entex Select-A-Game cartridge: Baseball 4 -> " + A38 HD38800 1981, Entex Select-A-Game cartridge: Pinball -> " + *A41 HD38800 1982, Gakken Puck Monster + *A42 HD38800 1981, Akai GX-77 + *A51 HD38800 1981, Actronics(Hanzawa) Twinvader (larger white version) + @A70 HD38800 1982, Coleco Galaxian + @A73 HD38800 1982, Mattel Star Hawk (PT-317B) + @A77 HD38800 1982, Bandai Frisky Tom (PT-327A) + @A88 HD38800 1982, Tomy Tron (THN-02) + @B01 HD38800 1982, Gakken Crazy Kong + @B19 HD38800 1982, Bandai Zaxxon + @B23 HD38800 1982, Tomy Kingman (THF-01II) + @B24 HD38800 1982, Actronics(Hanzawa) Wanted G-Man + @B29 HD38800 1984, Tomy Bombman + *B31 HD38800 1983, Romtec Frog Prince (ET-806) + *B35 HD38800 1983, Bandai Gundam vs Gelgoog Zaku + @B42 HD38800 1983, Bandai Kiteyo Parman + @B43 HD38800 1983, Bandai Dokodemo Dorayaki Doraemon (PT-412) + @B48 HD38800 1983, Bandai Toukon Juohmaru + @B52 HD38800 1983, Bandai Ultraman Monster Battle (PT-424) + + @A09 HD38820 1980, Mattel World Championship Baseball + @A13 HD38820 1981, Entex Galaxian 2 + @A23 HD38820 1981, Entex Pac Man 2 + @A28 HD38820 1981, Coleco Pac-Man (ver 1) + @A29 HD38820 1981, Coleco Pac-Man (ver 2) + @A32 HD38820 1982, Gakken Super Cobra + *A38 HD38820 1982, Entex Crazy Climber + @A42 HD38820 1982, Entex Stargate + @A43 HD38820 1982, Entex Turtles + @A45 HD38820 1982, Coleco Donkey Kong + @A49 HD38820 1983, Bandai Zackman + @L53 HD38820 1983, Gakken Defender + @A61 HD38820 1983, Coleco Ms. Pac-Man + *A62 HD38820 1983, Coleco Zaxxon + @A63 HD38820 1983, Bandai Pengo + @A65 HD38820 1983, Bandai Burger Time (PT-389) + @A69 HD38820 1983, Gakken Dig Dug + @A70 HD38820 1983, Parker Brothers Q*Bert + @A75 HD38820 1983, Bandai Go Go Dynaman + @A85 HD38820 1984, Bandai Machine Man (PT-438) + @A88 HD38820 1984, Bandai Pair Match (PT-460) (1/2) + @A89 HD38820 1984, Bandai Pair Match (PT-460) (2/2) + + A34 HD44801 1981, SciSys Mini Chess -> saitek_minichess.cpp + A50 HD44801 1981, CXG Sensor Computachess -> cxg_scptchess.cpp + A75 HD44801 1982, Alpha 8201 protection MCU -> machine/alpha8201.* + *A85 HD44801 1982, SciSys Travel Sensor / Travel Mate / Chesspartner 5000/6000 + *A92 HD44801 1982, SciSys Play Bridge Computer + B35 HD44801 1983, Alpha 8302 protection MCU (see 8201) + B42 HD44801 1983, Alpha 8303 protection MCU (see 8201) + *B43 HD44801 1983, Alpha 8304 protection MCU (see 8201) + C57 HD44801 1985, Alpha 8505 protection MCU (see 8201) + C89 HD44801 1985, CXG Portachess (1985 version) -> cxg_scptchess.cpp + + *A86 HD44820 1983, Chess King Pocket Micro + *B63 HD44820 1985, CXG Pocket Chess (12 buttons) + + *A13 HD44840 1982, CXG Computachess II + *A14 HD44840 1982, CXG Computachess II / Advanced Portachess + + *B55 HD44860 1987, Saitek Pro Bridge 100 + + *A04 HD44868 1984, SciSys Rapier + *A07 HD44868 1984, Chess King Pocket Micro Deluxe + *A12 HD44868 1985, SciSys MK 10 / Pocket Chess + *A14 HD44868 1985, SciSys Kasparov Plus + + (* means undumped unless noted, @ denotes it's in this driver) + +============================================================================ + +ROM source notes when dumped from another model, but confident it's the same: +- gckong: CGL Super Kong +- ggdman: Bandai Kampf der Monster +- ghalien: CGL Earth Invaders +- kingman: Tandy Kingman +- wantgman: Ludotronic Operation 'Z' +- zackman: Tandy Zackman + +TODO: +- cgalaxn discrete sound (alien attacking sound effect) +- gckong glitchy jump on 1st level (rarely happens), caused by MCU stack overflow. + It can be tested by jumping up repeatedly at the start position under the ladder, + if the glitch happens there, you can jump onto the 2nd floor. +- epacman2 booting the game in demo mode, pacman should take the shortest route to + the upper-left power pill: mcu cycle/interrupt timing related +- kevtris's HMCS40 ROM dumps are incomplete, missing MCU factory test code from + the 2nd half of the ROM, none of the games access it though and it's impossible + to execute unless the chip is in testmode. +- Though very uncommon when compared to games with LED/lamp display, some + games may manipulate VFD plate brightness by strobing it longer/shorter, + eg. cgalaxn when a ship explodes. +- bzaxxon 3D effect is difficult to simulate +- improve/redo SVG for: bzaxxon, bbtime +- add SVG for: ggdman, ktparman, tkjmaru, gdefender, bombman, wantgman, puckimon +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/hmcs40/hmcs40.h" +#include "cpu/cop400/cop400.h" +#include "video/pwm.h" +#include "machine/gen_latch.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork (complete) +#include "pairmtch.lh" + +// internal artwork (bezel overlay) +#include "bambball.lh" +#include "gckong.lh" +#include "mwcbaseb.lh" +#include "msthawk.lh" +#include "packmon.lh" + +#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_hmcs40_state : public driver_device +{ +public: + hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<7> m_inputs; // max 7 + + // misc common + u8 m_r[8] = { }; // MCU R ports write data (optional) + u16 m_d = 0; // MCU D port write data (optional) + u8 m_int[2] = { }; // MCU INT0/1 pins state + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u64 m_plate = 0; // VFD current column data + + u16 read_inputs(int columns); + void refresh_interrupts(void); + void set_interrupt(int line, int state); +}; + + +// machine start/reset + +void hh_hmcs40_state::machine_start() +{ + // register for savestates + save_item(NAME(m_r)); + save_item(NAME(m_int)); + save_item(NAME(m_d)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_hmcs40_state::machine_reset() +{ + refresh_interrupts(); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_hmcs40_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + +// interrupt handling + +void hh_hmcs40_state::refresh_interrupts() +{ + for (int i = 0; i < 2; i++) + m_maincpu->set_input_line(i, m_int[i] ? ASSERT_LINE : CLEAR_LINE); +} + +void hh_hmcs40_state::set_interrupt(int line, int state) +{ + line = line ? 1 : 0; + state = state ? 1 : 0; + + if (state != m_int[line]) + { + if (machine().phase() >= machine_phase::RESET) + m_maincpu->set_input_line(line, state ? ASSERT_LINE : CLEAR_LINE); + m_int[line] = state; + } +} + +INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line) +{ + set_interrupt((int)param, newval); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Actronics / Hanzawa Wanted G-Man + * Hitachi HD38800B24 MCU + * cyan/red VFD display + + known releases: + - World: Wanted G-Man, published by Actronics + - France: Operation 'Z', published by Ludotronic + +***************************************************************************/ + +class wantgman_state : public hh_hmcs40_state +{ +public: + wantgman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void wantgman(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void wantgman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void wantgman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void wantgman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D6: input mux + m_inp_mux = data >> 1 & 0x3f; + + // D1-D9,D13,D14: vfd grid + m_grid = (data >> 1 & 0x1ff) | (data >> 4 & 0x600); + update_display(); +} + +u16 wantgman_state::input_r() +{ + // D15: multiplexed inputs + return read_inputs(6) & 0x8000; +} + +// config + +static INPUT_PORTS_START( wantgman ) + PORT_START("IN.0") // D1 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D2 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // D3 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.3") // D4 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.4") // D5 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Skill / Start / Jump") + + PORT_START("IN.5") // D6 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Demo") +INPUT_PORTS_END + +void wantgman_state::wantgman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_d().set(FUNC(wantgman_state::grid_w)); + m_maincpu->read_d().set(FUNC(wantgman_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 16); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( wantgman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b24", 0x0000, 0x1000, CRC(ad1dfb26) SHA1(f2ef0ec98116a8a38e97299e3e3b2b0129d78c04) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "wantgman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Dribble Away Basketball (manufactured in Japan) + * PCB label Emix Corp. ET-05 + * Hitachi HD38750A08 MCU + * cyan VFD display Emix-106, with bezel overlay + +***************************************************************************/ + +class bambball_state : public hh_hmcs40_state +{ +public: + bambball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bambball(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void bambball_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x(,D0-D3): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); + m_display->matrix(m_grid, plate); +} + +void bambball_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D10: input mux + m_inp_mux = data >> 7 & 0xf; + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D3: more plates (update display there) + plate_w(3 + 1, data & 0xf); +} + +u8 bambball_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( bambball ) + PORT_START("IN.0") // D7 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dribble Low") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Dribble Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Dribble High") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Shoot") + + PORT_START("IN.1") // D8 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // D9 port R0x + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Display") + + PORT_START("IN.3") // D10 port R0x + PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void bambball_state::bambball(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(bambball_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_d().set(FUNC(bambball_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 478); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + config.set_default_layout(layout_bambball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bambball ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 281988, "screen", 0) + ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Knock-Em Out Boxing + * PCB label Emix Corp. ET-06B + * Hitachi HD38750A07 MCU + * cyan VFD display Emix-103, with blue or green color overlay + +***************************************************************************/ + +class bmboxing_state : public hh_hmcs40_state +{ +public: + bmboxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bmboxing(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void bmboxing_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u32 plate = bitswap<16>(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8); + m_display->matrix(grid, plate); +} + +void bmboxing_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x: vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmboxing_state::grid_w(u16 data) +{ + // D13: speaker out + m_speaker->level_w(data >> 13 & 1); + + // D9-D12: input mux + m_inp_mux = data >> 9 & 0xf; + + // D4-D12: vfd grid + m_grid = data >> 4 & 0x1ff; + update_display(); +} + +u8 bmboxing_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + * left = P2 side * * right = P1 side * + + [ BACK ] [ HIGH ] (players sw) [ HIGH ] [ BACK ] + 1<--->2 [START/ + [NORMAL] [MEDIUM] RESET] [MEDIUM] [NORMAL] + 1<---OFF--->2 + [ DUCK ] [ LOW ] (skill lvl sw) [ LOW ] [ DUCK ] +*/ + +static INPUT_PORTS_START( bmboxing ) + PORT_START("IN.0") // D9 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Punch High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Punch Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P1 Punch Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D10 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Position Normal") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Position Back") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P1 Position Ducking") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // D11 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Punch High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Punch Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P2 Punch Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D12 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Position Normal") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Position Back") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P2 Position Ducking") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // port D + PORT_CONFNAME( 0x0001, 0x0000, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0001, "2" ) + PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0002, "2" ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bmboxing_state::bmboxing(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(bmboxing_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_d().set(FUNC(bmboxing_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.4"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 529); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmboxing ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 257144, "screen", 0) + ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Frisky Tom (manufactured in Japan) + * PCB label Kaken Corp., PT-327A + * Hitachi HD38800A77 MCU + * cyan/red/green VFD display Futaba DM-43ZK 2E + +***************************************************************************/ + +class bfriskyt_state : public hh_hmcs40_state +{ +public: + bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bfriskyt(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bfriskyt_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21); + m_display->matrix(grid, plate); +} + +void bfriskyt_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bfriskyt_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D5: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x3f0000); + update_display(); +} + +void bfriskyt_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bfriskyt ) + PORT_START("IN.0") // D11 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.5") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void bfriskyt_state::bfriskyt(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_d().set(FUNC(bfriskyt_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 675); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 22); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bfriskyt ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 413577, "screen", 0) + ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Packri Monster (manufactured in Japan) + * PCB label DM-21ZA2 + * Hitachi HD38800A27 MCU + * cyan/red/green VFD display Futaba DM-21ZK 2B, with bezel overlay + + known releases: + - Japan: FL Packri Monster, published by Bandai + - USA(World?): Packri Monster, published by Bandai + - USA/Canada: Hungry Monster, published by Tandy + - other: Gobble Man/Ogre Monster, published by Tandy + +***************************************************************************/ + +class packmon_state : public hh_hmcs40_state +{ +public: + packmon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void packmon(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void packmon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update 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,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7); + m_display->matrix(grid, plate); +} + +void packmon_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D11-D15: input mux + m_inp_mux = data >> 11 & 0x1f; + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3: plate 9-12 (update display there) + plate_w(4, data & 0xf); +} + +u16 packmon_state::input_r() +{ + // D5: multiplexed inputs + return read_inputs(5) & 0x20; +} + +// config + +static INPUT_PORTS_START( packmon ) + PORT_START("IN.0") // D11 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START ) + + PORT_START("IN.1") // D12 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D13 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // D14 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.4") // D15 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) +INPUT_PORTS_END + +void packmon_state::packmon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_d().set(FUNC(packmon_state::grid_w)); + m_maincpu->read_d().set(FUNC(packmon_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 680); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + config.set_default_layout(layout_packmon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( packmon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 224386, "screen", 0) + ROM_LOAD( "packmon.svg", 0, 224386, CRC(b2ee5b6b) SHA1(e53b4d5a4118cc5fbec4656580c2aab76af8f8d7) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Zaxxon (manufactured in Japan, licensed from Sega) + * PCB label FL Zaxxon + * Hitachi HD38800B19 MCU + * cyan/red/blue VFD display NEC FIP11BM24T no. 4-8, half of it reflected + with a one-way mirror to give the illusion of a 3D display + +***************************************************************************/ + +class bzaxxon_state : public hh_hmcs40_state +{ +public: + bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bzaxxon(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bzaxxon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); + u32 plate = bitswap<24>(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; + m_display->matrix(grid, plate); +} + +void bzaxxon_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D10: input mux + u8 inp_mux = data >> 7 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0-D2: plate 7-9 (update display there) + plate_w(4, data & 7); +} + +void bzaxxon_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( bzaxxon ) + PORT_START("IN.0") // D7 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.1") // D8 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.2") // D9 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.3") // D10 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.5") // port D + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bzaxxon_state::bzaxxon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 450000); // approximation + m_maincpu->write_r<0>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_d().set(FUNC(bzaxxon_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(613, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bzaxxon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 521080, "screen", 0) + ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Zackman "The Pit, FL Exploration of Space" (manufactured in Japan) + * Hitachi QFP HD38820A49 MCU + * cyan/red/yellow VFD display Futaba DM-53Z 3E, with color overlay + + known releases: + - World: Zackman, published by Bandai + - USA: Zackman, published by Tandy + +***************************************************************************/ + +class zackman_state : public hh_hmcs40_state +{ +public: + zackman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void zackman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void zackman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D0,D1): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<32>(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12); + m_display->matrix(grid, plate); +} + +void zackman_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D11-D14: input mux + u8 inp_mux = data >> 11 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0,D1: plate 12,13 (update display there) + plate_w(7, data & 3); +} + +void zackman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( zackman ) + PORT_START("IN.0") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void zackman_state::zackman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_d().set(FUNC(zackman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(487, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( zackman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 910689, "screen", 0) + ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Pengo (manufactured in Japan, licensed from Sega) + * PCB label FL Pengo(in katakana) + * Hitachi QFP HD38820A63 MCU + * cyan/red/blue VFD display Futaba DM-68ZK 3D DM-63 + +***************************************************************************/ + +class bpengo_state : public hh_hmcs40_state +{ +public: + bpengo_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bpengo(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bpengo_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<32>(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bpengo_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bpengo_state::grid_w(u16 data) +{ + // D10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D0-D7: vfd grid + m_grid = data & 0xff; + update_display(); +} + +void bpengo_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( bpengo ) + PORT_START("IN.0") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) + + PORT_START("IN.5") // port D + PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0800, DEF_STR( On ) ) + PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bpengo_state::bpengo(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_d().set(FUNC(bpengo_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 759); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 25); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bpengo ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 565069, "screen", 0) + ROM_LOAD( "bpengo.svg", 0, 565069, CRC(fb25ffeb) SHA1(fb4db5120f1e35e39c7fb2da4af3aa63417efaf1) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Burger Time (manufactured in Japan, licensed from Data East) + * PCB label Kaken Corp. PT-389 Burger Time + * Hitachi QFP HD38820A65 MCU + * cyan/red/green VFD display NEC FIP6AM25T no. 21-21 + +***************************************************************************/ + +class bbtime_state : public hh_hmcs40_state +{ +public: + bbtime_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bbtime(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bbtime_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); + u32 plate = bitswap<32>(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; + m_display->matrix(grid, plate); +} + +void bbtime_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bbtime_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(data >> 3 & 1); + + // D10-D14: input mux + u8 inp_mux = data >> 10 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D4-D9: vfd grid + m_grid = data >> 4 & 0x3f; + update_display(); +} + +void bbtime_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bbtime ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.5") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void bbtime_state::bbtime(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_d().set(FUNC(bbtime_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(379, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6, 28); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bbtime ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 461605, "screen", 0) + ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Kiteyo Parman + * Hitachi HD38800B42 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class ktparman_state : public hh_hmcs40_state +{ +public: + ktparman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ktparman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void ktparman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void ktparman_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(data >> 3 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D2: vfd plate (update display there) + plate_w(4, data & 7); +} + +// config + +static INPUT_PORTS_START( ktparman ) + PORT_START("IN.0") // port D + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void ktparman_state::ktparman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_d().set(FUNC(ktparman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 19); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ktparman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b42", 0x0000, 0x1000, CRC(ba1f7939) SHA1(1038d33923fcc87b5dd95954d5f964064a10ff9d) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "ktparman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Dokodemo Dorayaki Doraemon (FL LSI Game Push Up) (manufactured in Japan) + * PCB label Kaken Corp PT-412 FL-Doreamon(in katakana) + * Hitachi HD38800B43 MCU + * cyan/red/blue VFD display Futaba DM-71 + +***************************************************************************/ + +class bdoramon_state : public hh_hmcs40_state +{ +public: + bdoramon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bdoramon(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bdoramon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); + u32 plate = bitswap<24>(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bdoramon_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D3: plate 15-18 (update display there) + plate_w(4, data & 0xf); +} + +// config + +static INPUT_PORTS_START( bdoramon ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) + + PORT_START("IN.2") // port D + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // port R2x + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void bdoramon_state::bdoramon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->read_r<2>().set_ioport("IN.3"); + m_maincpu->write_r<3>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_d().set(FUNC(bdoramon_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.2"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 668); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bdoramon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 624751, "screen", 0) + ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Toukon Juohmaru + * Hitachi HD38800B48 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class tkjmaru_state : public hh_hmcs40_state +{ +public: + tkjmaru_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void tkjmaru(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void tkjmaru_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void tkjmaru_state::grid_w(u16 data) +{ + // D4-D7: input mux + m_inp_mux = data >> 4 & 0xf; + + // D10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // D11-D15: vfd grid + m_grid = data >> 11 & 0x1f; + + // D0: vfd plate (update display there) + plate_w(4, data & 1); +} + +u16 tkjmaru_state::input_r() +{ + // D3: multiplexed inputs, D8,D9: fixed inputs + return read_inputs(4) | m_inputs[4]->read(); +} + +// config + +static INPUT_PORTS_START( tkjmaru ) + PORT_START("IN.0") // D4 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D5 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // D6 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.3") // D7 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.4") // D8,D9 + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x200, 0x000, "Factory Test" ) + PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x200, DEF_STR( On ) ) +INPUT_PORTS_END + +void tkjmaru_state::tkjmaru(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_d().set(FUNC(tkjmaru_state::grid_w)); + m_maincpu->read_d().set(FUNC(tkjmaru_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 17); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tkjmaru ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b48", 0x0000, 0x1000, CRC(249f357d) SHA1(0b5dad187a035db622790eb092b7be1ca7c57d97) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "tkjmaru.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Ultraman Monster Battle (FL LSI Game Push Up) (manufactured in Japan) + * PCB label Kaken Corp. PT-424 FL Ultra Man + * Hitachi HD38800B52 MCU + * cyan/red/blue VFD display NEC FIP8BM25T no. 21-8 2 + +***************************************************************************/ + +class bultrman_state : public hh_hmcs40_state +{ +public: + bultrman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bultrman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bultrman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2); + m_display->matrix(grid, plate); +} + +void bultrman_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D2: plate 15-17 (update display there) + plate_w(4, data & 7); +} + +// config + +static INPUT_PORTS_START( bultrman ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_CONFNAME( 0x0010, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0010, DEF_STR( On ) ) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bultrman_state::bultrman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 350000); // approximation + m_maincpu->write_r<0>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_d().set(FUNC(bultrman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 673); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bultrman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 405717, "screen", 0) + ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Go Go Dynaman + * Hitachi HD38820A75 MCU + * cyan/red/blue VFD display + + known releases: + - Japan: Go Go Dynaman, published by Bandai + - Germany: Kampf der Monster, published by Bandai + +***************************************************************************/ + +class ggdman_state : public hh_hmcs40_state +{ +public: + ggdman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ggdman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void ggdman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ggdman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R5x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ggdman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D6-D9: input mux + u8 inp_mux = data >> 6 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D11-D15: vfd grid + m_grid = data >> 11 & 0x1f; + update_display(); +} + +void ggdman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( ggdman ) + PORT_START("IN.0") // D6 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.1") // D7 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.2") // D8 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.3") // D9 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void ggdman_state::ggdman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_d().set(FUNC(ggdman_state::grid_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 24); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ggdman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a75", 0x0000, 0x1000, CRC(14a9c064) SHA1(253a5decbf4219c1b457280e301b82388694e49f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "ggdman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Machine Man (FL Flat Type) (manufactured in Japan) + * PCB label Kaken PT-438 + * Hitachi QFP HD38820A85 MCU + * cyan/red/green VFD display NEC FIP5CM33T no. 4 21 + +***************************************************************************/ + +class machiman_state : public hh_hmcs40_state +{ +public: + machiman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void machiman(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void machiman_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18); + m_display->matrix(m_grid, plate); +} + +void machiman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x,R6012: vfd plate + int shift = (offset == 6) ? 16 : offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void machiman_state::grid_w(u16 data) +{ + // D13: speaker out + m_speaker->level_w(data >> 13 & 1); + + // D0-D4: vfd grid + m_grid = data & 0x1f; + update_display(); +} + +// config + +static INPUT_PORTS_START( machiman ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_BIT( 0x3fff, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY +INPUT_PORTS_END + +void machiman_state::machiman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_d().set(FUNC(machiman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1534, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(5, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( machiman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 374097, "screen", 0) + ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Pair Match (manufactured in Japan) + * PCB label Kaken Corp. PT-460 + * Hitachi QFP HD38820A88 MCU(main), HD38820A89(audio) + * cyan/red VFD display + + This is a memory game, the difference is instead of pictures, the player + needs to match sound effects. It has an extra MCU for sound. The case is + shaped like a glossy black pyramid. Star Trek fans will recognize it as + a prop used in TNG Ten Forward. + +***************************************************************************/ + +class pairmtch_state : public hh_hmcs40_state +{ +public: + pairmtch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_audiocpu(*this, "audiocpu"), + m_soundlatch(*this, "soundlatch%u", 0) + { } + + void pairmtch(machine_config &config); + +private: + required_device m_audiocpu; + required_device_array m_soundlatch; + + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); + + void sound_w(u8 data); + void sound2_w(u8 data); + void speaker_w(u16 data); +}; + +// handlers: maincpu side + +void pairmtch_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void pairmtch_state::plate_w(offs_t offset, u8 data) +{ + // R2x,R3x,R6x: vfd plate + int shift = (offset == 6) ? 8 : (offset-2) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void pairmtch_state::grid_w(u16 data) +{ + // D7: sound reset (to audiocpu reset line) + m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); + + // D9: sound start (to audiocpu INT0) + m_audiocpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); + + // D10,D15: input mux + m_inp_mux = (data >> 10 & 1) | (data >> 14 & 2); + + // D0-D5: vfd grid + m_grid = data & 0x3f; + update_display(); +} + +u8 pairmtch_state::input_r() +{ + // R4x: multiplexed inputs + return read_inputs(2); +} + +void pairmtch_state::sound_w(u8 data) +{ + // R5x: soundlatch (to audiocpu R2x) + m_soundlatch[0]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); +} + +// handlers: audiocpu side + +void pairmtch_state::sound2_w(u8 data) +{ + // R2x: soundlatch (to maincpu R5x) + m_soundlatch[1]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); +} + +void pairmtch_state::speaker_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1: sound ack (to maincpu INT0) + m_maincpu->set_input_line(0, (data & 2) ? ASSERT_LINE : CLEAR_LINE); +} + +// config + +static INPUT_PORTS_START( pairmtch ) + PORT_START("IN.0") // D10 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.1") // D15 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // port D + PORT_CONFNAME( 0x0040, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0040, DEF_STR( On ) ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_CONFNAME( 0x0800, 0x0800, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x0800, "1" ) + PORT_CONFSETTING( 0x0000, "2" ) + PORT_CONFNAME( 0x3000, 0x2000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x2000, "1" ) + PORT_CONFSETTING( 0x1000, "2" ) + PORT_CONFSETTING( 0x0000, "3" ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x86bf, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pairmtch_state::pairmtch(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<2>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->read_r<4>().set(FUNC(pairmtch_state::input_r)); + m_maincpu->write_r<5>().set(FUNC(pairmtch_state::sound_w)); + m_maincpu->read_r<5>().set(m_soundlatch[1], FUNC(generic_latch_8_device::read)); + m_maincpu->write_r<6>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->write_d().set(FUNC(pairmtch_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.2"); + + HD38820(config, m_audiocpu, 400000); // approximation + m_audiocpu->write_r<2>().set(FUNC(pairmtch_state::sound2_w)); + m_audiocpu->read_r<2>().set(m_soundlatch[0], FUNC(generic_latch_8_device::read)); + m_audiocpu->write_d().set(FUNC(pairmtch_state::speaker_w)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 12); + config.set_default_layout(layout_pairmtch); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); + + GENERIC_LATCH_8(config, m_soundlatch[0]); + GENERIC_LATCH_8(config, m_soundlatch[1]); +} + +// roms + +ROM_START( pairmtch ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Alien Attack (manufactured in Taiwan) + * Hitachi HD38800A25 MCU + * cyan/red VFD display Futaba DM-19Z 1J + + It looks like Coleco took Gakken's Heiankyo Alien and turned it into a more + action-oriented game. + +***************************************************************************/ + +class alnattck_state : public hh_hmcs40_state +{ +public: + alnattck_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void alnattck(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void alnattck_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15); + m_display->matrix(m_grid, plate); +} + +void alnattck_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D13: input mux + m_inp_mux = data >> 7 & 0x7f; + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3: plate 16-19 (update display there) + plate_w(4, data & 0xf); +} + +u16 alnattck_state::input_r() +{ + // D5: multiplexed inputs + return read_inputs(7) & 0x20; +} + +// config + +static INPUT_PORTS_START( alnattck ) + PORT_START("IN.0") // D7 line D5 + PORT_CONFNAME( 0x20, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x20, "2" ) + + PORT_START("IN.1") // D8 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D9 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // D10 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.4") // D11 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.5") // D12 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Move") + + PORT_START("IN.6") // D13 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Fire") +INPUT_PORTS_END + +void alnattck_state::alnattck(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_d().set(FUNC(alnattck_state::grid_w)); + m_maincpu->read_d().set(FUNC(alnattck_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 700); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alnattck ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 564271, "screen", 0) + ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Donkey Kong (manufactured in Taiwan, licensed from Nintendo) + * PCB label Coleco Rev C 75790 DK + * Hitachi QFP HD38820A45 MCU + * RC circuit for speaker volume decay + * cyan/red VFD display Futaba DM-47ZK 2K, with color overlay + +***************************************************************************/ + +class cdkong_state : public hh_hmcs40_state +{ +public: + cdkong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void cdkong(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void cdkong_state::machine_start() +{ + hh_hmcs40_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void cdkong_state::speaker_update() +{ + if (m_r[1] & 8) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.02; +} + +void cdkong_state::update_display() +{ + u32 plate = bitswap<32>(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; + m_display->matrix(m_grid, plate); +} + +void cdkong_state::plate_w(offs_t offset, u8 data) +{ + // R13: speaker on + m_r[offset] = data; + speaker_update(); + + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void cdkong_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(BIT(data, 3)); + + // D4-D14: vfd grid + m_grid = data >> 4 & 0x7ff; + update_display(); +} + +// config + +static INPUT_PORTS_START( cdkong ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cdkong_state::cdkong(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_d().set(FUNC(cdkong_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(605, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( cdkong ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359199, "screen", 0) + ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Galaxian (manufactured in Taiwan) + * PCB label Coleco Rev A 75718 + * Hitachi HD38800A70 MCU + * discrete sound (when alien attacks) + * cyan/red VFD display Futaba DM-36Z 2H, with color overlay + + Select game mode on start: + - P1 Left: Galaxian (default game) + - P1 Right: Midway's Attackers + - P2 Left: Head-to-Head Galaxian (2-player mode, short) + - P2 Right: Head-to-Head Galaxian (2-player mode, long) + +***************************************************************************/ + +class cgalaxn_state : public hh_hmcs40_state +{ +public: + cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cgalaxn(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(player_switch); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cgalaxn_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3); + u16 plate = bitswap<16>(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13); + m_display->matrix(grid, plate); +} + +INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch) +{ + // 2-player switch directly enables plate 14 + m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000); + update_display(); +} + +void cgalaxn_state::grid_w(offs_t offset, u8 data) +{ + // R10,R11: input mux + if (offset == 1) + m_inp_mux = data & 3; + + // R1x-R3x: vfd grid + int shift = (offset - 1) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void cgalaxn_state::plate_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1: start alien attack whine sound effect (edge triggered) + + // D2-D15: vfd plate + m_plate = (m_plate & 0x4000) | (data >> 2 & 0x3fff); + update_display(); +} + +u8 cgalaxn_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( cgalaxn ) + PORT_START("IN.0") // R10 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // R11 port R0x + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, cgalaxn_state, player_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.3") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void cgalaxn_state::cgalaxn(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cgalaxn_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_r<2>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_r<3>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_d().set(FUNC(cgalaxn_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(526, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 15); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cgalaxn ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 712204, "screen", 0) + ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Pac-Man (manufactured in Taiwan, licensed from Midway) + * PCB label Coleco 75690 + * Hitachi QFP HD38820A28/29 MCU + * cyan/red VFD display Futaba DM-34Z 2A, with color overlay + + known releases: + - USA: Pac-Man, by Coleco (name-license from Midway) + - Japan: Super Puck Monster, published by Gakken + + Select game mode on start: + - P1 Right: Pac-Man (default game) + - P1 Left: Head-to-Head Pac-Man (2-player mode) + - P1 Up: Eat & Run + - P1 Down: Demo + + BTANB: 1st version doesn't show the whole maze on power-on + +***************************************************************************/ + +class cpacman_state : public hh_hmcs40_state +{ +public: + cpacman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cpacman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cpacman_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x(,D1,D2): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); + u32 plate = bitswap<32>(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7); + m_display->matrix(grid, plate); +} + +void cpacman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D13-D15: input mux + m_inp_mux = data >> 13 & 7; + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D1,D2: plate 8,14 (update display there) + plate_w(6 + 1, data >> 1 & 3); +} + +u8 cpacman_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cpacman ) + PORT_START("IN.0") // D13 port R0x + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D14 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D15 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) +INPUT_PORTS_END + +void cpacman_state::cpacman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cpacman_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_d().set(FUNC(cpacman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(484, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 27); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cpacman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359765, "screen", 0) + ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) +ROM_END + +ROM_START( cpacmanr1 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359765, "screen", 0) + ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Ms. Pac-Man (manufactured in Taiwan, licensed from Midway) + * PCB label Coleco 911171 + * Hitachi QFP HD38820A61 MCU + * cyan/red VFD display Futaba DM-60Z 3I, with color overlay + + Select game mode on start: + - P1 Left: Ms. Pac-Man (default game) + - P1 Down: Head-to-Head Ms. Pac-Man (2-player mode) + - P1 Up: Demo + + BTANB: in demo-mode, she hardly ever walks to the upper two rows + +***************************************************************************/ + +class cmspacmn_state : public hh_hmcs40_state +{ +public: + cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cmspacmn(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cmspacmn_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x(,D0,D1): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); + u32 plate = bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; + m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate); +} + +void cmspacmn_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D13-D15: input mux + m_inp_mux = data >> 13 & 7; + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0,D1: more plates (update display there) + plate_w(6 + 1, data & 3); +} + +u8 cmspacmn_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cmspacmn ) + PORT_START("IN.0") // D13 port R0x + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D14 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + + PORT_START("IN.2") // D15 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) +INPUT_PORTS_END + +void cmspacmn_state::cmspacmn(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cmspacmn_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_d().set(FUNC(cmspacmn_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(481, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 33); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cmspacmn ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 849327, "screen", 0) + ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Galaxian 2 (manufactured in Japan) + * PCB labels ENTEX GALAXIAN PB-118/116/097 80-210137/135/114 + * Hitachi QFP HD38820A13 MCU + * cyan/red/green VFD display Futaba DM-20 + + known releases: + - USA: Galaxian 2, published by Entex + - UK: Astro Invader, published by Hales/Entex + +***************************************************************************/ + +class egalaxn2_state : public hh_hmcs40_state +{ +public: + egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void egalaxn2(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void egalaxn2_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); + u32 plate = bitswap<24>(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); + m_display->matrix(grid, plate); +} + +void egalaxn2_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D4: input mux + m_inp_mux = data >> 1 & 0xf; + + // D1-D15: vfd grid + m_grid = data >> 1 & 0x7fff; + update_display(); +} + +void egalaxn2_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x: vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +u8 egalaxn2_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( egalaxn2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) // for Demo mode: need to hold down Fire button at power-on + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) +INPUT_PORTS_END + +void egalaxn2_state::egalaxn2(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(egalaxn2_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_d().set(FUNC(egalaxn2_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(505, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(15, 24); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( egalaxn2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 507945, "screen", 0) + ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Pac Man 2 (manufactured in Japan) + * PCB labels ENTEX PAC-MAN PB-093/094 80-210149/50/51 + * Hitachi QFP HD38820A23 MCU + * cyan/red VFD display Futaba DM-28Z 1G(cyan Pac-Man) or DM-28 1K(orange Pac-Man) + + 2 VFD revisions are known, the difference is Pac-Man's color: cyan or red. + +***************************************************************************/ + +class epacman2_state : public egalaxn2_state +{ +public: + epacman2_state(const machine_config &mconfig, device_type type, const char *tag) : + egalaxn2_state(mconfig, type, tag) + { } + + void epacman2(machine_config &config); +}; + +// handlers are identical to Galaxian 2, so we can use those + +// config + +static INPUT_PORTS_START( epacman2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Skill Control") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Demo Light Test") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void epacman2_state::epacman2(machine_config &config) +{ + egalaxn2(config); + + // video hardware + screen_device *screen = subdevice("screen"); + screen->set_size(505, 1080); + screen->set_visarea_full(); +} + +// roms + +ROM_START( epacman2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 262480, "screen", 0) + ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) ) +ROM_END + +ROM_START( epacman2r ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 262483, "screen", 0) + ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Super Space Invader 2 (black version) + * Hitachi HD38800A31 MCU + * cyan/red VFD display + + This version has the same MCU as the Select-A-Game cartridge. Maybe from + surplus inventory after that console was discontinued?. It was also sold + as "Super Alien Invader 2". + + Hold down the fire button at boot for demo mode to work. + +***************************************************************************/ + +class einvader2_state : public hh_hmcs40_state +{ +public: + einvader2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void einvader2(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void einvader2_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void einvader2_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void einvader2_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D3,D5,D6: input mux + m_inp_mux = (data >> 3 & 1) | (data >> 4 & 6); + + // D1-D12: vfd grid + m_grid = data >> 1 & 0xfff; + update_display(); +} + +u16 einvader2_state::input_r() +{ + // D13-D15: multiplexed inputs + return read_inputs(3) << 13; +} + +// config + +static INPUT_PORTS_START( einvader2 ) + PORT_START("IN.0") // D3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x01) // 1 player + + PORT_START("IN.1") // D5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x00) // demo + + PORT_START("IN.2") // D6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + + PORT_START("FAKE") // shared D3/D5 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "Demo" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) +INPUT_PORTS_END + +void einvader2_state::einvader2(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 450000); // approximation + m_maincpu->write_r<0>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_d().set(FUNC(einvader2_state::grid_w)); + m_maincpu->read_d().set(FUNC(einvader2_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(469, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 14); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvader2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, CRC(10e39521) SHA1(41d86696e518ea071e75ed37d5dc63c0408c262e) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 217430, "screen", 0) + ROM_LOAD( "einvader2.svg", 0, 217430, CRC(b082d9a3) SHA1(67f7e0314c69ba146751ea12cf490805b8660489) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Turtles (manufactured in Japan) + * PCB label 560359 + * Hitachi QFP HD38820A43 MCU + * COP411L sub MCU, label COP411L-KED/N + * cyan/red/green VFD display NEC FIP15BM32T + +***************************************************************************/ + +class eturtles_state : public hh_hmcs40_state +{ +public: + eturtles_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_audiocpu(*this, "audiocpu") + { } + + void eturtles(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int(); } + +protected: + virtual void machine_start() override; + + required_device m_audiocpu; + + void update_int(); + virtual void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + + DECLARE_WRITE_LINE_MEMBER(speaker_w); + void cop_irq_w(u8 data); + u8 cop_latch_r(); + u8 cop_ack_r(); + + u8 m_cop_irq = 0; +}; + +void eturtles_state::machine_start() +{ + hh_hmcs40_state::machine_start(); + save_item(NAME(m_cop_irq)); +} + +// handlers: maincpu side + +void eturtles_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); + u32 plate = bitswap<32>(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); + m_display->matrix(grid, plate | (grid >> 5 & 8)); // grid 8 also forces plate 3 high +} + +void eturtles_state::plate_w(offs_t offset, u8 data) +{ + m_r[offset] = data; + + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void eturtles_state::grid_w(u16 data) +{ + m_d = data; + + // D1-D6: input mux + u8 inp_mux = data >> 1 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int(); + } + + // D1-D15: vfd grid + m_grid = data >> 1 & 0x7fff; + update_display(); +} + +void eturtles_state::update_int() +{ + // INT0/1 on multiplexed inputs, and from COP D0 + u8 inp = read_inputs(6); + set_interrupt(0, (inp & 1) | m_cop_irq); + set_interrupt(1, inp & 2); +} + +// handlers: COP side + +WRITE_LINE_MEMBER(eturtles_state::speaker_w) +{ + // SK: speaker out + m_speaker->level_w(!state); +} + +void eturtles_state::cop_irq_w(u8 data) +{ + // D0: maincpu INT0 (active low) + m_cop_irq = ~data & 1; + update_int(); +} + +u8 eturtles_state::cop_latch_r() +{ + // L0-L3: soundlatch from maincpu R0x + return m_r[0]; +} + +u8 eturtles_state::cop_ack_r() +{ + // G0: ack from maincpu D0 + return m_d & 1; +} + +// config + +static INPUT_PORTS_START( eturtles ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.5") // D6 INT0/1 + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x02, "0 (Demo)" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +void eturtles_state::eturtles(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_d().set(FUNC(eturtles_state::grid_w)); + + COP411(config, m_audiocpu, 215000); // approximation + m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_audiocpu->write_sk().set(FUNC(eturtles_state::speaker_w)); + m_audiocpu->write_d().set(FUNC(eturtles_state::cop_irq_w)); + m_audiocpu->read_l().set(FUNC(eturtles_state::cop_latch_r)); + m_audiocpu->read_g().set(FUNC(eturtles_state::cop_ack_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(484, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(15, 30); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( eturtles ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) ) + + ROM_REGION( 1027626, "screen", 0) + ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Stargate (manufactured in Japan) + * PCB label 5603521/31 + * Hitachi QFP HD38820A42 MCU + * COP411L sub MCU, label ~/B8236 COP411L-KEC/N + * cyan/red/green VFD display NEC FIP15AM32T (EL628-003) no. 2-421, with partial color overlay + +***************************************************************************/ + +class estargte_state : public eturtles_state +{ +public: + estargte_state(const machine_config &mconfig, device_type type, const char *tag) : + eturtles_state(mconfig, type, tag) + { } + + void estargte(machine_config &config); + +private: + virtual void update_display() override; + u8 cop_data_r(); +}; + +// handlers (most of it is in eturtles_state above) + +void estargte_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); + u32 plate = bitswap<32>(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); + m_display->matrix(grid, plate); +} + +u8 estargte_state::cop_data_r() +{ + // L0-L3: soundlatch from maincpu R0x + // L7: ack from maincpu D0 + return m_r[0] | (m_d << 7 & 0x80); +} + +// config + +static INPUT_PORTS_START( estargte ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Inviso") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Smart Bomb") + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Change Direction") + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Thrust") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x00, "0 (Demo)" ) // yes, same value as 1-player, hold the Inviso button at boot to enter demo mode + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.5") // D6 INT0/1 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void estargte_state::estargte(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_d().set(FUNC(estargte_state::grid_w)); + + COP411(config, m_audiocpu, 190000); // approximation + m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_audiocpu->write_sk().set(FUNC(estargte_state::speaker_w)); + m_audiocpu->write_d().set(FUNC(estargte_state::cop_irq_w)); + m_audiocpu->read_l().set(FUNC(estargte_state::cop_data_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 854); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(14, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( estargte ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) ) + + ROM_REGION( 462214, "screen", 0) + ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Heiankyo Alien (manufactured in Japan) + * Hitachi HD38800A04 MCU + * cyan/red VFD display Futaba DM-11Z 1H + + known releases: + - Japan: Heiankyo Alien, published by Gakken + - USA: Earth Invaders, published by CGL + +***************************************************************************/ + +class ghalien_state : public hh_hmcs40_state +{ +public: + ghalien_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ghalien(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void ghalien_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D10-D13): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update 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,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18); + m_display->matrix(grid, plate); +} + +void ghalien_state::grid_w(u16 data) +{ + // D14: speaker out + m_speaker->level_w(data >> 14 & 1); + + // D0-D6: input mux + m_inp_mux = data & 0x7f; + + // D0-D9: vfd grid + m_grid = data & 0x3ff; + + // D10-D13: more plates (update display there) + plate_w(4, data >> 10 & 0xf); +} + +u16 ghalien_state::input_r() +{ + // D15: multiplexed inputs + return read_inputs(7) & 0x8000; +} + +// config + +static INPUT_PORTS_START( ghalien ) + PORT_START("IN.0") // D0 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // D1 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // D2 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.3") // D3 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.4") // D4 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dig") + + PORT_START("IN.5") // D5 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bury") + + PORT_START("IN.6") // D6 line D15 + PORT_CONFNAME( 0x8000, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "Amateur" ) + PORT_CONFSETTING( 0x8000, "Professional" ) +INPUT_PORTS_END + +void ghalien_state::ghalien(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_d().set(FUNC(ghalien_state::grid_w)); + m_maincpu->read_d().set(FUNC(ghalien_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 699); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ghalien ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 462749, "screen", 0) + ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Crazy Kong (manufactured in Japan) + * PCB label ZENY 5603601 + * Hitachi HD38800B01 MCU + * cyan/red/blue VFD display Futaba DM-54Z 2H, with bezel overlay + + known releases: + - Japan: Crazy Kong, published by Gakken + - USA: Super Kong, published by CGL + +***************************************************************************/ + +class gckong_state : public hh_hmcs40_state +{ +public: + gckong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gckong(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gckong_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0,D1): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); + u32 plate = bitswap<32>(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; + m_display->matrix(grid, plate); +} + +void gckong_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D5-D8: input mux + u8 inp_mux = data >> 5 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0,D1: more plates (update display there) + plate_w(4, data & 3); +} + +void gckong_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( gckong ) + PORT_START("IN.0") // D5 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.1") // D6 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.2") // D7 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.3") // D8 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.5") // port D + PORT_CONFNAME( 0x0010, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "A" ) + PORT_CONFSETTING( 0x0010, "B" ) + PORT_BIT( 0xffef, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gckong_state::gckong(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_d().set(FUNC(gckong_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(479, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 32); + config.set_default_layout(layout_gckong); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gckong ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 346588, "screen", 0) + ROM_LOAD( "gckong.svg", 0, 346588, CRC(317af984) SHA1(ff6323526d1f5e46eccf8fa8d979175895be75de) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Super Cobra + * PCB label SUPER COBRA 3000N + * Hitachi QFP HD38820A32 MCU + * cyan/red/green VFD display + + known releases: + - World: Super Cobra, published by Gakken + - USA: Cobra Super Copter, published by Tandy + + There are 2 versions, a green one and a white one. They have the same MCU, + though the VFD has color differences and is more compact. + + BTANB(green version): 1 rocket seems out of place at the top-right area + +***************************************************************************/ + +class gscobra_state : public hh_hmcs40_state +{ +public: + gscobra_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gscobra(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gscobra_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D1-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void gscobra_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D10-D15: input mux + u8 inp_mux = data >> 10 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D1-D3: more plates (update display there) + plate_w(7, data >> 1 & 7); +} + +void gscobra_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(6)); +} + +// config + +static INPUT_PORTS_START( gscobra ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.5") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) +INPUT_PORTS_END + +void gscobra_state::gscobra(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_d().set(FUNC(gscobra_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 852); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 31); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gscobra ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a32", 0x0000, 0x1000, CRC(7bbd130f) SHA1(91dd280e4108fad7ba99191355364bd3217b9d17) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 232919, "screen", 0) + ROM_LOAD( "gscobra.svg", 0, 232919, CRC(5ceb4bfc) SHA1(77c9a45569d780838ebe75818acb2d2ced4bda00) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Defender + * Hitachi HD38820L53 MCU (SDIP) + * cyan/red/green VFD display + +***************************************************************************/ + +class gdefender_state : public hh_hmcs40_state +{ +public: + gdefender_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gdefender(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_display(); + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void gdefender_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void gdefender_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void gdefender_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D3-D15: vfd grid + m_grid = data >> 3 & 0x1fff; + update_display(); +} + +u16 gdefender_state::input_r() +{ + // D1: multiplexed inputs + return read_inputs(4) & 2; +} + +void gdefender_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4) & 1); +} + +// config + +static INPUT_PORTS_START( gdefender ) + PORT_START("IN.0") // D11 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.1") // D12 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Warp") + + PORT_START("IN.2") // D13 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) PORT_NAME("Missile / Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") + + PORT_START("IN.3") // D14 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gdefender_state::gdefender(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_d().set(FUNC(gdefender_state::grid_w)); + m_maincpu->read_d().set(FUNC(gdefender_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(13, 28); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gdefender ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820l53", 0x0000, 0x1000, CRC(fe52bbb4) SHA1(e0250954c3801af9841306c2e1fdf57f3b9edffa) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "gdefender.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Dig Dug (manufactured in Japan) + * PCB label Gakken DIG-DAG KS-004283(A/B) + * Hitachi QFP HD38820A69 MCU + * cyan/red/green VFD display Futaba DM-69Z 3F, with color overlay + +***************************************************************************/ + +class gdigdug_state : public hh_hmcs40_state +{ +public: + gdigdug_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gdigdug(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gdigdug_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<32>(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16); + m_display->matrix(m_grid, plate); +} + +void gdigdug_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D3: more plates (update display there) + plate_w(7, data & 0xf); +} + +void gdigdug_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( gdigdug ) + PORT_START("IN.0") // D11 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.5") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void gdigdug_state::gdigdug(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_d().set(FUNC(gdigdug_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(476, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 32); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gdigdug ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 807990, "screen", 0) + ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel World Championship Baseball (model 3201) + * PCB label MEL-001 Baseball Rev. B + * Hitachi QFP HD38820A09 MCU + * cyan/red/green VFD display Futaba DM-24ZK 1G, with etched overlay + + It was patented under US4372557. To start the game in 2-player mode, simply + turn the game on. For 1-player, turn the game on while holding the 1-key + and use the visitor's side keypad to play offsense. + +***************************************************************************/ + +class mwcbaseb_state : public hh_hmcs40_state +{ +public: + mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void mwcbaseb(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + void speaker_w(u8 data); + u8 input_r(); +}; + +// handlers + +void mwcbaseb_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + m_display->matrix(grid, m_plate); +} + +void mwcbaseb_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x,R6x: vfd plate + int shift = (offset == 6) ? 12 : (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void mwcbaseb_state::grid_w(u16 data) +{ + // D9-D15: input mux + m_inp_mux = data >> 9 & 0x7f; + + // D0-D7: vfd grid + m_grid = data & 0xff; + update_display(); +} + +void mwcbaseb_state::speaker_w(u8 data) +{ + // R50,R51+R52(tied together): speaker out + m_speaker->level_w(data & 7); +} + +u8 mwcbaseb_state::input_r() +{ + // R4x: multiplexed inputs + return read_inputs(7); +} + +// config + +/* physical button layout and labels are like this: + + (visitor team side) (home team side) + COMP PITCH [SCORE] [INNING] + [1] [2] [3] [1] [2] [3] + NEW PITCHER PINCH HITTER NEW PITCHER PINCH HITTER + + [4] [5] [6] [4] [5] [6] + BACKWARD (pitch) FORWARD BACKWARD (pitch) FORWARD + + [7] [8] [9] [7] [8] [9] + + BUNT NORMAL HR SWING BUNT NORMAL HR SWING + [CLEAR] [0] [ENTER] [CLEAR] [0] [ENTER] + SLOW CURVE FAST SLOW CURVE FAST +*/ + +static INPUT_PORTS_START( mwcbaseb ) // P1 = left/visitor, P2 = right/home + PORT_START("IN.0") // D9 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("P2 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("P2 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("P2 1") + + PORT_START("IN.1") // D10 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P2 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 5") + + PORT_START("IN.2") // D11 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 9") + + PORT_START("IN.3") // D12 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Inning") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Score") + + PORT_START("IN.4") // D13 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P1 Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + + PORT_START("IN.5") // D14 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + + PORT_START("IN.6") // D15 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") +INPUT_PORTS_END + +void mwcbaseb_state::mwcbaseb(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<1>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->read_r<4>().set(FUNC(mwcbaseb_state::input_r)); + m_maincpu->write_r<5>().set(FUNC(mwcbaseb_state::speaker_w)); + m_maincpu->write_r<6>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_d().set(FUNC(mwcbaseb_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 478); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 16); + m_display->set_bri_levels(0.001); // cyan elements strobed very briefly? + config.set_default_layout(layout_mwcbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); + static const double speaker_levels[] = { 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, -1.0, -0.5 }; + m_speaker->set_levels(8, speaker_levels); +} + +// roms + +ROM_START( mwcbaseb ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 178441, "screen", 0) + ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) ) +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 msthawk(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void msthawk_state::update_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); + m_display->matrix(grid, plate); +} + +void msthawk_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void msthawk_state::grid_w(u16 data) +{ + // 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); + update_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, 0) 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, 0) 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, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.5") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + 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_refresh_hz(60); + screen.set_size(1920, 696); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 21); + 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, "screen", 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 + * cyan/red/green/darkgreen VFD display Itron CP5137 + +***************************************************************************/ + +class pbqbert_state : public hh_hmcs40_state +{ +public: + pbqbert_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void pbqbert(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void pbqbert_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D8): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<32>(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; + m_display->matrix(m_grid, plate); +} + +void pbqbert_state::grid_w(u16 data) +{ + // D14: speaker out + m_speaker->level_w(data >> 14 & 1); + + // D0-D7: vfd grid + m_grid = data & 0xff; + + // D8: plate 25 (update display there) + plate_w(7, data >> 8 & 1); +} + +// config + +static INPUT_PORTS_START( pbqbert ) + PORT_START("IN.0") // port D + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // up-left + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) // up-right + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // down-right + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) // down-left + PORT_BIT( 0xe1ff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pbqbert_state::pbqbert(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_d().set(FUNC(pbqbert_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.0"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(603, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 30); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( pbqbert ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 456567, "screen", 0) + ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) ) +ROM_END + + + + + +/*************************************************************************** + + Romtec Pucki & Monsters + * Hitachi HD38750A67 MCU + * cyan/red/green VFD display + +***************************************************************************/ + +class puckimon_state : public hh_hmcs40_state +{ +public: + puckimon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void puckimon(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(u16 data); +}; + +// handlers + +void puckimon_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void puckimon_state::grid_w(offs_t offset, u8 data) +{ + // R1x-R3x: vfd grid + int shift = (offset - 1) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // R13: vfd plate + if (offset == 1) + m_plate = (m_plate & 0x7fff) | (data << 12 & 0x8000); + update_display(); +} + +void puckimon_state::plate_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D15: vfd plate + m_plate = (m_plate & 0x8000) | (data >> 1 & 0x7fff); + update_display(); + +} + +// config + +static INPUT_PORTS_START( puckimon ) + PORT_START("IN.0") // port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void puckimon_state::puckimon(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set_ioport("IN.0").invert(); + m_maincpu->write_r<1>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_r<2>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_r<3>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_d().set(FUNC(puckimon_state::plate_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 16); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( puckimon ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a67", 0x0000, 0x0800, CRC(8b493783) SHA1(6c37e67de5d59889abf8a155654f130218cfc12e) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "puckimon.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Tron (manufactured in Japan) + * PCB label THN-02 2E114E07 + * Hitachi HD38800A88 MCU + * cyan/red/green VFD display NEC FIP10AM24T no. 2-8 1 + +***************************************************************************/ + +class tmtron_state : public hh_hmcs40_state +{ +public: + tmtron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void tmtron(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void tmtron_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0); + u32 plate = bitswap<24>(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15); + m_display->matrix(grid, plate); +} + +void tmtron_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtron_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3,D5: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x2f0000); + update_display(); +} + +void tmtron_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( tmtron ) + PORT_START("IN.0") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void tmtron_state::tmtron(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_d().set(FUNC(tmtron_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 662); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 23); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmtron ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 384174, "screen", 0) + ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Kingman (manufactured in Japan) + * PCB label THF-01II 2E138E01/2E128E02 + * Hitachi HD38800B23 MCU + * cyan/red/blue VFD display Futaba DM-65ZK 3A + + known releases: + - World: Kingman, published by Tomy + - USA: Kingman, published by Tandy + +***************************************************************************/ + +class kingman_state : public hh_hmcs40_state +{ +public: + kingman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void kingman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void kingman_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u32 plate = bitswap<24>(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12); + m_display->matrix(grid, plate); +} + +void kingman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void kingman_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D4: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); + update_display(); +} + +void kingman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( kingman ) + PORT_START("IN.0") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void kingman_state::kingman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_d().set(FUNC(kingman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(374, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 23); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( kingman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 396320, "screen", 0) + ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Bombman (Portable 6000 series) + * Hitachi HD38800B29 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class bombman_state : public hh_hmcs40_state +{ +public: + bombman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bombman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bombman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void bombman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bombman_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D4: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); + update_display(); +} + +void bombman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bombman ) + PORT_START("IN.0") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) +INPUT_PORTS_END + +void bombman_state::bombman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_d().set(FUNC(bombman_state::grid_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 21); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bombman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b29", 0x0000, 0x1000, CRC(f99ebd3f) SHA1(5016d4e35efa1353d26e60f98d8a027773d571a0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "bombman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + VTech Invaders (manufactured in Taiwan) + * Hitachi HD38750A45 MCU + * cyan/red VFD display Futaba DM-26Z 1G, with bezel + + known releases: + - USA: Invaders/Sonic Invader, published by VTech + - UK: Cosmic Invader, published by Grandstand + - UK: Galactic Invaders, published by Prinztronic + +***************************************************************************/ + +class vinvader_state : public hh_hmcs40_state +{ +public: + vinvader_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void vinvader(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void vinvader_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x(,D4-D6): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); + m_display->matrix(m_grid, plate); +} + +void vinvader_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D4-D6: more plates (update display there) + plate_w(3 + 1, data >> 4 & 7); +} + +// config + +static INPUT_PORTS_START( vinvader ) + PORT_START("IN.0") // port R0x + 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.1") // port D + PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0002, "2" ) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0xfff5, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void vinvader_state::vinvader(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 300000); // approximation + m_maincpu->read_r<0>().set_ioport("IN.0"); + m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_d().set(FUNC(vinvader_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(233, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( vinvader ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a45", 0x0000, 0x0800, CRC(32de6056) SHA1(70238c6c40c3d513f8eced1cb81bdd4dbe12f16c) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 166379, "screen", 0) + ROM_LOAD( "vinvader.svg", 0, 166379, CRC(b75c448e) SHA1(40d546f9fbdb446883e3ab0e3f678f1be8105159) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1982, wantgman, 0, 0, wantgman, wantgman, wantgman_state, empty_init, "Actronics / Hanzawa", "Wanted G-Man", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1979, bambball, 0, 0, bambball, bambball, bambball_state, empty_init, "Bambino", "Dribble Away Basketball", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_init, "Bambino", "Knock-Em Out Boxing", MACHINE_SUPPORTS_SAVE ) + +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, 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 ) +CONS( 1983, bbtime, 0, 0, bbtime, bbtime, bbtime_state, empty_init, "Bandai", "Burger Time (Bandai)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, ktparman, 0, 0, ktparman, ktparman, ktparman_state, empty_init, "Bandai", "Kiteyo Parman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1983, bdoramon, 0, 0, bdoramon, bdoramon, bdoramon_state, empty_init, "Bandai", "Dokodemo Dorayaki Doraemon", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, tkjmaru, 0, 0, tkjmaru, tkjmaru, tkjmaru_state, empty_init, "Bandai", "Toukon Juohmaru", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1983, bultrman, 0, 0, bultrman, bultrman, bultrman_state, empty_init, "Bandai", "Ultraman Monster Battle", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, ggdman, 0, 0, ggdman, ggdman, ggdman_state, empty_init, "Bandai", "Go Go Dynaman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_init, "Bandai", "Machine Man", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, cmspacmn_state, empty_init, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, epacman2, 0, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, einvader2, 0, 0, einvader2, einvader2, einvader2_state, empty_init, "Entex", "Super Space Invader 2 (Entex, black version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, eturtles, 0, 0, eturtles, eturtles, eturtles_state, empty_init, "Entex", "Turtles (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, gscobra, 0, 0, gscobra, gscobra, gscobra_state, empty_init, "Gakken", "Super Cobra (Gakken, green version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, gdefender, 0, 0, gdefender, gdefender, gdefender_state, empty_init, "Gakken", "Defender (Gakken)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +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 Electronics", "World Championship Baseball", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel Electronics", "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 ) + +CONS( 1982, puckimon, 0, 0, puckimon, puckimon, puckimon_state, empty_init, "Romtec", "Pucki & Monsters", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1982, tmtron, 0, 0, tmtron, tmtron, tmtron_state, empty_init, "Tomy", "Tron (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, kingman, 0, 0, kingman, kingman, kingman_state, empty_init, "Tomy", "Kingman", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, bombman, 0, 0, bombman, bombman, bombman_state, empty_init, "Tomy", "Bombman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1981, vinvader, 0, 0, vinvader, vinvader, vinvader_state, empty_init, "VTech", "Invaders (VTech)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_melps4.cpp b/src/mame/misc_handheld/hh_melps4.cpp new file mode 100644 index 00000000000..060ddba845b --- /dev/null +++ b/src/mame/misc_handheld/hh_melps4.cpp @@ -0,0 +1,381 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/*************************************************************************** + +Mitsubishi MELPS 4 MCU tabletops/handhelds or other simple devices, +most of them are VFD electronic games/toys. + +TODO: +- dump/add Gakken version of Frogger +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/melps4/m58846.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +//#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_melps4_state : public driver_device +{ +public: + hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<4> m_inputs; // max 4 + + // misc common + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u32 m_plate = 0; // VFD current column data + + u8 read_inputs(int columns); +}; + + +// machine start/reset + +void hh_melps4_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_melps4_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_melps4_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button) +{ + // for when reset button is directly tied to MCU reset pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Coleco Frogger (manufactured in Japan, licensed from Sega) + * PCB label Coleco Frogger Code No. 01-81543, KS-003282 Japan + * Mitsubishi M58846-701P MCU + * cyan/red/green VFD display Itron CP5090GLR R1B, with partial color overlay + + Gakken / Konami Frogger + * PCB label Konami Gakken KH-8201D + * Mitsubishi M58846-700P MCU (Konami logo on it) + * cyan/red/green VFD display, with partial color overlay + +***************************************************************************/ + +class cfrogger_state : public hh_melps4_state +{ +public: + cfrogger_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_melps4_state(mconfig, type, tag) + { } + + void cfrogger(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + DECLARE_WRITE_LINE_MEMBER(speaker_w); + u16 input_r(); +}; + +// handlers + +void cfrogger_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11); + u16 plate = bitswap<16>(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8); + m_display->matrix(grid, plate); +} + +void cfrogger_state::plate_w(offs_t offset, u8 data) +{ + // F0,F1: input mux + if (offset == MELPS4_PORTF) + m_inp_mux = data & 3; + + // Sx,Fx,Gx: vfd plate + int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit + int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; + m_plate = (m_plate & ~(mask << shift)) | (data << shift); + update_display(); +} + +void cfrogger_state::grid_w(u16 data) +{ + // D0-D11: vfd grid + m_grid = data; + update_display(); +} + +WRITE_LINE_MEMBER(cfrogger_state::speaker_w) +{ + // T: speaker out + m_speaker->level_w(state); +} + +u16 cfrogger_state::input_r() +{ + // K0,K1: multiplexed inputs + // K2: N/C + // K3: fixed input + return (m_inputs[2]->read() & 8) | (read_inputs(2) & 3); +} + +// config + +static INPUT_PORTS_START( cfrogger ) + PORT_START("IN.0") // F0 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // F1 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // K3 + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) +INPUT_PORTS_END + +void cfrogger_state::cfrogger(machine_config &config) +{ + // basic machine hardware + M58846(config, m_maincpu, 600_kHz_XTAL); + m_maincpu->read_k().set(FUNC(cfrogger_state::input_r)); + m_maincpu->write_s().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_f().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_g().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_d().set(FUNC(cfrogger_state::grid_w)); + m_maincpu->write_t().set(FUNC(cfrogger_state::speaker_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(500, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cfrogger ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) ) + + ROM_REGION( 786255, "screen", 0) + ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken / Konami Jungler (manufactured in Japan) + * PCB label Konami Gakken GR503 + * Mitsubishi M58846-702P MCU + * cyan/red/green VFD display Itron CP5143GLR SGA, with light-yellow color overlay + +***************************************************************************/ + +class gjungler_state : public hh_melps4_state +{ +public: + gjungler_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_melps4_state(mconfig, type, tag) + { } + + void gjungler(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + DECLARE_WRITE_LINE_MEMBER(speaker_w); + u16 input_r(); +}; + +// handlers + +void gjungler_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000; + m_display->matrix(grid, plate); +} + +void gjungler_state::plate_w(offs_t offset, u8 data) +{ + // G0,G1: input mux + if (offset == MELPS4_PORTG) + m_inp_mux = data & 3; + + // Sx,Fx,Gx,U: vfd plate + int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit + int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; + m_plate = (m_plate & ~(mask << shift)) | (data << shift); + update_display(); +} + +void gjungler_state::grid_w(u16 data) +{ + // D0-D11: vfd grid + m_grid = data; + update_display(); +} + +WRITE_LINE_MEMBER(gjungler_state::speaker_w) +{ + // T: speaker out + m_speaker->level_w(state); +} + +u16 gjungler_state::input_r() +{ + // K0,K1: multiplexed inputs + // K2,K3: fixed inputs + return (m_inputs[2]->read() & 0xc) | (read_inputs(2) & 3); +} + +// config + +static INPUT_PORTS_START( gjungler ) + PORT_START("IN.0") // G0 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // G1 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.2") // K2,K3 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x08, 0x00, "Game Mode" ) + PORT_CONFSETTING( 0x00, "A" ) + PORT_CONFSETTING( 0x08, "B" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) +INPUT_PORTS_END + +void gjungler_state::gjungler(machine_config &config) +{ + // basic machine hardware + M58846(config, m_maincpu, 600_kHz_XTAL); + m_maincpu->read_k().set(FUNC(gjungler_state::input_r)); + m_maincpu->write_s().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_f().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_g().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_u().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_d().set(FUNC(gjungler_state::grid_w)); + m_maincpu->write_t().set(FUNC(gjungler_state::speaker_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(481, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gjungler ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m58846-702p", 0x0000, 0x1000, CRC(94ab7060) SHA1(3389bc115d1df8d01a30611fa9e95a900d32b29b) ) + + ROM_REGION( 419696, "screen", 0) + ROM_LOAD( "gjungler.svg", 0, 419696, CRC(c5f6d1f2) SHA1(5032f35326ca689c8e329f760e380cdc9f5dff86) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1982, cfrogger, 0, 0, cfrogger, cfrogger, cfrogger_state, empty_init, "Coleco / Konami", "Frogger (Coleco)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, gjungler, 0, 0, gjungler, gjungler, gjungler_state, empty_init, "Gakken / Konami", "Jungler (Gakken)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_pic16.cpp b/src/mame/misc_handheld/hh_pic16.cpp new file mode 100644 index 00000000000..3a35e746c8c --- /dev/null +++ b/src/mame/misc_handheld/hh_pic16.cpp @@ -0,0 +1,1965 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +GI PIC 16xx-driven dedicated handhelds or other simple devices. + +known chips: + + serial device etc. +----------------------------------------------------------- + *020 1650 19??, GI Economega IV TV PPL Tuning System Control + *021 1650 1978, GI AY-3-8910 demo board + @024 1655 1979, Toytronic? Football + @033 1655A 1979, Toytronic Football (newer) + @036 1655A 1979, Ideal Maniac + @043 1655A 1979, Caprice Pro-Action Baseball + @049 1655A 1980, Kingsford Match Me(?)/Mini Match Me + @051 1655A 1979, Kmart Dr. Dunk/Tandy Electronic Basketball + @053 1655A 1979, Atari Touch Me + @0?? 1655A 1979, Tiger Half Court Computer Basketball/Sears Electronic Basketball (custom label) + @061 1655A 1980, Lakeside Le Boom + @078 1655A 1980, Ideal Flash + *081 1655A 1981, Ramtex Space Invaders/Block Buster + *085 1655A 1980, VTech Soccer 2/Grandstand Match of the Day Soccer + @094 1655A 1980, GAF Melody Madness + @110 1650A 1979, Tiger/Tandy Rocket Pinball + *123 1655A? 1980, Kingsford Match Me/Mini Match Me + @133 1650A 1981, U.S. Games Programmable Baseball/Tandy 2-Player Baseball + @144 1650A 1981, U.S. Games/Tandy 2-Player Football + *192 1650 19??, phone dialer (have dump) + *255 1655 19??, talking clock (have dump) + *518 1650A 19??, GI Teleview Control Chip (features differ per program) + *519 1650A 19??, " + *532 1650A 19??, " + *533 1650A 19??, " + *536 1650 1982, GI Teleview Autodialer/Terminal Identifier + + (* means undumped unless noted, @ denotes it's in this driver) + +ROM source notes when dumped from another publisher, but confident it's the same: +- drdunk: Tandy Electronic Basketball +- flash: Radio Shack Sound Effects Chassis +- hccbaskb: Sears Electronic Basketball +- us2pfball: Tandy 2-Player Football +- uspbball: Tandy 2-Player Baseball + +TODO: +- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.) +- ttfball: discrete sound part, for volume gating? +- what's the relation between drdunk and hccbaskb? Probably made by the same + Hong Kong subcontractor? I presume Toytronic. +- uspbball and pabball internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/pic16c5x/pic16c5x.h" +#include "video/pwm.h" +#include "machine/clock.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "drdunk.lh" +#include "flash.lh" // clickable +#include "hccbaskb.lh" +#include "leboom.lh" // clickable +#include "maniac.lh" // clickable +#include "melodym.lh" // clickable +#include "matchme.lh" // clickable +#include "rockpin.lh" +#include "touchme.lh" // clickable +#include "ttfball.lh" +#include "us2pfball.lh" + +#include "hh_pic16_test.lh" // common test-layout - use external artwork + + +class hh_pic16_state : public driver_device +{ +public: + hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_a = 0; // MCU port A write data + u8 m_b = 0; // " B + u8 m_c = 0; // " C + u8 m_d = 0; // " D + u16 m_inp_mux = ~0; // multiplexed inputs mask + + u16 read_inputs(int columns, u16 colmask = ~0); + u8 read_rotated_inputs(int columns, u8 rowmask = ~0); +}; + + +// machine start/reset + +void hh_pic16_state::machine_start() +{ + // register for savestates + save_item(NAME(m_a)); + save_item(NAME(m_b)); + save_item(NAME(m_c)); + save_item(NAME(m_d)); + save_item(NAME(m_inp_mux)); +} + +void hh_pic16_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_pic16_state::read_inputs(int columns, u16 colmask) +{ + // active low + u16 ret = ~0 & colmask; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (~m_inp_mux >> i & 1) + ret &= m_inputs[i]->read(); + + return ret; +} + +u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask) +{ + u8 ret = 0; + u16 colmask = (1 << columns) - 1; + + // read selected input columns + for (int i = 0; i < 8; i++) + if (1 << i & rowmask && ~m_inputs[i]->read() & ~m_inp_mux & colmask) + ret |= 1 << i; + + // active low + return ~ret & rowmask; +} + +INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button) +{ + // when an input is directly wired to MCU MCLR pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Atari Touch Me + * PIC 1655A-053 + * 2 7seg LEDs + 4 other LEDs, 1-bit sound + + This is the handheld version of the 1974 arcade game. + + known revisions: + - Model BH-100 GI C013233 Rev 2 Atari W 1979: PIC 1655A-053 + - Model BH-100 C013150 Rev 6 Atari 1979: AMI C10745 (custom ASIC) + +***************************************************************************/ + +class touchme_state : public hh_pic16_state +{ +public: + touchme_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void touchme(machine_config &config); + +private: + void update_display(); + void update_speaker(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void touchme_state::update_display() +{ + m_display->matrix(~m_b & 0x7b, m_c); +} + +void touchme_state::update_speaker() +{ + m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); +} + +u8 touchme_state::read_a() +{ + // A: multiplexed inputs + return read_inputs(3, 0xf); +} + +void touchme_state::write_b(u8 data) +{ + // B0-B2: input mux + m_inp_mux = data & 7; + + // B0,B1: digit select + // B3-B6: leds + m_b = data; + update_display(); + + // B7: speaker lead 1 + update_speaker(); +} + +void touchme_state::write_c(u8 data) +{ + // C0-C6: digit segments + m_c = data; + update_display(); + + // C7: speaker lead 2 + update_speaker(); +} + +// config + +static INPUT_PORTS_START( touchme ) + PORT_START("IN.0") // B0 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("High") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Skill") + + PORT_START("IN.1") // B1 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green Button") + + PORT_START("IN.2") // B2 port A + PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select" ) + PORT_CONFSETTING( 0x01^0x07, "1" ) + PORT_CONFSETTING( 0x02^0x07, "2" ) + PORT_CONFSETTING( 0x04^0x07, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void touchme_state::touchme(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 300000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->read_a().set(FUNC(touchme_state::read_a)); + m_maincpu->write_b().set(FUNC(touchme_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(touchme_state::write_c)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 300000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_touchme); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( touchme ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) ) +ROM_END + + + + + +/*************************************************************************** + + Caprice Pro-Action Baseball (manufactured by Calfax) + * PIC 1655A-043 + * 1 7seg LED + 36 other LEDs, CD4028, 1-bit sound + +***************************************************************************/ + +class pabball_state : public hh_pic16_state +{ +public: + pabball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void pabball(machine_config &config); + +private: + void update_display(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void pabball_state::update_display() +{ + // CD4028 BCD to decimal decoder + // CD4028 0-8: led select, 9: 7seg + u16 sel = m_c & 0xf; + if (sel & 8) sel &= 9; + sel = 1 << sel; + + m_display->matrix(sel, m_b); +} + +void pabball_state::write_b(u8 data) +{ + // B: led data + m_b = ~data; + update_display(); +} + +void pabball_state::write_c(u8 data) +{ + // C2: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 2 & 1); + + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C3: CD4028 A-D + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( pabball ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Straight") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port C + PORT_BIT( 0xcf, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Hit") + PORT_CONFNAME( 0x20, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x20, "2" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, 0) PORT_NAME("P1 Reset") +INPUT_PORTS_END + +void pabball_state::pabball(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1200000); // approximation - RC osc. R=18K, C=27pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(pabball_state::write_b)); + m_maincpu->read_c().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(pabball_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x200, 0xff); + config.set_default_layout(layout_hh_pic16_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( pabball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) ) +ROM_END + + + + + +/*************************************************************************** + + GAF Melody Madness + * PIC 1655A-094 + * 2 lamps under tube, 1-bit sound + + Melody Madness is a tabletop music memory game, shaped like a jukebox. + It can also be played as a simple electronic piano. + +***************************************************************************/ + +class melodym_state : public hh_pic16_state +{ +public: + melodym_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void melodym(machine_config &config); + +private: + void write_b(u8 data); + u8 read_c(); + void write_c(u8 data); +}; + +// handlers + +void melodym_state::write_b(u8 data) +{ + // B2-B6: input mux + m_inp_mux = data >> 2 & 0x1f; +} + +u8 melodym_state::read_c() +{ + // C0-C4: multiplexed inputs + return read_inputs(5, 0x1f) | 0xe0; +} + +void melodym_state::write_c(u8 data) +{ + // C6: both lamps + m_display->matrix(1, ~data >> 6 & 1); + + // C7: speaker out + m_speaker->level_w(~data >> 7 & 1); +} + +// config + +static INPUT_PORTS_START( melodym ) + PORT_START("IN.0") // B2 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") + + PORT_START("IN.1") // B3 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 6") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 8") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 9") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Button 10") + + PORT_START("IN.2") // B4 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 11") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 12") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // there is no button 13 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 14") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Button 15") + + PORT_START("IN.3") // B5 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 16") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 17") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 18") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 19") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button 20") + + PORT_START("IN.4") // B6 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Button 21") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Button 22") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Button 23") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Button 24") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Button 25") + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Novice") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Whiz") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Pro") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Note") +INPUT_PORTS_END + +void melodym_state::melodym(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation + m_maincpu->read_a().set_ioport("IN.5"); + m_maincpu->write_b().set(FUNC(melodym_state::write_b)); + m_maincpu->read_c().set(FUNC(melodym_state::read_c)); + m_maincpu->write_c().set(FUNC(melodym_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + m_display->set_bri_levels(0.9); + config.set_default_layout(layout_melodym); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( melodym ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Maniac, by Ralph Baer + * PIC 1655A-036 + * 2 7seg LEDs, 1-bit sound + + Maniac is a reflex game for 2-4 players. There are 4 challenges: + 1: Musical Maniac: Press the button as soon as the music stops. + 2: Sounds Abound: Count the number of tones in the song, then press the button + after the same amount of beeps. + 3: Look Twice: Press the button after the game repeats the first pattern. + 4: Your Time Is Up: Press the button after estimating the duration of the tone. + +***************************************************************************/ + +class maniac_state : public hh_pic16_state +{ +public: + maniac_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void maniac(machine_config &config); + +private: + void update_display(); + void update_speaker(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void maniac_state::update_display() +{ + m_display->write_row(0, ~m_b & 0x7f); + m_display->write_row(1, ~m_c & 0x7f); +} + +void maniac_state::update_speaker() +{ + m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); +} + +void maniac_state::write_b(u8 data) +{ + // B0-B6: left 7seg + m_b = data; + update_display(); + + // B7: speaker lead 1 + update_speaker(); +} + +void maniac_state::write_c(u8 data) +{ + // C0-C6: right 7seg + m_c = data; + update_display(); + + // C7: speaker lead 2 + update_speaker(); +} + +// config + +static INPUT_PORTS_START( maniac ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // top button, increment clockwise + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) +INPUT_PORTS_END + +void maniac_state::maniac(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation - RC osc. R=~13.4K, C=470pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(maniac_state::write_b)); + m_maincpu->write_c().set(FUNC(maniac_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_maniac); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( maniac ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Flash + * PCB label 25-600321, REV C, TCI-A3H / 94HB + * PIC 1655A-078 + * 2 7seg LEDs + 8 other LEDs, 1-bit sound with volume decay + + Flash is a wall-mounted game, players throw beanbags to activate the buttons. + It's described in patent US4333657 as an electronic dart game. + + BTANB: In games 4 and 5 it's easy to lock up the program by pressing the + buttons repeatedly and causing a score overflow. Although that wouldn't be + possible by properly throwing beanbags at it. This bug is warned about in + the manual. + + This could also be purchased as a bare PCB from Radio Shack under the Archer + brand, catalog number 277-1013. It was named "Sound Effects Chassis" but + clearly it's nothing like that. The instruction leaflet that came with the + PCB says to attach a speaker and a 9V power source. It actually takes 5V, + 9V would break it. The only thing it has to say about the game itself is + "Your module will produce blinking lights and several different sounds." + +***************************************************************************/ + +class flash_state : public hh_pic16_state +{ +public: + flash_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void flash(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + void update_display(); + void write_b(u8 data); + u8 read_c(); + void write_c(u8 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void flash_state::machine_start() +{ + hh_pic16_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void flash_state::speaker_update() +{ + if (~m_b & 0x40) + m_speaker_volume = 50.0; + + // it takes a bit before it actually starts fading + m_volume->flt_volume_set_volume(std::min(m_speaker_volume, 1.0)); +} + +TIMER_DEVICE_CALLBACK_MEMBER(flash_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.0075; +} + +void flash_state::update_display() +{ + m_display->matrix(~m_b >> 4 & 3, (~m_c >> 1 & 0x7f) | (~m_b << 7 & 0x780)); +} + +void flash_state::write_b(u8 data) +{ + // B0-B3: led data + // B4,B5: led select + m_b = data; + update_display(); + + // B7: speaker out + m_speaker->level_w(BIT(data, 7)); + + // B6: speaker on + speaker_update(); +} + +u8 flash_state::read_c() +{ + // C1-C7: buttons + return (m_c & 1) ? 0xff : m_inputs[1]->read(); +} + +void flash_state::write_c(u8 data) +{ + // C0: enable buttons + // C1-C7: digit segments + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( flash ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // top button, increment clockwise + PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) +INPUT_PORTS_END + +void flash_state::flash(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1050000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(flash_state::write_b)); + m_maincpu->read_c().set(FUNC(flash_state::read_c)); + m_maincpu->write_c().set(FUNC(flash_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 7+4); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_flash); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(flash_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( flash ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-078", 0x0000, 0x0400, CRC(bf780733) SHA1(57ac4620d87492280ab8cf69c148f98e38ecedc4) ) +ROM_END + + + + + +/*************************************************************************** + + Kingsford Match Me + * PIC 1655A-049 + * 8 lamps, 1-bit sound + + Known releases: + - USA(1): Match Me/Mini Match Me, published by Kingsford + - USA(2): Me Too, published by Talbot + - Hong Kong: Gotcha!/Encore/Follow Me, published by Toytronic + + Match Me is the tabletop version, Mini Match Me is the handheld. + The original is probably by Toytronic, Kingsford's version being licensed from them. + + Known revisions: + - PIC 1655A-049 (this one, dumped from a Mini Match Me) + - PIC 1655A-123 (seen in Match Me and Mini Match Me) + +***************************************************************************/ + +class matchme_state : public hh_pic16_state +{ +public: + matchme_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void matchme(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void write_b(u8 data); + void write_c(u8 data); + u8 read_c(); +}; + +void matchme_state::machine_reset() +{ + hh_pic16_state::machine_reset(); + set_clock(); +} + +// handlers + +void matchme_state::set_clock() +{ + // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a + // 10pF cap to speed it up by about 7.5%. + m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 1300000 : 1200000); +} + +void matchme_state::write_b(u8 data) +{ + // B0-B7: lamps + m_display->matrix(1, data); +} + +u8 matchme_state::read_c() +{ + // C0-C3: multiplexed inputs from C4-C6 + m_inp_mux = m_c >> 4 & 7; + u8 lo = read_inputs(3, 0xf); + + // C4-C6: multiplexed inputs from C0-C3 + m_inp_mux = m_c & 0xf; + u8 hi = read_rotated_inputs(4, 7); + + return lo | hi << 4 | 0x80; +} + +void matchme_state::write_c(u8 data) +{ + // C0-C6: input mux + m_c = data; + + // C7: speaker out + RTCC pin + m_speaker->level_w(data >> 7 & 1); + m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 7 & 1); +} + +// config + +static INPUT_PORTS_START( matchme ) + PORT_START("IN.0") // C4 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // purple + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pink + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // yellow + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // blue + + PORT_START("IN.1") // C5 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) // red + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) // cyan + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) // orange + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) // green + + PORT_START("IN.2") // C6 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x03) // Last/Auto + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Long") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // port A + PORT_CONFNAME( 0x07, 0x00^0x07, "Game" ) + PORT_CONFSETTING( 0x00^0x07, "1" ) + PORT_CONFSETTING( 0x01^0x07, "2" ) + PORT_CONFSETTING( 0x02^0x07, "3" ) + PORT_CONFSETTING( 0x04^0x07, "4" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "Amateur" ) // AM + PORT_CONFSETTING( 0x00, "Professional" ) // PRO + + PORT_START("IN.4") // another fake + PORT_CONFNAME( 0x01, 0x00, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, matchme_state, speed_switch, 0) + PORT_CONFSETTING( 0x00, DEF_STR( Low ) ) + PORT_CONFSETTING( 0x01, DEF_STR( High ) ) + + PORT_START("FAKE") // Last/Auto are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Last") + PORT_CONFNAME( 0x02, 0x02, "Music" ) + PORT_CONFSETTING( 0x02, "Manual" ) + PORT_CONFSETTING( 0x00, "Auto" ) +INPUT_PORTS_END + +void matchme_state::matchme(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1200000); // see set_clock + m_maincpu->read_a().set_ioport("IN.3"); + m_maincpu->write_b().set(FUNC(matchme_state::write_b)); + m_maincpu->read_c().set(FUNC(matchme_state::read_c)); + m_maincpu->write_c().set(FUNC(matchme_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 8); + config.set_default_layout(layout_matchme); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( matchme ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) ) +ROM_END + + + + + +/*************************************************************************** + + Kmart Dr. Dunk (manufactured in Hong Kong) + * PIC 1655A-51 + * 2 7seg LEDs + 21 other LEDs, 1-bit sound + + It is a clone of Mattel Basketball, but at lower speed. + The ROM is nearly identical to hccbaskb, the housing/overlay is similar to + U.S. Games/Tandy Trick Shot Basketball. + + known releases: + - USA(1): Dr. Dunk, published by Kmart + - USA(2): Electronic Basketball (model 60-2146), published by Tandy + +***************************************************************************/ + +class drdunk_state : public hh_pic16_state +{ +public: + drdunk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void drdunk(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void drdunk_state::update_display() +{ + m_display->matrix(m_b, m_c); +} + +u8 drdunk_state::read_a() +{ + // A2: skill switch, A3: multiplexed inputs + return m_inputs[5]->read() | read_inputs(5, 8) | 3; +} + +void drdunk_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0-B4: input mux + m_inp_mux = ~data & 0x1f; + + // B0-B3: led select + // B4,B5: digit select + m_b = data; + update_display(); +} + +void drdunk_state::write_c(u8 data) +{ + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C6: led data + m_c = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( drdunk ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // B2 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // B4 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START("IN.5") // port A2 + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void drdunk_state::drdunk(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=18K, C=47pF + m_maincpu->read_a().set(FUNC(drdunk_state::read_a)); + m_maincpu->write_b().set(FUNC(drdunk_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(drdunk_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 7); + m_display->set_segmask(0x30, 0x7f); + m_display->set_bri_levels(0.01, 0.2); // player led is brighter + config.set_default_layout(layout_drdunk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( drdunk ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) ) +ROM_END + + + + + +/*************************************************************************** + + Lakeside Le Boom + * PIC 1655A-061 + * 1 led, 1-bit sound with RC circuit for volume decay + + This is a tabletop timebomb defusion game. It's shaped like an aerial bomb, + colored black on USA version, yellow on dual-language Canadian version. + The game starts 'ticking' when the player opens the keypad door. To begin, + select the game mode, rows(keypad size), and fuse duration. + + Game modes as described on the box: + 1: Eliminate the buttons one by one in the order set out by the computer. Press + one twice and you'll be sorry! + 2: For 2 or more players. Take turns pressing the buttons, remember which ones. + Press a button a second time and watch out, it's all over. + 3: The computer picks one secret button that stops the fuse. You must press it + on your 5th turn. Listen to the clues and you'll do fine. + 4: The computer picks a secret combination. Find it first by listening to the + clues. Find the right order and you'll get it to fizzle out. + +***************************************************************************/ + +class leboom_state : public hh_pic16_state +{ +public: + leboom_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void leboom(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void leboom_state::machine_start() +{ + hh_pic16_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void leboom_state::speaker_update() +{ + if (~m_c & 0x80) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(leboom_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.005; +} + +u8 leboom_state::read_a() +{ + // A: multiplexed inputs + return read_inputs(6, 0xf); +} + +void leboom_state::write_b(u8 data) +{ + // B0-B5: input mux + m_inp_mux = data & 0x3f; +} + +void leboom_state::write_c(u8 data) +{ + // C4: single led + m_display->matrix(1, BIT(data, 4)); + + // C6: speaker out + m_speaker->level_w(BIT(data, 6)); + + // C7: speaker on + m_c = data; + speaker_update(); +} + +// config + +static INPUT_PORTS_START( leboom ) + PORT_START("IN.0") // B0 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Red Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Red Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Red Button 4") + + PORT_START("IN.1") // B1 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Red-Red Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Red-Green Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Red-Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Red-Blue Button") + + PORT_START("IN.2") // B2 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Shortest") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Short") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Long") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Longest") + + PORT_START("IN.3") // B3 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Yellow Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Yellow Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Yellow Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Yellow Button 4") + + PORT_START("IN.4") // B4 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Blue Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Blue Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Blue Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Blue Button 4") + + PORT_START("IN.5") // B5 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Blue Button 5") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Blue Button 6") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Blue Button 7") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Blue Button 8") +INPUT_PORTS_END + +void leboom_state::leboom(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation + m_maincpu->read_a().set(FUNC(leboom_state::read_a)); + m_maincpu->write_b().set(FUNC(leboom_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(leboom_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_leboom); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(leboom_state::speaker_decay_sim), attotime::from_msec(5)); +} + +// roms + +ROM_START( leboom ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Rocket Pinball (model 7-460) + * PIC 1650A-110, 69-11397 + * 3 7seg LEDs + 44 other LEDs, 1-bit sound + + known releases: + - Hong Kong(1): Rocket Pinball, published by Tiger + - Hong Kong(2): Spaceship Pinball, published by Toytronic + - USA(1): Rocket Pinball (model 60-2140), published by Tandy + - USA(2): Cosmic Pinball (model 49-65456), published by Sears + +***************************************************************************/ + +class rockpin_state : public hh_pic16_state +{ +public: + rockpin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void rockpin(machine_config &config); + +private: + void update_display(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void rockpin_state::update_display() +{ + // 3 7seg leds from ports A and B + m_display->matrix_partial(0, 3, m_a, m_b); + + // 44 leds from ports C and D + m_display->matrix_partial(3, 6, m_d, m_c); +} + +void rockpin_state::write_a(u8 data) +{ + // A3,A4: speaker out + m_speaker->level_w(data >> 3 & 3); + + // A0-A2: select digit + m_a = ~data & 7; + update_display(); +} + +void rockpin_state::write_b(u8 data) +{ + // B0-B6: digit segments + m_b = data & 0x7f; + update_display(); +} + +void rockpin_state::write_c(u8 data) +{ + // C0-C7: led data + m_c = ~data; + update_display(); +} + +void rockpin_state::write_d(u8 data) +{ + // D0-D5: led select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( rockpin ) + PORT_START("IN.0") // port A + PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Ball") +INPUT_PORTS_END + +void rockpin_state::rockpin(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_a().set(FUNC(rockpin_state::write_a)); + m_maincpu->read_b().set_constant(0xff); + m_maincpu->write_b().set(FUNC(rockpin_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(rockpin_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(rockpin_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 450000/4).signal_handler().set_inputline(m_maincpu, PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3+6, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_rockpin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( rockpin ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Half Court Computer Basketball (model 7-470) + * PIC 1655A(no serial), 69-11557 + * 2 7seg LEDs + 26 other LEDs, 1-bit sound + + known releases: + - Hong Kong: Half Court Computer Basketball, published by Tiger + - USA: Electronic Basketball (model 49-65453), published by Sears + +***************************************************************************/ + +class hccbaskb_state : public hh_pic16_state +{ +public: + hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void hccbaskb(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void hccbaskb_state::update_display() +{ + m_display->matrix(m_b, m_c); +} + +u8 hccbaskb_state::read_a() +{ + // A2: skill switch, A3: multiplexed inputs + return m_inputs[5]->read() | read_inputs(5, 8) | 3; +} + +void hccbaskb_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0-B4: input mux + m_inp_mux = ~data & 0x1f; + + // B7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // B0-B4: led select + // B5,B6: digit select + m_b = data; + update_display(); +} + +void hccbaskb_state::write_c(u8 data) +{ + // C0-C6: led data + m_c = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( hccbaskb ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // B2 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // B4 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START("IN.5") // port A2 + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void hccbaskb_state::hccbaskb(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=15K, C=47pF + m_maincpu->read_a().set(FUNC(hccbaskb_state::read_a)); + m_maincpu->write_b().set(FUNC(hccbaskb_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(hccbaskb_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x60, 0x7f); + m_display->set_bri_levels(0.01, 0.2); // player led is brighter + config.set_default_layout(layout_hccbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( hccbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) ) +ROM_END + + + + + +/*************************************************************************** + + Toytronic Football (set 1) + * PIC 1655A-033 + * 4511 7seg BCD decoder, 7 7seg LEDs + 27 other LEDs, 1-bit sound + + (no brand) Football (set 2) + * PIC 1655-024 + * rest same as above, 1 less button + + Hello and welcome to another Mattel Football clone, there are so many of these. + The 1655-024 one came from an unbranded handheld, but comparison suggests that + it's the 'prequel' of 1655A-033. + + The 1655-024 version looks and sounds the same as Conic "Electronic Football". + +***************************************************************************/ + +class ttfball_state : public hh_pic16_state +{ +public: + ttfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void ttfball(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void ttfball_state::update_display() +{ + // C0-C2: led data + // C0-C3: 4511 A-D, C4: digit segment DP + // C5: select digits or led matrix + const u8 _4511_map[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0,0,0,0,0,0 }; + u16 led_data = (m_c & 0x20) ? (_4511_map[m_c & 0xf] | (~m_c << 3 & 0x80)) : (~m_c << 8 & 0x700); + + m_display->matrix(m_b | (m_c << 1 & 0x100), led_data); +} + +u8 ttfball_state::read_a() +{ + // A3: multiplexed inputs, A0-A2: other inputs + return m_inputs[5]->read() | read_inputs(5, 8); +} + +void ttfball_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0,B1,B3,B7: input mux low + m_inp_mux = (m_inp_mux & 0x10) | (~data & 3) | (~data >> 1 & 4) | (~data >> 4 & 8); + + // B0-B7: led select (see above) + m_b = data; + update_display(); +} + +void ttfball_state::write_c(u8 data) +{ + // C6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // C7: input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); + + // C0-C7: led data/select (see above) + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( ttfball ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.2") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // C7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick") + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( ttfballa ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Forward") + + PORT_START("IN.2") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.3") // B7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.4") // C7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void ttfball_state::ttfball(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 600000); // approximation - RC osc. R=27K(set 1) or 33K(set 2), C=68pF + m_maincpu->read_a().set(FUNC(ttfball_state::read_a)); + m_maincpu->write_b().set(FUNC(ttfball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(ttfball_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x7f, 0xff); + m_display->set_bri_levels(0.003, 0.03); // player led is brighter + config.set_default_layout(layout_ttfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ttfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) ) +ROM_END + +ROM_START( ttfballa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Programmable Baseball + * PIC 1650A-133 + * 3 7seg LEDs + 36 other LEDs, 1-bit sound + + known releases: + - USA(1): Programmable Baseball, published by U.S. Games + - USA(2): Electronic 2-Player Baseball (model 60-2157), published by Tandy + +***************************************************************************/ + +class uspbball_state : public hh_pic16_state +{ +public: + uspbball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void uspbball(machine_config &config); + +private: + void update_display(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void uspbball_state::update_display() +{ + m_display->matrix(m_d, m_c << 8 | m_b); +} + +void uspbball_state::write_a(u8 data) +{ + // A0: speaker out + m_speaker->level_w(data & 1); +} + +void uspbball_state::write_b(u8 data) +{ + // B: digit segment data + m_b = bitswap<8>(data,0,1,2,3,4,5,6,7); + update_display(); +} + +void uspbball_state::write_c(u8 data) +{ + // C: led data + m_c = ~data; + update_display(); +} + +void uspbball_state::write_d(u8 data) +{ + // D0-D2: digit select + // D3-D5: led select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( uspbball ) + PORT_START("IN.0") // port A + PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Fast") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Change Up/Fielder") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + + PORT_START("IN.1") // port D + PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_CONFNAME( 0x80, 0x80, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x80, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void uspbball_state::uspbball(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 900000); // approximation - RC osc. R=22K, C=47pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_a().set(FUNC(uspbball_state::write_a)); + m_maincpu->read_b().set_constant(0xff); + m_maincpu->write_b().set(FUNC(uspbball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(uspbball_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(uspbball_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 900000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 16); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_hh_pic16_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( uspbball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Electronic 2-Player Football + * PIC 1650A-144 + * 8 7seg LEDs + 2 other LEDs, 1-bit sound + + known releases: + - USA(1): Electronic 2-Player Football, published by U.S. Games + - USA(2): Electronic 2-Player Football (model 60-2156), published by Tandy + +***************************************************************************/ + +class us2pfball_state : public hh_pic16_state +{ +public: + us2pfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void us2pfball(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void us2pfball_state::update_display() +{ + m_display->matrix(m_d | (m_a << 6 & 0x300), m_c); +} + +u8 us2pfball_state::read_a() +{ + // A0,A1: multiplexed inputs, A4-A7: other inputs + return read_inputs(4, 3) | (m_inputs[4]->read() & 0xf0) | 0x0c; +} + +void us2pfball_state::write_a(u8 data) +{ + // A2,A3: leds + m_a = data; + update_display(); +} + +void us2pfball_state::write_b(u8 data) +{ + // B0-B3: input mux + m_inp_mux = data & 0xf; +} + +void us2pfball_state::write_c(u8 data) +{ + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C6: digit segments + m_c = data; + update_display(); +} + +void us2pfball_state::write_d(u8 data) +{ + // D0-D7: digit select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( us2pfball ) + PORT_START("IN.0") // B0 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.1") // B1 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.2") // B2 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.3") // B3 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.4") // port A high + PORT_CONFNAME( 0x10, 0x10, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x10, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x20, "1" ) // college + PORT_CONFSETTING( 0x00, "2" ) // pro + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") // K/P + + PORT_START("IN.5") // port B + PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Status/Score") // S +INPUT_PORTS_END + +void us2pfball_state::us2pfball(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 800000); // approximation - RC osc. R=39K, C=75pF + m_maincpu->read_a().set(FUNC(us2pfball_state::read_a)); + m_maincpu->write_a().set(FUNC(us2pfball_state::write_a)); + m_maincpu->read_b().set_ioport("IN.5"); + m_maincpu->write_b().set(FUNC(us2pfball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(us2pfball_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(us2pfball_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 800000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0xff, 0x7f); + m_display->set_bri_levels(0.01, 0.17); // player led is brighter + config.set_default_layout(layout_us2pfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( us2pfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Caprice / Calfax", "Pro-Action Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, drdunk, 0, 0, drdunk, drdunk, drdunk_state, empty_init, "Kmart", "Dr. Dunk", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, rockpin, 0, 0, rockpin, rockpin, rockpin_state, empty_init, "Tiger Electronics", "Rocket Pinball", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, hccbaskb, 0, 0, hccbaskb, hccbaskb, hccbaskb_state, empty_init, "Tiger Electronics", "Half Court Computer Basketball", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, ttfball, 0, 0, ttfball, ttfball, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +CONS( 1979, ttfballa, ttfball, 0, ttfball, ttfballa, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 2)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, uspbball, 0, 0, uspbball, uspbball, uspbball_state, empty_init, "U.S. Games", "Programmable Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1981, us2pfball, 0, 0, us2pfball, us2pfball, us2pfball_state, empty_init, "U.S. Games", "Electronic 2-Player Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_pps41.cpp b/src/mame/misc_handheld/hh_pps41.cpp new file mode 100644 index 00000000000..2521f355b0d --- /dev/null +++ b/src/mame/misc_handheld/hh_pps41.cpp @@ -0,0 +1,1617 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +Rockwell PPS-4/1 MCU series handhelds + +ROM source notes when dumped from another publisher, but confident it's the same: +- memoquiz: Mattel Mind Boggler + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/pps41/mm75.h" +#include "cpu/pps41/mm76.h" +#include "cpu/pps41/mm78.h" +#include "cpu/pps41/mm78la.h" +#include "video/pwm.h" +#include "sound/beep.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "brainbaf.lh" +#include "dunksunk.lh" +#include "ftri1.lh" +#include "horocomp.lh" +#include "mastmind.lh" +#include "memoquiz.lh" +#include "mfootb2.lh" +#include "mwcfootb.lh" +#include "rdqa.lh" +#include "scrabsen.lh" +#include "smastmind.lh" + +//#include "hh_pps41_test.lh" // common test-layout - use external artwork + + +class hh_pps41_state : public driver_device +{ +public: + hh_pps41_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override { update_int(); } + virtual void device_post_load() override { update_int(); } + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<11> m_inputs; // max 11 + + u16 m_inp_mux = 0; + u32 m_grid = 0; + u32 m_plate = 0; + + // MCU output pin state + u16 m_d = 0; + u16 m_r = 0; + + u8 read_inputs(int columns); + virtual void update_int() { ; } +}; + + +// machine start + +void hh_pps41_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); + save_item(NAME(m_d)); + save_item(NAME(m_r)); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_pps41_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_pps41_state::reset_button) +{ + // when an input is directly wired to MCU PO pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Fonas Tri-1 + * PCB label: CASSIA CA010-F + * MM78 MCU variant with 40 pins (no label, die label A7859) + * 4 7seg leds, 41 other leds, 1-bit sound + + The game only uses 1.5KB ROM and seems it doesn't use all the RAM either, + as if it was programmed for MM77L. + + Hold all 4 buttons at boot (not counting RESET) for a led test. + Cassia was Eric White/Ken Cohen's company, later named CXG, known for + their chess computers. + +***************************************************************************/ + +class ftri1_state : public hh_pps41_state +{ +public: + ftri1_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void ftri1(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); +}; + +// handlers + +void ftri1_state::update_display() +{ + m_display->matrix(m_d, bitswap<8>(~m_r, 0,7,6,5,4,3,2,1)); +} + +void ftri1_state::write_d(u16 data) +{ + // DIO0-DIO8: digit/led select + m_d = data; + update_display(); + + // DIO9: speaker out + m_speaker->level_w(BIT(data, 9)); +} + +void ftri1_state::write_r(u16 data) +{ + // RIO1-RIO8: digit/led data + m_r = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( ftri1 ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0c, 0x04, "Game Select" ) + PORT_CONFSETTING( 0x08, "Star Chase" ) + PORT_CONFSETTING( 0x04, "All Star Baseball" ) + PORT_CONFSETTING( 0x00, "Batting Champs" ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Score / S1 H") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Steal / S1 V") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pitch / S2 H") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Swing / S2 V") + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pps41_state, reset_button, 0) PORT_CODE(KEYCODE_F1) PORT_NAME("Game Reset") +INPUT_PORTS_END + +void ftri1_state::ftri1(machine_config &config) +{ + // basic machine hardware + MM78(config, m_maincpu, 300000); // approximation - VC osc. R=68K + m_maincpu->write_d().set(FUNC(ftri1_state::write_d)); + m_maincpu->write_r().set(FUNC(ftri1_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1e0, 0x7f); + config.set_default_layout(layout_ftri1); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ftri1 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "a7859", 0x0000, 0x0800, CRC(3c957f1d) SHA1(42db81a78bbef971a84e61a26d91f7411980d79c) ) +ROM_END + + + + + +/*************************************************************************** + + Invicta Electronic Master Mind + * MM75 MCU (label MM75 A7525-11, die label A7525) + * 9-digit 7seg VFD display (Futaba 9-ST) + + Invicta Super-Sonic Electronic Master Mind + * MM75 MCU (label A7539-12, die label A7539) + * same base hardware, added beeper + + Invicta Plastics is the owner of the Mastermind game rights. The back of the + Master Mind unit says (C) 1977, but this electronic handheld version came + out in 1979. Or maybe there's an older revision. + +***************************************************************************/ + +class mastmind_state : public hh_pps41_state +{ +public: + mastmind_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag), + m_beeper(*this, "beeper") + { } + + void mastmind(machine_config &config); + void smastmind(machine_config &config); + +private: + optional_device m_beeper; + + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void mastmind_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void mastmind_state::write_d(u16 data) +{ + // DIO0-DIO7: digit select (DIO7 N/C on mastmind) + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8: beeper on smastmind + if (m_beeper) + m_beeper->set_state(BIT(data, 8)); +} + +void mastmind_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 mastmind_state::read_p() +{ + // PI1-PI4: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( mastmind ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Try") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fail") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test on mastmind? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") +INPUT_PORTS_END + +void mastmind_state::mastmind(machine_config &config) +{ + // basic machine hardware + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mastmind_state::write_d)); + m_maincpu->write_r().set(FUNC(mastmind_state::write_r)); + m_maincpu->read_p().set(FUNC(mastmind_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_mastmind); + + // no sound! +} + +void mastmind_state::smastmind(machine_config &config) +{ + mastmind(config); + + config.set_default_layout(layout_smastmind); + + // sound hardware + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 2400); // approximation + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mastmind ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm75_a7525-11", 0x0000, 0x0200, CRC(39dbdd50) SHA1(72fa5781e9df62d91d57437ded2931fab8253c3c) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) +ROM_END + +ROM_START( smastmind ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a7539-12", 0x0000, 0x0200, CRC(b63c453f) SHA1(f47a540fd90eed7514ed03864be2121f641c1154) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_smastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) +ROM_END + + + + + +/*************************************************************************** + + Kmart Dunk 'n Sunk (manufactured in Hong Kong) + * MM76EL MCU (label GE-E 1V2280, die label B8617) + * 4 7seg leds, 31 other leds, 1-bit sound + + It's by the same Hong Kong company that did Kmart Dr. Dunk/Tandy Electronic + Basketball (PIC16 MCU), Grandstand Pocket Match of the Day (MOS MPS765x MCU) + among others. + + known releases: + - USA(1): Dunk 'n Sunk, published by Kmart + - USA(2): Electronic Basketball / Submarine Warfare, published by U.S. Games + +***************************************************************************/ + +class dunksunk_state : public hh_pps41_state +{ +public: + dunksunk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void dunksunk(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { update_int(); } + DECLARE_INPUT_CHANGED_MEMBER(game_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); +}; + +// handlers + +void dunksunk_state::update_int() +{ + // 2 of the switches are tied to MCU interrupt pins + m_maincpu->set_input_line(0, (m_inputs[1]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(1, (m_inputs[2]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void dunksunk_state::update_display() +{ + m_display->matrix(m_d >> 1, ~m_r); +} + +void dunksunk_state::write_d(u16 data) +{ + // DIO0: speaker out + m_speaker->level_w(data & 1); + + // DIO1-DIO5: led select + // DIO6-DIO9: digit select + m_d = data; + update_display(); +} + +void dunksunk_state::write_r(u16 data) +{ + // RIO1-RIO7: led data + m_r = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( dunksunk ) + PORT_START("IN.0") // PI + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x03, EQUALS, 0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, difficulty_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // INT0 + PORT_CONFSETTING( 0x01, "2" ) // PI4 + PORT_CONFSETTING( 0x03, "3" ) + + PORT_START("IN.2") // INT1 + PORT_CONFNAME( 0x01, 0x01, "Game Select" ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, game_switch, 0) + PORT_CONFSETTING( 0x01, "Basketball" ) + PORT_CONFSETTING( 0x00, "Submarine Chase" ) +INPUT_PORTS_END + +void dunksunk_state::dunksunk(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 390000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(dunksunk_state::write_d)); + m_maincpu->write_r().set(FUNC(dunksunk_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1e0, 0x7f); + m_display->set_bri_levels(0.015, 0.2); // player led is brighter + config.set_default_layout(layout_dunksunk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( dunksunk ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "ge-e_1v2280", 0x0000, 0x0400, CRC(90f17191) SHA1(80c3708af99c9db7afe17254fa4df2080aa9f145) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_dunksunk_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) +ROM_END + + + + + +/*************************************************************************** + + M.E.M. Belgium Memoquiz + * PCB label: MEMOQUIZ MO3 + * MM75 MCU (label M7505 A7505-12, die label A7505) + * 9-digit 7seg VFD display, no sound + + It's a Mastermind game, not as straightforward as Invicta's version. + To start, press the "?" button to generate a new code, then try to guess it, + confirming with the "=" button. CD reveals the answer, PE is for player entry. + + known releases: + - Europe: Memoquiz, published by M.E.M. Belgium + - UK: Memoquiz, published by Polymark + - USA: Mind Boggler (model 2626), published by Mattel + +***************************************************************************/ + +class memoquiz_state : public hh_pps41_state +{ +public: + memoquiz_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void memoquiz(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(digits_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void memoquiz_state::update_int() +{ + // digits switch is tied to MCU interrupt pins + u8 inp = m_inputs[4]->read(); + m_maincpu->set_input_line(0, (inp & 1) ? CLEAR_LINE : ASSERT_LINE); + m_maincpu->set_input_line(1, (inp & 2) ? ASSERT_LINE : CLEAR_LINE); +} + +void memoquiz_state::update_display() +{ + m_display->matrix(m_inp_mux, (m_inp_mux << 2 & 0x80) | (~m_r & 0x7f)); +} + +void memoquiz_state::write_d(u16 data) +{ + // DIO0-DIO7: digit select, DIO5 is also DP segment + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8: N/C, looks like they planned to add sound, but didn't +} + +void memoquiz_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 memoquiz_state::read_p() +{ + // PI1-PI4: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( memoquiz ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("AC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("PE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CD") + + PORT_START("IN.4") + PORT_CONFNAME( 0x03, 0x01, "Digits" ) PORT_CHANGED_MEMBER(DEVICE_SELF, memoquiz_state, digits_switch, 0) + PORT_CONFSETTING( 0x01, "3" ) // INT0, Vdd when closed, pulled to GND when open + PORT_CONFSETTING( 0x02, "4" ) // INT1, GND when closed, pulled to Vdd when open + PORT_CONFSETTING( 0x00, "5" ) +INPUT_PORTS_END + +void memoquiz_state::memoquiz(machine_config &config) +{ + // basic machine hardware + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(memoquiz_state::write_d)); + m_maincpu->write_r().set(FUNC(memoquiz_state::write_r)); + m_maincpu->read_p().set(FUNC(memoquiz_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_memoquiz); + + // no sound! +} + +// roms + +ROM_START( memoquiz ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "m7505_a7505-12", 0x0000, 0x0200, CRC(47223508) SHA1(97b62e0c453ae2e65d48e039ad65857dae2d4d76) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_memoquiz_output.pla", 0, 314, CRC(a5799b50) SHA1(9b4923b37c9ba8221ecece5a3370c605a880a453) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Football 2 (model 1050) + * PCB label: MATTEL, 1050-4369D + * MM77LA MCU (label B8000-12, die label B8000) + * 7 7seg leds, 30 other leds, 2-bit sound + + Through its production run, it was released as "Football 2" and "Football II". + +***************************************************************************/ + +class mfootb2_state : public hh_pps41_state +{ +public: + mfootb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void mfootb2(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + void write_spk(u8 data); +}; + +// handlers + +void mfootb2_state::update_display() +{ + m_display->matrix(m_d, (m_r << 1 & 0x700) | (m_d >> 4 & 0x80) | (m_r & 0x7f)); +} + +void mfootb2_state::write_d(u16 data) +{ + // DIO0-DIO2, DIO6-DIO9: digit select + // DIO3-DIO5: led select + // DIO10: 4th digit DP + m_d = data; + update_display(); +} + +void mfootb2_state::write_r(u16 data) +{ + // RO01-RO10: led data + m_r = data; + update_display(); +} + +void mfootb2_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +static INPUT_PORTS_START( mfootb2 ) + PORT_START("IN.0") // PI + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // DIO11 + PORT_CONFNAME( 0x400, 0x000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x000, "1" ) // PRO 1 + PORT_CONFSETTING( 0x400, "2" ) // PRO 2 +INPUT_PORTS_END + +void mfootb2_state::mfootb2(machine_config &config) +{ + // basic machine hardware + MM77LA(config, m_maincpu, 380000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mfootb2_state::write_d)); + m_maincpu->read_d().set_ioport("IN.1"); + m_maincpu->write_r().set(FUNC(mfootb2_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + m_maincpu->write_spk().set(FUNC(mfootb2_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 11); + m_display->set_segmask(0x3c7, 0x7f); + m_display->set_segmask(0x002, 0xff); // only one digit has DP + m_display->set_bri_levels(0.015, 0.2); // ball led is brighter + config.set_default_layout(layout_mfootb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( mfootb2 ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b8000-12", 0x0000, 0x0600, CRC(5b65fc38) SHA1(4fafc9deb5609b16f09b18b7346ea96ffe8bf9e0) ) + + ROM_REGION( 317, "maincpu:opla", 0 ) + ROM_LOAD( "mm77la_mfootb2_output.pla", 0, 317, CRC(11c0bbfa) SHA1(939a0a6adeace8ca0f9e17290306a2e7ced21db3) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Brain Baffler (model 1080) + * PCB label: OLYMPOS KOREA, CM04-D102-001 REV D + * MM78LA MCU (label MM95 B9000-12, die label B9000) + * 8-digit 14seg LED display, 2-bit sound + + It includes 8 word games, most of them are meant for 2 players. + +***************************************************************************/ + +class brainbaf_state : public hh_pps41_state +{ +public: + brainbaf_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void brainbaf(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); + void write_spk(u8 data); +}; + +// handlers + +void brainbaf_state::update_display() +{ + m_display->matrix(m_inp_mux, bitswap<14>(m_r, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); +} + +void brainbaf_state::write_d(u16 data) +{ + // DIO0-DIO9: input mux + // DIO0-DIO7: digit select + m_inp_mux = data; + update_display(); +} + +void brainbaf_state::write_r(u16 data) +{ + // RO01-RO14: digit segment data + m_r = data; + update_display(); +} + +u8 brainbaf_state::read_p() +{ + // PI5-PI8: multiplexed inputs + return read_inputs(10) << 4; +} + +void brainbaf_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +static INPUT_PORTS_START( brainbaf ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J-0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_NAME("Player / Bonus R") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Player / Bonus L") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Game") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C-3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_NAME("Go") + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D-4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Entry") + + PORT_START("IN.5") // DIO5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E-5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + + PORT_START("IN.6") // DIO6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_NAME("Refresh") + + PORT_START("IN.7") // DIO7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G-7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_NAME("Buy") + + PORT_START("IN.8") // DIO8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H-8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_NAME("Give-Up") + + PORT_START("IN.9") // DIO9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I-9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CODE(KEYCODE_F11) PORT_NAME("Stop") // both STOP keys + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_NAME("Score") +INPUT_PORTS_END + +void brainbaf_state::brainbaf(machine_config &config) +{ + // basic machine hardware + MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K + m_maincpu->write_d().set(FUNC(brainbaf_state::write_d)); + m_maincpu->write_r().set(FUNC(brainbaf_state::write_r)); + m_maincpu->read_p().set(FUNC(brainbaf_state::read_p)); + m_maincpu->write_spk().set(FUNC(brainbaf_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_brainbaf); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( brainbaf ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm95_b9000-12", 0x0000, 0x0800, CRC(f7a4829c) SHA1(12f789d8264a969777764d31ea67067cc330a73c) ) + + ROM_REGION( 605, "maincpu:opla", 0 ) + ROM_LOAD( "mm78la_brainbaf_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Horoscope Computer (model 1081) + * PCB label: DET. CM05-D102-001 REV D + * MM78LA MCU (label MM95 B9001-13, die label B9001) + * 8-digit 14seg LED display, 2-bit sound + + This is not a toy, but a fortune forecast. Date format is mm-dd-yy, it is + valid only from June 1 1979 until December 31 1987 + +***************************************************************************/ + +class horocomp_state : public hh_pps41_state +{ +public: + horocomp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void horocomp(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); + void write_spk(u8 data); +}; + +// handlers + +void horocomp_state::update_display() +{ + // 14seg display is upside-down + u16 flip = m_r << 7 | m_r >> 7; + m_display->matrix(m_inp_mux, bitswap<14>(flip, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); +} + +void horocomp_state::write_d(u16 data) +{ + // DIO0-DIO9: input mux + // DIO0-DIO7: digit select + m_inp_mux = data; + update_display(); +} + +void horocomp_state::write_r(u16 data) +{ + // RO01-RO14: digit segment data + m_r = data; + update_display(); +} + +u8 horocomp_state::read_p() +{ + // PI4: mode switch + // PI5-PI8: multiplexed inputs + return read_inputs(10) << 4 | (m_inputs[10]->read() & 8); +} + +void horocomp_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +/* physical button layout and labels are like this: + + CAP. + AQU. [ ] SAG. + [ ] 9 [ ] + PIS. 8 SCO. + [ ] 7[ ] + +ARI.[ ]0 6[ ]LIB. + + [ ]1 5[ ] [ ] [ ] [ ] [ ] + TAU. 2 4 VIR. LOVE CAREER TRAVEL MONEY + [ ] 3 [ ] + GEM. [ ] LEO [ ] [ ] [ ] [ ] + CAN. FRIENDS SPIRIT FAMILY CREATIVE +*/ + +static INPUT_PORTS_START( horocomp ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Love") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Friends") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Aries") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Career") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Spirit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Taurus") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Travel") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Family") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Gemini") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Money") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Creative") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Cancer") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Leo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Aquarius / Reset") + + PORT_START("IN.5") // DIO5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Virgo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Pisces") + + PORT_START("IN.6") // DIO6 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Libra") + + PORT_START("IN.7") // DIO7 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Scorpio") + + PORT_START("IN.8") // DIO8 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Sagittarius") + + PORT_START("IN.9") // DIO9 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Capricorn") + + PORT_START("IN.10") // PI4 + PORT_CONFNAME( 0x08, 0x00, "Mode" ) + PORT_CONFSETTING( 0x08, "C" ) // compatibility + PORT_CONFSETTING( 0x00, "P" ) // personal +INPUT_PORTS_END + +void horocomp_state::horocomp(machine_config &config) +{ + // basic machine hardware + MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K + m_maincpu->write_d().set(FUNC(horocomp_state::write_d)); + m_maincpu->write_r().set(FUNC(horocomp_state::write_r)); + m_maincpu->read_p().set(FUNC(horocomp_state::read_p)); + m_maincpu->write_spk().set(FUNC(horocomp_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_horocomp); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( horocomp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm95_b9001-13", 0x0000, 0x0800, CRC(d284a837) SHA1(02092db2a29b4bb7e9f86286601b67b2e9556476) ) + + ROM_REGION( 605, "maincpu:opla", 0 ) + ROM_LOAD( "mm78la_horocomp_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel World Championship Football (model 3202) + * MM78 MCU (MM78L pinout) (label MM78 A78C6-12, die label A78C6) + * MM78 MCU (MM78L pinout) (label MM78 A78C7-12, die label A78C7) + * 8-digit 7seg VFD, cyan/red/green VFD Itron CP5023, 1-bit sound + + It was patented under US4422639. Like the Baseball counterpart (mwcbaseb in + hh_hmcs40.cpp), this handheld is a complex game. + +***************************************************************************/ + +class mwcfootb_state : public hh_pps41_state +{ +public: + mwcfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag), + m_subcpu(*this, "subcpu") + { } + + void mwcfootb(machine_config &config); + +private: + required_device m_subcpu; + + void update_display(); + + void main_write_d(u16 data); + u16 main_read_d(); + void main_write_r(u16 data); + u8 main_read_p(); + + void sub_write_d(u16 data); + void sub_write_r(u16 data); +}; + +// handlers + +void mwcfootb_state::update_display() +{ + m_display->matrix(m_grid, bitswap<19>(m_plate, 19,18,17,16, 11,10,9,8,15,14,13,12, 2,3,1,0,6,5,4)); +} + +// maincpu side + +void mwcfootb_state::main_write_d(u16 data) +{ + // DIO0-DIO7: vfd grid + // DIO0-DIO2: input mux + m_grid = m_inp_mux = data; + update_display(); + + // DIO8: subcpu INT0 + m_subcpu->set_input_line(0, (data & 0x100) ? ASSERT_LINE : CLEAR_LINE); +} + +u16 mwcfootb_state::main_read_d() +{ + // DIO9: subcpu DIO9 + return m_subcpu->d_output_r() & 0x200; +} + +void mwcfootb_state::main_write_r(u16 data) +{ + // RIO1-RIO7: vfd plate 0-6 + m_plate = (m_plate & 0xfff00) | (~data & 0x7f); + update_display(); + + // RIO8: speaker out + m_speaker->level_w(BIT(~data, 7)); +} + +u8 mwcfootb_state::main_read_p() +{ + // PI1-PI8: multiplexed inputs + return ~read_inputs(3); +} + +// subcpu side + +void mwcfootb_state::sub_write_d(u16 data) +{ + // DIO0-DIO3: vfd plate 15-18 + m_plate = (m_plate & 0x0ffff) | (data << 16 & 0xf0000); + update_display(); + + // DIO9: maincpu INT0 (+DIO9) + m_maincpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); +} + +void mwcfootb_state::sub_write_r(u16 data) +{ + // RIO1-RIO8: vfd plate 7-14 + m_plate = (m_plate & 0xf00ff) | (~data << 8 & 0xff00); + update_display(); +} + +// config + +/* physical button layout and labels are like this: + + (home team side) (visitor team side) + [1] RECEIVERS [2] [1] RECEIVERS [2] + + [1] [1] + [4] [PAUSE] [2] [4] [PAUSE] [2] + [3] [3] + DOWN QUARTER + [ENTER] YDS. TO GO TIME LEFT POSITION SCORE [ENTER] + [KICK] [TIME] [ ] [ ] [ ] [ ] [TIME] [KICK] + + [^] [^] + [<] [P/C] [>] [<] [P/C] [>] + [v] [v] +*/ + +static INPUT_PORTS_START( mwcfootb ) // P1 = left/home, P2 = right/visitor + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("Position") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 P/C/Pause") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Quarter Time Left") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Down / Yards To Go") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Kick") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 P/C/Pause") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Time") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Enter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Time") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Enter") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 1") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Left/4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Right/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Down/3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Up/1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Left/4") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Right/2") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Down/3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Up/1") +INPUT_PORTS_END + +void mwcfootb_state::mwcfootb(machine_config &config) +{ + // basic machine hardware + MM78(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mwcfootb_state::main_write_d)); + m_maincpu->read_d().set(FUNC(mwcfootb_state::main_read_d)); + m_maincpu->write_r().set(FUNC(mwcfootb_state::main_write_r)); + m_maincpu->read_p().set(FUNC(mwcfootb_state::main_read_p)); + m_maincpu->read_sdi().set(m_subcpu, FUNC(pps41_base_device::sdo_r)); + m_maincpu->write_ssc().set(m_subcpu, FUNC(pps41_base_device::ssc_w)); + + MM78(config, m_subcpu, 360000); // osc. from maincpu + m_subcpu->write_d().set(FUNC(mwcfootb_state::sub_write_d)); + m_subcpu->write_r().set(FUNC(mwcfootb_state::sub_write_r)); + m_subcpu->read_sdi().set(m_maincpu, FUNC(pps41_base_device::sdo_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 571); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + m_display->set_segmask(0x7f, 0x7f); + config.set_default_layout(layout_mwcfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mwcfootb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm78_a78c6-12", 0x0000, 0x0800, CRC(91cf0d9b) SHA1(8d778b441eb26fcff50e8532c142f368c0dd5818) ) + + ROM_REGION( 0x0800, "subcpu", 0 ) + ROM_LOAD( "mm78_a78c7-12", 0x0000, 0x0800, CRC(b991d06e) SHA1(1f801b5cd7214f7378ae3f19799b84a9dc5bba4e) ) + + ROM_REGION( 248486, "screen", 0) + ROM_LOAD( "mwcfootb.svg", 0, 248486, CRC(03d17b85) SHA1(c877316c0c7923432235655d810fea8d714a4b31) ) +ROM_END + + + + + +/*************************************************************************** + + Selchow & Righter Scrabble Sensor + * MM76EL MCU (label B8610-11, die label B8610) + * 16 leds, 1-bit sound + + The game concept is similar to Mastermind. Enter a word (or press AUTO.) + to start the game, then try to guess it. + +***************************************************************************/ + +class scrabsen_state : public hh_pps41_state +{ +public: + scrabsen_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void scrabsen(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void scrabsen_state::update_int() +{ + // players switch is tied to MCU INT0 + m_maincpu->set_input_line(0, (m_inputs[5]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void scrabsen_state::update_display() +{ + m_display->matrix(m_inp_mux >> 6 & 3, ~m_r); +} + +void scrabsen_state::write_d(u16 data) +{ + // DIO0-DIO4: input mux + // DIO6,DIO7: led select + m_inp_mux = data; + update_display(); + + // DIO8: speaker out + m_speaker->level_w(BIT(data, 8)); +} + +void scrabsen_state::write_r(u16 data) +{ + // RIO1-RIO8: led data + m_r = data; + update_display(); +} + +u8 scrabsen_state::read_p() +{ + // PI1-PI7: multiplexed inputs + return ~read_inputs(5); +} + +// config + +static INPUT_PORTS_START( scrabsen ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("Space") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME("Auto.") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + + PORT_START("IN.5") // INT0 + PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, scrabsen_state, players_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) // single + PORT_CONFSETTING( 0x00, "2" ) // double +INPUT_PORTS_END + +void scrabsen_state::scrabsen(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 380000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(scrabsen_state::write_d)); + m_maincpu->write_r().set(FUNC(scrabsen_state::write_r)); + m_maincpu->read_p().set(FUNC(scrabsen_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 8); + config.set_default_layout(layout_scrabsen); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( scrabsen ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "b8610-11", 0x0000, 0x0400, CRC(97c8a466) SHA1(ed5d2cddd2761ed6e3ddc47d97b2ed19a2aaeee9) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) // unused + ROM_LOAD( "mm76_scrabsen_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) +ROM_END + + + + + +/*************************************************************************** + + Selchow & Righter Reader's Digest Q&A + * MM76EL MCU (label MM76EL B8654-11, die label B8654) + * 9-digit 7seg LED display(4 unused), 2-bit sound + + The game requires question books. The player inputs a 3-digit code and + answers 20 multiple-choice questions from the page. + +***************************************************************************/ + +class rdqa_state : public hh_pps41_state +{ +public: + rdqa_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void rdqa(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void rdqa_state::update_int() +{ + // players switch is tied to MCU INT0 + m_maincpu->set_input_line(0, (m_inputs[4]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void rdqa_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void rdqa_state::write_d(u16 data) +{ + // DIO0-DIO4: digit select + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8,DIO9: speaker out + m_speaker->level_w(data >> 8 & 3); +} + +void rdqa_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 rdqa_state::read_p() +{ + // PI1-PI5: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( rdqa ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.4") // INT0 + PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rdqa_state, players_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) // single + PORT_CONFSETTING( 0x00, "2" ) // double +INPUT_PORTS_END + +void rdqa_state::rdqa(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 400000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(rdqa_state::write_d)); + m_maincpu->write_r().set(FUNC(rdqa_state::write_r)); + m_maincpu->read_p().set(FUNC(rdqa_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 7); + m_display->set_segmask(0x1f, 0x7f); + config.set_default_layout(layout_rdqa); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( rdqa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mm76el_b8654-11", 0x0000, 0x0400, CRC(95c00eee) SHA1(1537626df03a7131d83a555e557a4528e093a22a) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_rdqa_output.pla", 0, 314, CRC(e024b2d3) SHA1(fc3121e70f22151cf8f3411f9fcbac88002ae330) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1979, smastmind, 0, 0, smastmind, mastmind, mastmind_state, empty_init, "Invicta", "Super-Sonic Electronic Master Mind", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, dunksunk, 0, 0, dunksunk, dunksunk, dunksunk_state, empty_init, "Kmart", "Dunk 'n Sunk", MACHINE_SUPPORTS_SAVE ) + +CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, mfootb2, 0, 0, mfootb2, mfootb2, mfootb2_state, empty_init, "Mattel Electronics", "Football 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, brainbaf, 0, 0, brainbaf, brainbaf, brainbaf_state, empty_init, "Mattel Electronics", "Brain Baffler", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, horocomp, 0, 0, horocomp, horocomp, horocomp_state, empty_init, "Mattel Electronics", "Horoscope Computer", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel Electronics", "World Championship Football", MACHINE_SUPPORTS_SAVE ) + +CONS( 1978, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, rdqa, 0, 0, rdqa, rdqa, rdqa_state, empty_init, "Selchow & Righter", "Reader's Digest Q&A - Computer Question & Answer Game", MACHINE_SUPPORTS_SAVE ) // *** + +// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_rw5000.cpp b/src/mame/misc_handheld/hh_rw5000.cpp new file mode 100644 index 00000000000..0424ccad720 --- /dev/null +++ b/src/mame/misc_handheld/hh_rw5000.cpp @@ -0,0 +1,1109 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +Rockwell A/B5000 MCU series handhelds (before PPS-4/1) +Mostly calculators on these MCUs, but also Mattel's first couple of handhelds. + +ROM source notes when dumped from another model, but confident it's the same: +- rw18r: Rockwell 8R +- rw24k: Rockwell 14RD-II +- misatk: Mattel Space Alert + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/rw5000/a5000.h" +#include "cpu/rw5000/a5500.h" +#include "cpu/rw5000/a5900.h" +#include "cpu/rw5000/b5000.h" +#include "cpu/rw5000/b5500.h" +#include "cpu/rw5000/b6000.h" +#include "cpu/rw5000/b6100.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "autorace.lh" +#include "gravity.lh" +#include "mbaseb.lh" +#include "mfootb.lh" +#include "misatk.lh" +#include "rw10r.lh" +#include "rw24k.lh" +#include "rw30r.lh" + +//#include "hh_rw5000_test.lh" // common test-layout - use external artwork + + +class hh_rw5000_state : public driver_device +{ +public: + hh_rw5000_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(power_button); + template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } + template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<9> m_inputs; // max 9 + + u16 m_inp_mux = 0; + + // MCU output pin state + u16 m_str = 0; + u16 m_seg = 0; + + u8 read_inputs(int columns); + void switch_change(int sel, u32 mask, bool next); +}; + + +// machine start/reset + +void hh_rw5000_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_str)); + save_item(NAME(m_seg)); +} + +void hh_rw5000_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_rw5000_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +void hh_rw5000_state::switch_change(int sel, u32 mask, bool next) +{ + // config switches (for direct control) + ioport_field *inp = m_inputs[sel]->field(mask); + + if (next && inp->has_next_setting()) + inp->select_next_setting(); + else if (!next && inp->has_previous_setting()) + inp->select_previous_setting(); +} + +INPUT_CHANGED_MEMBER(hh_rw5000_state::power_button) +{ + // power button or switch + bool power = (param) ? (bool(param - 1)) : !newval; + + if (!power && m_display != nullptr) + m_display->clear(); + m_maincpu->set_input_line(INPUT_LINE_RESET, power ? CLEAR_LINE : ASSERT_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Mattel Auto Race (model 9879) + * B6000 MCU (label B6000CA, die label B6000-B) + * 2-digit 7seg display, 21 other leds, 1-bit sound + + This is Mattel's first electronic handheld game, also the first CPU-based + handheld game overall. Hardware design (even the MCU) and programming + was done at Rockwell. + + A European version was released as "Ski Slalom", except it's upside-down. + +***************************************************************************/ + +class autorace_state : public hh_rw5000_state +{ +public: + autorace_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void autorace(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void autorace_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void autorace_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( autorace ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " + PORT_CONFNAME( 0x0c, 0x0c, "Gear" ) + PORT_CONFSETTING( 0x0c, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x00, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("POWER") // power switch + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Start / Reset") + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_prev<0>, 0x0c) PORT_NAME("Gear Switch Down") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_next<0>, 0x0c) PORT_NAME("Gear Switch Up") +INPUT_PORTS_END + +void autorace_state::autorace(machine_config &config) +{ + // basic machine hardware + B6000(config, m_maincpu, 160000); // approximation + m_maincpu->write_str().set(FUNC(autorace_state::write_str)); + m_maincpu->write_seg().set(FUNC(autorace_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.02, 0.2); // player led is brighter + config.set_default_layout(layout_autorace); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( autorace ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "b6000ca", 0x000, 0x200, CRC(a112c928) SHA1(aa5d0b46a08e2460081d4148cf254dc5ec53817e) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Missile Attack (model 2048) / Space Alert (model 2448) + * B6000 MCU (label B6001CA/EA, die label B6001) + * 2-digit 7seg display, 21 other leds, 1-bit sound + + The initial release was called Missile Attack, it didn't sell well (Mattel + blamed it on NBC for refusing to air their commercial). They changed the + title/setting and rereleased it as "Space Alert" (aka "Battlestar Galactica: + Space Alert"). In 1980, they advertised another rerelease, this time as + "Flash Gordon", but that didn't come out. + +***************************************************************************/ + +class misatk_state : public hh_rw5000_state +{ +public: + misatk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void misatk(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void misatk_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void misatk_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( misatk ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("POWER") // power switch + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Arm / Off") +INPUT_PORTS_END + +void misatk_state::misatk(machine_config &config) +{ + // basic machine hardware + B6000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(misatk_state::write_str)); + m_maincpu->write_seg().set(FUNC(misatk_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.015, 0.15); // player led is brighter + config.set_default_layout(layout_misatk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( misatk ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "b6001ea", 0x000, 0x200, CRC(56564b79) SHA1(6f33f57ea312cb2018fb59f72eaff3a9642e74a2) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Football (model 2024) + * B6100 MCU (label B6100EB/-15, die label B6100 A) + * 7-digit 7seg display, 27 other leds, 1-bit sound + + When Football II came out, they renamed this one to Football I. + +***************************************************************************/ + +class mfootb_state : public hh_rw5000_state +{ +public: + mfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void mfootb(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(score_button) { update_display(); } + +private: + void update_display(); + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void mfootb_state::update_display() +{ + // 4th digit DP is from the SCORE button + u8 dp = (m_inputs[1]->read() & 2) ? 0x80 : 0; + m_display->matrix(m_str, (m_seg << 1 & 0x700) | dp | (m_seg & 0x7f)); +} + +void mfootb_state::write_str(u16 data) +{ + m_str = data; + update_display(); +} + +void mfootb_state::write_seg(u16 data) +{ + m_seg = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( mfootb ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // PRO 1 + PORT_CONFSETTING( 0x00, "2" ) // PRO 2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") PORT_CHANGED_MEMBER(DEVICE_SELF, mfootb_state, score_button, 0) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void mfootb_state::mfootb(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 280000); // approximation + m_maincpu->write_str().set(FUNC(mfootb_state::write_str)); + m_maincpu->write_seg().set(FUNC(mfootb_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x7f, 0x7f); + m_display->set_segmask(0x08, 0xff); // only one digit has DP + m_display->set_bri_levels(0.02, 0.2); // player led is brighter + config.set_default_layout(layout_mfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mfootb ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6100eb", 0x000, 0x300, CRC(5b27620f) SHA1(667ff6cabced89ef4ad848b73d66a06526edc5e6) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Baseball (model 2942) + * B6100 MCU (label B6101-12, die label B6101 A) + * 4-digit 7seg display, 28 other leds, 1-bit sound + +***************************************************************************/ + +class mbaseb_state : public hh_rw5000_state +{ +public: + mbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void mbaseb(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void mbaseb_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void mbaseb_state::write_seg(u16 data) +{ + m_display->write_mx(bitswap<10>(data,7,8,9,6,5,4,3,2,1,0)); +} + +// config + +static INPUT_PORTS_START( mbaseb ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pitch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // PRO 1 + PORT_CONFSETTING( 0x00, "2" ) // PRO 2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Run") + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void mbaseb_state::mbaseb(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 280000); // approximation + m_maincpu->write_str().set(FUNC(mbaseb_state::write_str)); + m_maincpu->write_seg().set(FUNC(mbaseb_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 10); + m_display->set_segmask(0x170, 0x7f); + m_display->set_segmask(0x110, 0xff); // 2 digits have DP + config.set_default_layout(layout_mbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mbaseb ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6101-12", 0x000, 0x300, CRC(7720ddcc) SHA1(cd43126db7c6262f659f325aa58420e1a8a1a659) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Gravity (model 8291) + * B6100 MCU (label B6102-11, die label B6102 A) + * 3-digit 7seg display, 27 other leds, 1-bit sound + + It was advertised as "Catastrophe", but went unreleased. It got sold later + as "Gravity", with a less catastrophic setting. + + The game is basically 3 mini games in 1: + - Juggling (Rumbling Rocks in Catastrophe) + - Coin Drop (Quake Shock in Catastrophe) + - Docking (Meteorite Shower in Catstrophe) + +***************************************************************************/ + +class gravity_state : public hh_rw5000_state +{ +public: + gravity_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void gravity(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void gravity_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void gravity_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( gravity ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void gravity_state::gravity(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(gravity_state::write_str)); + m_maincpu->write_seg().set(FUNC(gravity_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 10); + m_display->set_segmask(0x1c0, 0x7f); + config.set_default_layout(layout_gravity); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gravity ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6102-11", 0x000, 0x300, CRC(532f332e) SHA1(593224d3a2a5b6022f0d73b6e6fb9093d2d54f68) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 10R + * A5000 MCU (label A5000PA, die label A5000) + * 8-digit 7seg LED display + + Rockwell 12R "Square Root" + * A5000 MCU (label A5001, die label A5001) + * rest is same as 10R + + 12R supports square root by pressing × after ÷ (or the other way around). + +***************************************************************************/ + +class rw10r_state : public hh_rw5000_state +{ +public: + rw10r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw10r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw10r_state::write_str(u16 data) +{ + // STR0-STR7: digit select + // STR4-STR7: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw10r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw10r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( rw10r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") +INPUT_PORTS_END + +void rw10r_state::rw10r(machine_config &config) +{ + // basic machine hardware + A5000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw10r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw10r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw10r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_rw10r); +} + +// roms + +ROM_START( rw10r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5000pa", 0x000, 0x0c0, CRC(db6cbbea) SHA1(3757f303a84e412e8763c4ec2170c9badc172454) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + +ROM_START( rw12r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5001", 0x000, 0x0c0, CRC(4337a46b) SHA1(70f4683eac0afa31a6cd9dd44fdf1b6680575f67) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 8R "Automatic Percent", Rockwell 18R "Memory" + * B5000 MCU (label B5000CC, die label B5000) + * 8-digit 7seg LED display + + This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by + Tandy (Radio Shack) as EC-220. + + 8R/9TR doesn't have the memory store/recall buttons. + +***************************************************************************/ + +class rw18r_state : public hh_rw5000_state +{ +public: + rw18r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw18r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw18r_state::write_str(u16 data) +{ + // STR0-STR7: digit select + // STR4-STR8: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw18r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw18r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( rw18r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.4") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("STO") // unpopulated on 8R + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("RCL") // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void rw18r_state::rw18r(machine_config &config) +{ + // basic machine hardware + B5000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw18r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw18r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw18r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_rw10r); +} + +// roms + +ROM_START( rw18r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b5000cc", 0x000, 0x0c0, CRC(ace32614) SHA1(23cf11acf2e73ce2dfc165cb87f86fab15f69ff7) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 30R "Slide Rule Memory" + * B5500 MCU (label B5500PA, die label B5500) + * 9-digit 7seg LED display + + Rockwell 31R "Slide Rule Memory" + * A5500 MCU (label A5502PA, die label A5500) + * rest is same as 30R + + 30R and 31R have the exact same functionality, even though they are on + different MCUs. There's also a 30R version on an A4600 MCU. + +***************************************************************************/ + +class rw30r_state : public hh_rw5000_state +{ +public: + rw30r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw30r(machine_config &config); + void rw31r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw30r_state::write_str(u16 data) +{ + // STR0-STR8: digit select + // STR4-STR8: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw30r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw30r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( rw30r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(". / +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F / CF") // function + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / M+") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / M-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / x" UTF8_POW_2) + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / 1/x") + + PORT_START("IN.4") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("C / MC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("X\xe2\x86\x94Y / X\xe2\x86\x94M") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% / " UTF8_SQUAREROOT "x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / MR") +INPUT_PORTS_END + +void rw30r_state::rw30r(machine_config &config) +{ + // basic machine hardware + B5500(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_rw30r); +} + +void rw30r_state::rw31r(machine_config &config) +{ + rw30r(config); + + // basic machine hardware + A5500(config.replace(), m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); +} + +// roms + +ROM_START( rw30r ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b5500pa", 0x000, 0x280, CRC(937dd695) SHA1(bc286209943f49e9acccbf319b87c6ec24386894) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + +ROM_START( rw31r ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5502pa", 0x000, 0x280, CRC(6ee0b30a) SHA1(42e5d1e29bdef4b4faaafee3592cacc0e66b982f) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 24K aka "the 24K" (see below for more) + * A5900 MCU (label A5901CA/A5903CB, die label A59__) + * 9-digit 7seg VFD + + This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and + probably also in 14RD, 24RD, 22K. + + 14RD has 6 less buttons than 24RD, the non-II versions have LED(s) instead + of a 9th digit for minus sign and memory status. 24K has an extra button + for register exchange. The difference between 24K and 24K II is unknown. + +***************************************************************************/ + +class rw24k_state : public hh_rw5000_state +{ +public: + rw24k_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw24k(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw24k_state::write_str(u16 data) +{ + // STR0-STR8: digit select, input mux + m_display->write_my(data); + m_inp_mux = data; +} + +void rw24k_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw24k_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(9); +} + +// config + +static INPUT_PORTS_START( rw24k ) + PORT_START("IN.0") // STR0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // unpopulated on 14RD + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("M+") // " + + PORT_START("IN.1") // STR1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M-") // " + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // STR2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // STR3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("MC") // " + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("MR") // " + + PORT_START("IN.4") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.5") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.6") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.7") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.8") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("\xe2\x86\x94") // register exchange - unpopulated on 14RD/24RD + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void rw24k_state::rw24k(machine_config &config) +{ + // basic machine hardware + A5900(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw24k_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw24k_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw24k_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_rw24k); +} + +// roms + +ROM_START( rw24k ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "a5901ca", 0x000, 0x200, CRC(00de7764) SHA1(0f24add4b6d2660aad63ddd4d0003d59a0e39df6) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1976, autorace, 0, 0, autorace, autorace, autorace_state, empty_init, "Mattel Electronics", "Auto Race", MACHINE_SUPPORTS_SAVE ) +CONS( 1977, misatk, 0, 0, misatk, misatk, misatk_state, empty_init, "Mattel Electronics", "Missile Attack / Space Alert", MACHINE_SUPPORTS_SAVE ) +CONS( 1977, mfootb, 0, 0, mfootb, mfootb, mfootb_state, empty_init, "Mattel Electronics", "Football (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mbaseb, 0, 0, mbaseb, mbaseb, mbaseb_state, empty_init, "Mattel Electronics", "Baseball (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gravity, 0, 0, gravity, gravity, gravity_state, empty_init, "Mattel Electronics", "Gravity (Mattel)", MACHINE_SUPPORTS_SAVE ) + +COMP( 1974, rw10r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "10R (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw12r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "12R: Square Root", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw18r, 0, 0, rw18r, rw18r, rw18r_state, empty_init, "Rockwell", "18R: Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1974, rw30r, 0, 0, rw30r, rw30r, rw30r_state, empty_init, "Rockwell", "30R: Slide Rule Memory (B5500 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw31r, rw30r, 0, rw31r, rw30r, rw30r_state, empty_init, "Rockwell", "31R: Slide Rule Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, rw24k, 0, 0, rw24k, rw24k, rw24k_state, empty_init, "Rockwell", "24K (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/misc_handheld/hh_sm510.cpp b/src/mame/misc_handheld/hh_sm510.cpp new file mode 100644 index 00000000000..298bbdec48d --- /dev/null +++ b/src/mame/misc_handheld/hh_sm510.cpp @@ -0,0 +1,10093 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Henrik Algestam +// thanks-to:Sean Riddle, Igor, Lee Robson, Milan Galcik +/*************************************************************************** + +Sharp SM5xx family handhelds. +List of child drivers: +- rzone: Tiger R-Zone + +The LCD screen graphics are provided internally with an SVG file. +MAME external artwork is recommended for the backgrounds inlays. + +Most of these LCD games are meant to stay powered on 24/7. There is no +RTC or NVRAM. Quitting MAME is akin to removing the handheld's battery. +Use -autosave to at least make them remember the highscores. + +TODO: +- improve display decay simulation? but SVG doesn't support setting brightness + per segment, adding pwm_display_device right now has no added value +- add nstarfox sound effect chip emulation +- add svg screen for nsmb3, nsmw +- confirm gnw_bfight rom (assumed to be the same as gnw_bfightn) +- confirm gnw_climber rom (assumed to be the same as gnw_climbern) +- confirm gnw_smb rom (assumed to be the same as gnw_smbn) +- Currently there is no accurate way to dump the SM511/SM512 melody ROM + electronically. For the ones that weren't decapped, they were read by + playing back all melody data and reconstructing it to ROM. Visual(decap) + verification is wanted for: bassmate, gnw_bfightn, gnw_bjack, gnw_bsweep, + gnw_climbern, gnw_dkcirc, gnw_dkhockey, gnw_dkjrp, gnw_dkong3, gnw_gcliff, + gnw_mariocmt, gnw_mariocmta, gnw_mariotj, gnw_mbaway, gnw_mmousep, + gnw_pinball, gnw_popeyep, gnw_sbuster, gnw_snoopyp, gnw_zelda + +**************************************************************************** + +Misc Nintendo Game & Watch notes: + +Trivia: Most of the Nintendo G&W have built-in cheats, likely kept in by +Nintendo to test the game. These were not accessible to users of course, +but for the sake of fun they're available on MAME. + +BTANB: On some of the earlier G&W games, eg. gnw_fire, gnw_mmouse, gnw_pchute, +gnw_popeye, the controls still work after game over, this happens on the real +thing too. + +Game list (* denotes not emulated yet) + +Serial Series MCU Title +--------------------------------------------- +AC-01 s SM5A Ball (aka Toss-Up) +FL-02 s SM5A Flagman (aka Flag Man) +MT-03 s SM5A Vermin (aka The Exterminator) +RC-04 s SM5A Fire (aka Fireman Fireman) +IP-05 s SM5A Judge +MH-06 g SM5A Manhole +CN-07 g SM5A Helmet (aka Headache) +LN-08 g SM5A Lion +PR-21 ws SM5A Parachute +OC-22 ws SM5A Octopus +PP-23 ws SM5A Popeye +FP-24 ws SM5A Chef +MC-25 ws SM5A Mickey Mouse +EG-26 ws SM5A Egg (same ROM as MC-25, but LCD differs) +FR-27 ws SM5A Fire +TL-28 ws SM510 Turtle Bridge +ID-29 ws SM510 Fire Attack +SP-30 ws SM510 Snoopy Tennis +OP-51 ms SM510 Oil Panic +DK-52 ms SM510 Donkey Kong +DM-53 ms SM510 Mickey & Donald +GH-54 ms SM510 Green House +JR-55 ms SM510 Donkey Kong II +MW-56 ms SM510 Mario Bros. +LP-57 ms SM510 Rain Shower +TC-58 ms SM510 Life Boat +PB-59 ms SM511 Pinball +BJ-60 ms SM512 Black Jack +MG-61 ms SM510 Squish +BD-62 ms SM512 Bomb Sweeper +JB-63 ms SM511 Safe Buster +MV-64 ms SM512 Gold Cliff +ZL-65 ms SM512 Zelda +CJ-71* tt SM511? Donkey Kong Jr. +CM-72 tt SM511 Mario's Cement Factory +SM-73* tt SM511? Snoopy +PG-74* tt SM511? Popeye +SM-91 p SM511 Snoopy (assume same ROM & LCD as tabletop version) +PG-92 p SM511 Popeye " +CJ-93 p SM511 Donkey Kong Jr. " +TB-94 p SM511 Mario's Bombs Away +DC-95 p SM511 Mickey Mouse +MK-96 p SM511 Donkey Kong Circus (same ROM as DC-95, LCD is different) +DJ-101 nws SM510 Donkey Kong Jr. +ML-102 nws SM510 Mario's Cement Factory +NH-103 nws SM510 Manhole +TF-104 nws SM510 Tropical Fish +YM-105 nws SM511 Super Mario Bros. +DR-106 nws SM511 Climber +BF-107 nws SM511 Balloon Fight +MB-108 nws SM511 Mario The Juggler +BU-201 sc SM510 Spitball Sparky +UD-202 sc SM510 Crab Grab +BX-301 mvs SM511 Boxing (aka Punch Out) +AK-302 mvs SM511 Donkey Kong 3 +HK-303 mvs SM511 Donkey Kong Hockey +YM-801 cs SM511 Super Mario Bros. (assume same ROM as nws version) +DR-802 cs SM511 Climber " +BF-803 cs SM511 Balloon Fight " +YM-901-S* x SM511 Super Mario Bros. " + +RGW-001 (2010 Ball remake) is on different hardware, ATmega169PV MCU. +The "Mini Classics" keychains are by Stadlbauer, not Nintendo. +The "Game Watch" wristwatches are by Nelsonic, not Nintendo. + +Bassmate Computer (BM-501) is on identical hardware as G&W Multi Screen, +but it's not part of the game series. + +**************************************************************************** + +Regarding Электроника (Elektronika, translated: Electronics): It is not +actually a company. It was a USSR brand name for consumer electronics, +produced by factories belonging to the Ministry of Electronic Industry +(Minelektronprom, МЭП). + +The LCD games were produced by: Angstrem, Mikron, Voschod (Russia), Billur +(Azerbaijan), Kamerton, Evistor (Belarus), Severodonetsk Instrument-Making +Plant (Ukraine), PO Proton and more. Their most popular LCD game (Nu, pogodi!), +is known to be initially produced by Evistor. + +Most of the games are marked "bootleg" in MAME, because the ROM contents are +a 1:1 copy of Nintendo Game & Watch games. Known G&W cloned by Elektronika: +Fire(FR-27), Octopus, Chef, Egg/Mickey Mouse, Donkey Kong Jr.(CJ-93), +Spitball Sparky. + +The MCUs used were not imported from Sharp, but cloned by USSR, renamed to +КБ1013ВК1-2 for SM5A and КБ1013ВК4-2 for SM510. + +***************************************************************************/ + +#include "emu.h" +#include "hh_sm510.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "gnw_dualv.lh" +#include "gnw_dualh.lh" + +//#include "hh_sm510_test.lh" // common test-layout - use external artwork +#include "hh_sm500_test.lh" // " + + +// machine start/reset + +void hh_sm510_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + + // determine number of input lines (set it in the subclass constructor if different) + if (m_inp_lines == 0 && m_inp_fixed < 0) + { + for (; m_inputs[m_inp_lines] != nullptr; m_inp_lines++) { ; } + + // when last input line is fixed(GND) + if (m_inp_fixed == -2) + { + m_inp_lines--; + m_inp_fixed = m_inp_lines; + } + } + + // 1kHz display decay ticks + m_display_decay_timer = timer_alloc(FUNC(hh_sm510_state::display_decay_tick), this); + m_display_decay_timer->adjust(attotime::from_hz(1024), 0, attotime::from_hz(1024)); + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_inp_lines)); + save_item(NAME(m_inp_fixed)); + save_item(NAME(m_speaker_data)); + save_item(NAME(m_s)); + save_item(NAME(m_r)); + + save_item(NAME(m_display_x_len)); + save_item(NAME(m_display_y_len)); + save_item(NAME(m_display_z_len)); + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_decay_pivot)); + save_item(NAME(m_decay_len)); +} + +void hh_sm510_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// lcd panel - on lcd handhelds, usually not a generic x/y screen device +// deflicker here, especially needed for SM500/SM5A with the active shift register + +TIMER_CALLBACK_MEMBER(hh_sm510_state::display_decay_tick) +{ + u8 z_mask = (1 << m_display_z_len) - 1; + u8 zx_len = 1 << (m_display_x_len + m_display_z_len); + + for (int zx = 0; zx < zx_len; zx++) + { + for (int y = 0; y < m_display_y_len; y++) + { + // delay lcd segment on/off state + if (m_display_state[zx] >> y & 1) + { + if (m_display_decay[y][zx] < (m_decay_pivot + m_decay_len)) + m_display_decay[y][zx]++; + } + else if (m_display_decay[y][zx] > 0) + m_display_decay[y][zx]--; + u8 active_state = (m_display_decay[y][zx] < m_decay_pivot) ? 0 : 1; + + // SM510 series: output to x.y.z, where: + // x = group a/b/bs/c (0/1/2/3) + // y = segment 1-16 (0-15) + // z = common H1-H4 (0-3) + + // SM500/SM530 series: output to x.y.z, where: + // x = O group (0-*) + // y = O segment 1-4 (0-3) + // z = common H1/H2 (0/1) + m_out_x[zx >> m_display_z_len][y][zx & z_mask] = active_state; + } + } +} + +void hh_sm510_state::set_display_size(u8 x, u8 y, u8 z) +{ + // x = groups(in bits) + // y = number of segments per group + // z = commons(in bits) + m_display_x_len = x; + m_display_y_len = y; + m_display_z_len = z; +} + +void hh_sm510_state::sm510_lcd_segment_w(offs_t offset, u16 data) +{ + set_display_size(2, 16, 2); + m_display_state[offset] = data; +} + +void hh_sm510_state::sm500_lcd_segment_w(offs_t offset, u16 data) +{ + set_display_size(4, 4, 1); + m_display_state[offset] = data; +} + + +// generic input handlers - usually S output is input mux, and K input for buttons + +u8 hh_sm510_state::read_inputs(int columns, int fixed) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + if (fixed >= 0) + ret |= m_inputs[fixed]->read(); + + return ret; +} + +void hh_sm510_state::update_k_line() +{ + // this is necessary because the MCU can wake up on K input activity + m_maincpu->set_input_line(0, input_r() ? ASSERT_LINE : CLEAR_LINE); +} + +INPUT_CHANGED_MEMBER(hh_sm510_state::input_changed) +{ + update_k_line(); +} + +void hh_sm510_state::input_w(u8 data) +{ + m_inp_mux = data; + update_k_line(); +} + +u8 hh_sm510_state::input_r() +{ + return read_inputs(m_inp_lines, m_inp_fixed); +} + +INPUT_CHANGED_MEMBER(hh_sm510_state::acl_button) +{ + // ACL button is directly tied to MCU ACL pin + m_maincpu->set_input_line(SM510_INPUT_LINE_ACL, newval ? ASSERT_LINE : CLEAR_LINE); +} + + +// other generic output handlers + +void hh_sm510_state::piezo_r1_w(u8 data) +{ + // R1 to piezo (SM511 R pin is melody output) + m_speaker->level_w(data & 1); +} + +void hh_sm510_state::piezo_r2_w(u8 data) +{ + // R2 to piezo + m_speaker->level_w(data >> 1 & 1); +} + +void hh_sm510_state::piezo_input_w(u8 data) +{ + // R1 to piezo, other to input mux + piezo_r1_w(data & 1); + input_w(data >> 1); +} + +void hh_sm510_state::piezo2bit_r1_w(u8 data) +{ + // R1(+S1) to piezo + m_speaker_data = (m_speaker_data & ~1) | (data & 1); + m_speaker->level_w(m_speaker_data); +} + +void hh_sm510_state::piezo2bit_input_w(u8 data) +{ + // S1(+R1) to piezo, other to input mux + m_speaker_data = (m_speaker_data & ~2) | (data << 1 & 2); + m_speaker->level_w(m_speaker_data); + input_w(data >> 1); +} + + + +/*************************************************************************** + + Common Machine Configurations + +***************************************************************************/ + +// building blocks + +void hh_sm510_state::mcfg_cpu_common(machine_config &config) +{ + m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r)); + m_maincpu->read_ba().set([this] () { return m_io_ba.read_safe(1); }); + m_maincpu->read_b().set([this] () { return m_io_b.read_safe(1); }); +} + +void hh_sm510_state::mcfg_cpu_sm5a(machine_config &config) +{ + SM5A(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); +} + +void hh_sm510_state::mcfg_cpu_kb1013vk12(machine_config &config) +{ + KB1013VK12(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); +} + +void hh_sm510_state::mcfg_cpu_sm510(machine_config &config) +{ + SM510(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(2); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm511(machine_config &config) +{ + SM511(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm512(machine_config &config) +{ + SM512(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm530(machine_config &config) +{ + SM530(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) +{ + screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(width, height); + screen.set_visarea_full(); +} + +void hh_sm510_state::mcfg_sound_r1(machine_config &config) +{ + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w)); +} + + +// common presets + +void hh_sm510_state::sm5a_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm5a(config); + mcfg_sound_r1(config); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::kb1013vk12_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_kb1013vk12(config); + mcfg_sound_r1(config); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm510_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm510(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm511_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm511(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm530_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm530(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + + +// deviations + +// multi-screen + +void hh_sm510_state::sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight) +{ + mcfg_cpu_sm510(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, leftwidth, leftheight, "screen_left"); + mcfg_svg_screen(config, rightwidth, rightheight, "screen_right"); + + config.set_default_layout(layout_gnw_dualh); +} + +void hh_sm510_state::dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_sound_r1(config); + mcfg_svg_screen(config, topwidth, topheight, "screen_top"); + mcfg_svg_screen(config, botwidth, botheight, "screen_bottom"); + + config.set_default_layout(layout_gnw_dualv); +} + +void hh_sm510_state::sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm510(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + +void hh_sm510_state::sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm511(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + +void hh_sm510_state::sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm512(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + + +// Tiger (SM510 R mask is direct, BA/B pins always connected) + +void hh_sm510_state::sm510_tiger(machine_config &config, u16 width, u16 height) +{ + sm510_common(config, width, height); + + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->read_ba().set_ioport("BA"); + m_maincpu->read_b().set_ioport("B"); +} + +void hh_sm510_state::sm511_tiger1bit(machine_config &config, u16 width, u16 height) +{ + sm511_common(config, width, height); + + m_maincpu->read_ba().set_ioport("BA"); + m_maincpu->read_b().set_ioport("B"); +} + +void hh_sm510_state::sm511_tiger2bit(machine_config &config, u16 width, u16 height) +{ + sm511_tiger1bit(config, width, height); + + m_maincpu->write_s().set(FUNC(hh_sm510_state::piezo2bit_input_w)); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo2bit_r1_w)); + + // R via 120K resistor, S1 via 39K resistor (eg. tsonic, tsonic2, tbatmana) + static const double speaker_levels[] = { 0.0, 1.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(4, speaker_levels); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Nintendo Game & Watch: Ball (model AC-01) + * PCB label AC-01 + * Sharp SM5A label AC-01 5009 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as Toss-Up by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_ball_state : public hh_sm510_state +{ +public: + gnw_ball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_ball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ball ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_ball_state::gnw_ball(machine_config &config) +{ + sm5a_common(config, 1671, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ball ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ac-01", 0x0000, 0x0740, CRC(ac94e6e4) SHA1(8270cb61f9fbff252eafec411b4c67f0171f8687) ) + + ROM_REGION( 71748, "screen", 0) + ROM_LOAD( "gnw_ball.svg", 0, 71748, CRC(7c116eaf) SHA1(578882af492b8a9f1eb72e06a547c8b574255fb9) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Flagman (model FL-02) + * PCB label FL-02 + * Sharp SM5A label FL-02 2005 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as Flag Man by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_flagman_state : public hh_sm510_state +{ +public: + gnw_flagman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_flagman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_flagman ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("4") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_flagman_state::gnw_flagman(machine_config &config) +{ + sm5a_common(config, 1511, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_flagman ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fl-02", 0x0000, 0x0740, CRC(cc7a99e4) SHA1(d03d9a6b278bc11df7839708831241b5fa805f69) ) + + ROM_REGION( 56163, "screen", 0) + ROM_LOAD( "gnw_flagman.svg", 0, 56163, CRC(3aa97c65) SHA1(a363e71d371e5c85835cb3a0679760d0aedc75d5) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Vermin (model MT-03) + * PCB label MT-03 + * Sharp SM5A label MT-03 5012 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as The Exterminator by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_vermin_state : public hh_sm510_state +{ +public: + gnw_vermin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_vermin(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_vermin ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_vermin_state::gnw_vermin(machine_config &config) +{ + sm5a_common(config, 1650, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_vermin ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mt-03", 0x0000, 0x0740, CRC(f8493177) SHA1(d629432ef8e9fbd7bbdc3fbeb45d9bd70d9d571b) ) + + ROM_REGION( 105603, "screen", 0) + ROM_LOAD( "gnw_vermin.svg", 0, 105603, CRC(1bd59ef4) SHA1(099120105e80d4753838ea513ffa784c4690cf5f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire (model RC-04) + * PCB label RC-04 + * Sharp SM5A label RC-04 5103 (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the silver version, there's also a wide screen version. + + In the USA, it was distributed as Fireman Fireman by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_fires_state : public hh_sm510_state +{ +public: + gnw_fires_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_fires(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fires ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_fires_state::gnw_fires(machine_config &config) +{ + sm5a_common(config, 1646, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fires ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "rc-04", 0x0000, 0x0740, CRC(154ef27d) SHA1(fb65826dfd405ad05fe0f5f947c213214bbd61c0) ) + + ROM_REGION( 102678, "screen", 0) + ROM_LOAD( "gnw_fires.svg", 0, 102678, CRC(4f61f2f8) SHA1(2873629f0e36d3170bc284fa031a9c6181021495) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Judge (model IP-05) + * PCB label IP-05 + * Sharp SM5A label IP-05 5010, or IP-15 5012 (no decap) + * lcd screen with custom segments, 1-bit sound + + The first (green) issue of the game contains a bug where the players are + scored differently when wrongly dodging a win. This issue is fixed in the + second (purple) issue. + +***************************************************************************/ + +class gnw_judge_state : public hh_sm510_state +{ +public: + gnw_judge_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_judge(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_judge ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Dodge") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Hit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Dodge") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Hit") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") // 2-Player + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") // 1-Player + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Increase Computer's Operation Time (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_judge_state::gnw_judge(machine_config &config) +{ + sm5a_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_judge ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ip-15", 0x0000, 0x0740, CRC(f6ed6f62) SHA1(97bc1b5c383fb4077d982cfdc5a7d7603a0b5e2f) ) + + ROM_REGION( 105108, "screen", 0) + ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) +ROM_END + +ROM_START( gnw_judgeo ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ip-05", 0x0000, 0x0740, CRC(1b28a834) SHA1(cb8dbbf678ba22c4484d18cc1a6b99c1d34d1951) ) + + ROM_REGION( 105108, "screen", 0) + ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Manhole (model MH-06) + * PCB label MH-06 + * Sharp SM5A label MH-06 5104 (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the Gold Series version, there's also a new wide screen version + (NH-103) + +***************************************************************************/ + +class gnw_manholeg_state : public hh_sm510_state +{ +public: + gnw_manholeg_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_manholeg(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_manholeg ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_manholeg_state::gnw_manholeg(machine_config &config) +{ + sm5a_common(config, 1667, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_manholeg ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mh-06", 0x0000, 0x0740, CRC(ae52c425) SHA1(8da8a714ecbdde7d0f257b52a5014993675a5f3f) ) + + ROM_REGION( 125607, "screen", 0) + ROM_LOAD( "gnw_manholeg.svg", 0, 125607, CRC(4b281ff2) SHA1(18f212ab5738756e0841d6afa401a03f7aaddf7b) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Helmet (model CN-07) + * PCB label CN-07 + * Sharp SM5A label CN-07 5102, or CN-17 21ZA (no decap) + * lcd screen with custom segments, 1-bit sound + + In the UK, it was distributed as Headache by CGL. + + MCU label CN-07 is the first version, CN-17 is a bugfix release. + +***************************************************************************/ + +class gnw_helmet_state : public hh_sm510_state +{ +public: + gnw_helmet_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_helmet(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_helmet ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_helmet_state::gnw_helmet(machine_config &config) +{ + sm5a_common(config, 1657, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_helmet ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "cn-17", 0x0000, 0x0740, CRC(6d251e2e) SHA1(c61f591514de36fb2270038a6505945564c9f90e) ) + + ROM_REGION( 109404, "screen", 0) + ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) +ROM_END + +ROM_START( gnw_helmeto ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "cn-07", 0x0000, 0x0740, CRC(30c8bc90) SHA1(f5ac0fe7a09ee1ad6f6e4bd096b4be20f65d73db) ) + + ROM_REGION( 109404, "screen", 0) + ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Lion (model LN-08) + * PCB label LN-08 + * Sharp SM5A label LN-08 519A (no decap) + * lcd screen with custom segments, 1-bit sound + + BTANB: The game doesn't support simultaneous button presses for the controls, + it's the same as in eg. gnw_mmouse but in this game it doesn't make much sense + with the 2 separate guys. More likely a bad game design choice than bug. + +***************************************************************************/ + +class gnw_lion_state : public hh_sm510_state +{ +public: + gnw_lion_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_lion(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_lion ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Increase Speed (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_lion_state::gnw_lion(machine_config &config) +{ + sm5a_common(config, 1646, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_lion ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ln-08", 0x0000, 0x0740, CRC(9677681d) SHA1(6f7c960e04b63f1b7d926b598413f4c818b8fe53) ) + + ROM_REGION( 155863, "screen", 0) + ROM_LOAD( "gnw_lion.svg", 0, 155863, CRC(b5a5a4dc) SHA1(49d894d6e1d1fb35cd11f08c7ce30518be89dd0f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Parachute (model PR-21) + * PCB label PR-21Y + * Sharp SM5A label PR-21 52XC (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_pchute_state : public hh_sm510_state +{ +public: + gnw_pchute_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_pchute(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_pchute ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_pchute_state::gnw_pchute(machine_config &config) +{ + sm5a_common(config, 1602, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_pchute ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "pr-21", 0x0000, 0x0740, CRC(392b545e) SHA1(e71940cd4cee07ba1e62c1c7d9e9b19410e7232d) ) + + ROM_REGION( 169640, "screen", 0) + ROM_LOAD( "gnw_pchute.svg", 0, 169640, CRC(f30a0b31) SHA1(676989a418ae0dfe6bb1b097640422219c930453) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Octopus (model OC-22) + * PCB label OC-22Y A + * Sharp SM5A label OC-22 204A (no decap) + * lcd screen with custom segments, 1-bit sound + + Also cloned in 1989 by Elektronika(USSR) as Тайны океана (Tayny okeana, export + version: Mysteries of the Ocean), ROM is identical, graphics as well except + for the AM/PM/GAME segments. + +***************************************************************************/ + +class gnw_octopus_state : public hh_sm510_state +{ +public: + gnw_octopus_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_octopus(machine_config &config); + void taynyoke(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_octopus ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_octopus_state::gnw_octopus(machine_config &config) +{ + sm5a_common(config, 1586, 1080); // R mask option confirmed +} + +void gnw_octopus_state::taynyoke(machine_config &config) +{ + kb1013vk12_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_octopus ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "oc-22", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) + + ROM_REGION( 119827, "screen", 0) + ROM_LOAD( "gnw_octopus.svg", 0, 119827, CRC(efbdaa65) SHA1(42c746bef282176d59f57ddf7328f8d034f4ca02) ) +ROM_END + +ROM_START( taynyoke ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-03.bin", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) + + ROM_REGION( 93910, "screen", 0) + ROM_LOAD( "taynyoke.svg", 0, 93910, CRC(da7a835e) SHA1(1fe427a60bbf78fdf29ea401ec86b225098b68bb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Popeye (model PP-23) + * PCB label PP-23 Y + * Sharp SM5A label PP-23 52YD (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the wide screen version, there's also tabletop and panorama versions. + +***************************************************************************/ + +class gnw_popeye_state : public hh_sm510_state +{ +public: + gnw_popeye_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_popeye(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_popeye ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_popeye_state::gnw_popeye(machine_config &config) +{ + sm5a_common(config, 1604, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_popeye ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "pp-23", 0x0000, 0x0740, CRC(49987769) SHA1(ad90659a3ce7169a4df16367c5307435d9f9d956) ) + + ROM_REGION( 218587, "screen", 0) + ROM_LOAD( "gnw_popeye.svg", 0, 218587, CRC(4740bcd5) SHA1(a46ab455f2dd41caabd6c85cfa7dfde70805f157) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Chef (model FP-24) + * PCB label FP-24 + * Sharp SM5A label FP-24 51YB (die label CMS646, ROM ID 74) + * lcd screen with custom segments, 1-bit sound + + In 1989, Elektronika(USSR) released a clone: Весёлый повар (Vesyolyy povar, + export version: Merry Cook). This game shares the same ROM, though the graphics + are slightly different. + +***************************************************************************/ + +class gnw_chef_state : public hh_sm510_state +{ +public: + gnw_chef_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void vespovar(machine_config &config); + void gnw_chef(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_chef ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_chef_state::gnw_chef(machine_config &config) +{ + sm5a_common(config, 1666, 1080); // assuming same R mask option as merry cook +} + +void gnw_chef_state::vespovar(machine_config & config) +{ + kb1013vk12_common(config, 1679, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_chef ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fp-24", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) + + ROM_REGION( 199518, "screen", 0) + ROM_LOAD( "gnw_chef.svg", 0, 199518, CRC(ecc18d28) SHA1(1c0b7dfff71faa4d4395c19a84454870e403f927) ) +ROM_END + +ROM_START( vespovar ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-04.bin", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) + + ROM_REGION( 144128, "screen", 0) + ROM_LOAD( "vespovar.svg", 0, 144128, CRC(dcd1c073) SHA1(e15bf643f17b7ead37407c985e053e6434683d7c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey Mouse (model MC-25), Egg (model EG-26) + * PCB label MC-25 EG-26 (yes, both listed) + * Sharp SM5A label MC-25 51YD (Mickey Mouse), MC-25 519D (Egg) (no decap) + * lcd screen with custom segments, 1-bit sound + + MC-25 and EG-26 are the same game, it's assumed that the latter was for + regions where Nintendo wasn't able to license from Disney. + + In 1984, Электроника (Elektronika, USSR) released an unlicensed clone: + Ну, погоди! (Nu, pogodi!). This was followed by several other titles that + were the same under the hood, only differing in graphics. They also made a + slightly modified version, adding a new game mode (by pressing A+B) where the + player/CPU roles are reversed. This version is known as Разведчики космоса + (Razvedchiki kosmosa, export version: Explorers of Space). + + The following Mickey Mouse Elektronika clones are emulated in MAME: + + Model Title Transliteration Export version Note + --------------------------------------------------------------------------------- + ИМ-02 Ну, погоди! Nu, pogodi! - - + ИМ-10 Хоккей Hockey (Khokkey) Ice Hockey Export version manufactured by PO Proton + ИМ-13 Разведчики космоса Razvedchiki kosmosa Explorers of Space Modified ROM (see note above) + ИМ-16 Охота Okhota Fowling - + ИМ-19 Биатлон Biathlon (Biatlon) - - + ИМ-22 Весёлые футболисты Vesyolye futbolisty Monkey Goalkeeper - + ИМ-32 Кот-рыболов Kot-rybolov - - + ИМ-33 Квака-задавака Kvaka-zadavaka Frogling - + ИМ-49 Ночные воришки Nochnye vorishki Night Burglars - + ИМ-50 Космический полёт Kosmicheskiy polyot Space Flight The Model ID is the same as Весёлая арифметика (Vesyolaya arithmetika, export version: Amusing Arithmetic) (not emulated in MAME) + ИМ-51 Морская атака Morskaya ataka - - + ИМ-53 Атака астероидов Ataka asteroidov - Graphics are very similar to ИМ-50 + - Цирк Circus (Tsirk) - Unknown Model ID + +***************************************************************************/ + +class gnw_mmouse_state : public hh_sm510_state +{ +public: + gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mmouse(machine_config &config); + void gnw_egg(machine_config &config); + void nupogodi(machine_config &config); + void ehockey(machine_config &config); + void rkosmosa(machine_config &config); + void okhota(machine_config &config); + void biathlon(machine_config &config); + void vfutbol(machine_config &config); + void krybolov(machine_config &config); + void kvakazad(machine_config &config); + void nochnyev(machine_config &config); + void kosmicpt(machine_config &config); + void morataka(machine_config &config); + void atakaast(machine_config &config); + void ecircus(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mmouse ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( rkosmosa ) + PORT_INCLUDE( gnw_mmouse ) + + PORT_MODIFY("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void gnw_mmouse_state::gnw_mmouse(machine_config &config) +{ + sm5a_common(config, 1684, 1080); // R mask option confirmed +} + +void gnw_mmouse_state::gnw_egg(machine_config &config) +{ + sm5a_common(config, 1690, 1080); // R mask option confirmed +} + +void gnw_mmouse_state::nupogodi(machine_config &config) +{ + kb1013vk12_common(config, 1715, 1080); // R mask option ? +} + +void gnw_mmouse_state::ehockey(machine_config &config) +{ + kb1013vk12_common(config, 1782, 1080); // R mask option ? +} + +void gnw_mmouse_state::rkosmosa(machine_config &config) +{ + kb1013vk12_common(config, 1646, 1080); // R mask option ? +} + +void gnw_mmouse_state::okhota(machine_config &config) +{ + kb1013vk12_common(config, 1632, 1080); // R mask option ? +} + +void gnw_mmouse_state::biathlon(machine_config &config) +{ + kb1013vk12_common(config, 1633, 1080); // R mask option ? +} + +void gnw_mmouse_state::vfutbol(machine_config &config) +{ + kb1013vk12_common(config, 1655, 1080); // R mask option ? +} + +void gnw_mmouse_state::krybolov(machine_config &config) +{ + kb1013vk12_common(config, 1638, 1080); // R mask option ? +} + +void gnw_mmouse_state::kvakazad(machine_config &config) +{ + kb1013vk12_common(config, 1660, 1080); // R mask option ? +} + +void gnw_mmouse_state::nochnyev(machine_config &config) +{ + kb1013vk12_common(config, 1641, 1080); // R mask option ? +} + +void gnw_mmouse_state::kosmicpt(machine_config &config) +{ + kb1013vk12_common(config, 1658, 1080); // R mask option ? +} + +void gnw_mmouse_state::morataka(machine_config &config) +{ + kb1013vk12_common(config, 1648, 1080); // R mask option ? +} + +void gnw_mmouse_state::atakaast(machine_config &config) +{ + kb1013vk12_common(config, 1620, 1080); // R mask option ? +} + +void gnw_mmouse_state::ecircus(machine_config &config) +{ + kb1013vk12_common(config, 1657, 1080); // R mask option ? +} + +// roms + +ROM_START( gnw_mmouse ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 181706, "screen", 0) + ROM_LOAD( "gnw_mmouse.svg", 0, 181706, CRC(60cdc76a) SHA1(09755abd16222c1a0fe6c7ebb902706440d3e369) ) +ROM_END + +ROM_START( gnw_egg ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 193119, "screen", 0) + ROM_LOAD( "gnw_egg.svg", 0, 193119, CRC(1e469fe5) SHA1(bc80114337feefca590e48c823e8488f6b63f896) ) +ROM_END + +ROM_START( nupogodi ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-02.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 154233, "screen", 0) + ROM_LOAD( "nupogodi.svg", 0, 154233, CRC(42cfb84a) SHA1(249ca7ec78066b57f9a18e48ada64712c944e461) ) +ROM_END + +ROM_START( ehockey ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-10.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 94977, "screen", 0) + ROM_LOAD( "ehockey.svg", 0, 94977, CRC(98cf43b0) SHA1(4353505709612344cd3b597c3b4e9f6b441ddb66) ) +ROM_END + +ROM_START( rkosmosa ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-13.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) ) + + ROM_REGION( 81420, "screen", 0) + ROM_LOAD( "rkosmosa.svg", 0, 81420, CRC(dc6632be) SHA1(0906d933f4cda39ee1e57b502651a821e61e95ef) ) +ROM_END + +ROM_START( okhota ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-16.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 117838, "screen", 0) + ROM_LOAD( "okhota.svg", 0, 117838, CRC(7de707c6) SHA1(c876ea16bd8af033086e2e20860d2e1d09296d59) ) +ROM_END + +ROM_START( biathlon ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-19.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 116377, "screen", 0) + ROM_LOAD( "biathlon.svg", 0, 116377, CRC(fadf729e) SHA1(671f9496e2bfe7b4800ee7bad039485e19958428) ) +ROM_END + +ROM_START( vfutbol ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-22.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 131901, "screen", 0) + ROM_LOAD( "vfutbol.svg", 0, 131901, CRC(85811308) SHA1(288aa41bade08c61e0d346b9c1109179564e34ed) ) +ROM_END + +ROM_START( krybolov ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-32.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 132804, "screen", 0) + ROM_LOAD( "krybolov.svg", 0, 132804, CRC(4e3e70d3) SHA1(18f1300afa601deb6ac01dcf7dca88187b7940a3) ) +ROM_END + +ROM_START( kvakazad ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-33.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 131961, "screen", 0) + ROM_LOAD( "kvakazad.svg", 0, 131961, CRC(37b27420) SHA1(25d9e273f056c10e3a5bc4476ce980bfdb8095e1) ) +ROM_END + +ROM_START( nochnyev ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-49.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 136498, "screen", 0) + ROM_LOAD( "nochnyev.svg", 0, 136498, CRC(24a287cd) SHA1(2d14aa9b55b42c634df141fe4037ae286549b17b) ) +ROM_END + +ROM_START( kosmicpt ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-50.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 110214, "screen", 0) + ROM_LOAD( "kosmicpt.svg", 0, 110214, CRC(ccef6d27) SHA1(71f3cf49a5797ed9296f1e86ec4575ffefab67dd) ) +ROM_END + +ROM_START( morataka ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-51.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 105057, "screen", 0) + ROM_LOAD( "morataka.svg", 0, 105057, CRC(c235c56c) SHA1(b6ef74ba7826221683243e23513270d0f0f2cfda) ) +ROM_END + +ROM_START( atakaast ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-53.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 105570, "screen", 0) + ROM_LOAD( "atakaast.svg", 0, 105570, CRC(3d79aacc) SHA1(bc25969f4d6fa75b320130c920ac0bdc8fb44cbd) ) +ROM_END + +ROM_START( ecircus ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ecircus.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 124643, "screen", 0) + ROM_LOAD( "ecircus.svg", 0, 124643, CRC(079f25db) SHA1(defa784c80e01ce6affbb424930674114275bea1) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire (model FR-27) + * PCB label FR-27 + * Sharp SM5A label FR-27 523B (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the wide screen version, there's also a silver version. Doing a + hex-compare between the two, this one seems to be a complete rewrite. + FR-27 is the last G&W on SM5A, they were followed with SM51x. + + In 1989 Elektronika(USSR) released a clone: Космический мост (Kosmicheskiy most, + export version: Space Bridge). This game shares the same ROM, though the + graphics are different. + +***************************************************************************/ + +class gnw_fire_state : public hh_sm510_state +{ +public: + gnw_fire_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kosmicmt(machine_config &config); + void gnw_fire(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fire ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // lcd test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_fire_state::gnw_fire(machine_config &config) +{ + sm5a_common(config, 1624, 1080); // R mask option confirmed +} + +void gnw_fire_state::kosmicmt(machine_config & config) +{ + kb1013vk12_common(config, 1673, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fire ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fr-27", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) + + ROM_REGION( 163920, "screen", 0) + ROM_LOAD( "gnw_fire.svg", 0, 163920, CRC(be8a9f05) SHA1(644d8bed6228fa7e2f541b60fcfc1a0d97df0df6) ) +ROM_END + +ROM_START( kosmicmt ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-09.bin", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) + + ROM_REGION( 124578, "screen", 0) + ROM_LOAD( "kosmicmt.svg", 0, 124578, CRC(913324ef) SHA1(6e72f7f517da754075af11283d71fc8d24ac0529) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Turtle Bridge (model TL-28) + * PCB label TL-28 + * Sharp SM510 label TL-28 523C (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_tbridge_state : public hh_sm510_state +{ +public: + gnw_tbridge_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: unwanted segments light up + m_decay_pivot = 25; + m_decay_len = 25; + } + + void gnw_tbridge(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_tbridge ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_tbridge_state::gnw_tbridge(machine_config &config) +{ + sm510_common(config, 1587, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_tbridge ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tl-28", 0x0000, 0x1000, CRC(284e7224) SHA1(b50d7f3a527ffe50771ef55fdf8214929bfa2253) ) + + ROM_REGION( 242944, "screen", 0) + ROM_LOAD( "gnw_tbridge.svg", 0, 242944, CRC(bf66cb38) SHA1(3f19d1e6584062944e56107d47ebe26335d50f42) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire Attack (model ID-29) + * PCB label ID-29 + * Sharp SM510 label ID-29 524B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_fireatk_state : public hh_sm510_state +{ +public: + gnw_fireatk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_fireatk(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fireatk ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_fireatk_state::gnw_fireatk(machine_config &config) +{ + sm510_common(config, 1655, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fireatk ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "id-29", 0x0000, 0x1000, CRC(5f6e8042) SHA1(63afc3acd8a2a996095fa8ba2dfccd48e5214478) ) + + ROM_REGION( 267914, "screen", 0) + ROM_LOAD( "gnw_fireatk.svg", 0, 267914, CRC(f9eea340) SHA1(1fbc224dac447fe3902920ee3f1afc11150b5962) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Snoopy Tennis (model SP-30) + * PCB label SP-30 + * Sharp SM510 label SP-30 525B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_stennis_state : public hh_sm510_state +{ +public: + gnw_stennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_stennis(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_stennis ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_stennis_state::gnw_stennis(machine_config &config) +{ + sm510_common(config, 1581, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_stennis ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "sp-30", 0x0000, 0x1000, CRC(ba1d9504) SHA1(ff601765d88564b1570a59f5b1a4005c7b0fd66c) ) + + ROM_REGION( 228125, "screen", 0) + ROM_LOAD( "gnw_stennis.svg", 0, 228125, CRC(1134ef9a) SHA1(6f35a4d610c952663761f7ccb74c6650752cac77) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Oil Panic (model OP-51) + * PCB label OP-51A + * Sharp SM510 label OP-51 28ZB (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_opanic_state : public hh_sm510_state +{ +public: + gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_opanic(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_opanic ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_opanic_state::gnw_opanic(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1292/2, 1920/2, 1230/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_opanic ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) ) + + ROM_REGION( 79771, "screen_top", 0) + ROM_LOAD( "gnw_opanic_top.svg", 0, 79771, CRC(0e1e6485) SHA1(15d5ec48cad65759a50ed624e4161a8f2513f704) ) + + ROM_REGION( 112962, "screen_bottom", 0) + ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112962, CRC(ae4f4f1f) SHA1(97907bea3ca92759a0ea889e80d60d25a701027a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong (model DK-52) + * PCB label DK-52C + * Sharp SM510 label DK-52 52ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong_state : public hh_sm510_state +{ +public: + gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong_state::gnw_dkong(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1266/2, 1920/2, 1266/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkong ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) ) + + ROM_REGION( 176843, "screen_top", 0) + ROM_LOAD( "gnw_dkong_top.svg", 0, 176843, CRC(16c16b84) SHA1(fa2e54c04366a30b51de024296b9f94c1cb76d68) ) + + ROM_REGION( 145516, "screen_bottom", 0) + ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145516, CRC(2b711e9d) SHA1(0e263020cbe0e8b88bb68e3176630639b518935e) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey & Donald (model DM-53) + * PCB label DM-53 + * Sharp SM510 label DM-53 52ZC (die label CMS54C, CMS565) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mickdon_state : public hh_sm510_state +{ +public: + gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mickdon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mickdon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mickdon_state::gnw_mickdon(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1281/2, 1920/2, 1236/2); // R mask option confirmed + + m_maincpu->write_r().set(FUNC(gnw_mickdon_state::piezo_r2_w)); +} + +// roms + +ROM_START( gnw_mickdon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) + + ROM_REGION( 126477, "screen_top", 0) + ROM_LOAD( "gnw_mickdon_top.svg", 0, 126477, CRC(11e02fce) SHA1(fe2700711c73940a9488a6d223db4c4e92df4188) ) + + ROM_REGION( 122915, "screen_bottom", 0) + ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122915, CRC(b8cf63c2) SHA1(2406c9826f94a345ca9641e51fb26088f434960c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Green House (model GH-54) + * PCB label GH-54 + * Sharp SM510 label GH-54 52ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + + After the 20,000,000th G&W, Nintendo made a special edition of Green House + (still model GH-54), with the box art showing all the released games so far. + +***************************************************************************/ + +class gnw_ghouse_state : public hh_sm510_state +{ +public: + gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_ghouse(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ghouse ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Spray + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_ghouse_state::gnw_ghouse(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1303/2, 1920/2, 1274/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ghouse ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) ) + + ROM_REGION( 159258, "screen_top", 0) + ROM_LOAD( "gnw_ghouse_top.svg", 0, 159258, CRC(308c9c86) SHA1(e83d114e702b6da3cba4e45bd48edfe9882afac1) ) + + ROM_REGION( 149922, "screen_bottom", 0) + ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149922, CRC(c07c6bb8) SHA1(7a0d6f38ecdbfcd09ab967417fa9d06b5c5c21e4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong II (model JR-55) + * PCB label JR-55 + * Sharp SM510 label JR-55 53YC (die label CMS54C, KMS560) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong2_state : public hh_sm510_state +{ +public: + gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong2_state::gnw_dkong2(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1241/2, 1920/2, 1237/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkong2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) ) + + ROM_REGION( 267462, "screen_top", 0) + ROM_LOAD( "gnw_dkong2_top.svg", 0, 267462, CRC(41bb5414) SHA1(20c7af7c64e12273320029eecc5a33ec65d15bc5) ) + + ROM_REGION( 390601, "screen_bottom", 0) + ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390601, CRC(3f85bb01) SHA1(8964f02e8372f5d8dd5e8edfe0b79dae31b59b3a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario Bros. (model MW-56) + * PCB label MW-56-M-I (left), MW-56-S (right) + * Sharp SM510 label MW-56 533C (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mario_state : public hh_sm510_state +{ +public: + gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mario(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mario ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mario_state::gnw_mario(machine_config &config) +{ + sm510_dualh(config, 2258/2, 1440/2, 2261/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_mario ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) ) + + ROM_REGION( 154916, "screen_left", 0) + ROM_LOAD( "gnw_mario_left.svg", 0, 154916, CRC(8ea82355) SHA1(ad286039a215dfa0f02bb1caf875d55dedb9b71e) ) + + ROM_REGION( 202902, "screen_right", 0) + ROM_LOAD( "gnw_mario_right.svg", 0, 202902, CRC(cfe8c0ba) SHA1(87cd54a8104e9bb4f266b137b043e32a0c1d9772) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Rain Shower (model LP-57) + * PCB labels: LP-57-M-I (left), LP-57-S (right) + * Sharp SM510 label LP-57 538A (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_rshower_state : public hh_sm510_state +{ +public: + gnw_rshower_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_rshower(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_rshower ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // L/R + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_rshower_state::gnw_rshower(machine_config &config) +{ + sm510_dualh(config, 2126/2, 1440/2, 2146/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_rshower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "lp-57", 0x0000, 0x1000, CRC(51a2c5c4) SHA1(d60542e6785ba7b6a44153a66c739787cf670816) ) + + ROM_REGION( 135868, "screen_left", 0) + ROM_LOAD( "gnw_rshower_left.svg", 0, 135868, CRC(806493f1) SHA1(0287fba2c2962aced8156c2ebc4f299c4703acf2) ) + + ROM_REGION( 140445, "screen_right", 0) + ROM_LOAD( "gnw_rshower_right.svg", 0, 140445, CRC(bead097a) SHA1(a3929e0043ff5132fb4cf7a41edece96926f50d2) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Life Boat (model TC-58) + * PCB labels: TC-58-M (left), TC-58-S (right) + * Sharp SM510 label TC-58 281D (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_lboat_state : public hh_sm510_state +{ +public: + gnw_lboat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_lboat(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_lboat ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_lboat_state::gnw_lboat(machine_config &config) +{ + sm510_dualh(config, 2116/2, 1440/2, 2057/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_lboat ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tc-58", 0x0000, 0x1000, CRC(1f88f6a2) SHA1(22fd62127dda43a0ada2fe89b0518eec8cbe2a25) ) + + ROM_REGION( 156441, "screen_left", 0) + ROM_LOAD( "gnw_lboat_left.svg", 0, 156441, CRC(a1727890) SHA1(b1dd24f99496d215a3083a138fc3fff923303d34) ) + + ROM_REGION( 155258, "screen_right", 0) + ROM_LOAD( "gnw_lboat_right.svg", 0, 155258, CRC(76619ad3) SHA1(b44d57e2f4a2cecf98e402adf802d16c5934d301) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Pinball (model PB-59) + * PCB label PB-59 + * Sharp SM511 label PB-59 53ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_pinball_state : public hh_sm510_state +{ +public: + gnw_pinball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_pinball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_pinball ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB -- this one multiplies scoring factor + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_pinball_state::gnw_pinball(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1271/2, 1920/2, 1286/2); +} + +// roms + +ROM_START( gnw_pinball ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "pb-59.program", 0x0000, 0x1000, CRC(d29dab34) SHA1(69ac9ee63eda67360c21627b7d625093709b5cd9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "pb-59.melody", 0x000, 0x100, BAD_DUMP CRC(5c9ccb55) SHA1(1bada6caf3609f969421087219e6635f4c135282) ) // decap needed for verification + + ROM_REGION( 83191, "screen_top", 0) + ROM_LOAD( "gnw_pinball_top.svg", 0, 83191, CRC(abe3edd9) SHA1(b32327b81b788896150e709ab8dc4a2155ae0995) ) + + ROM_REGION( 63618, "screen_bottom", 0) + ROM_LOAD( "gnw_pinball_bottom.svg", 0, 63618, CRC(1db44191) SHA1(73f73d246630d0b9efeb8dc72f37a2b88f735ceb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Black Jack (model BJ-60) + * PCB label BJ-60 + * Sharp SM512 label BJ-60 564D (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_bjack_state : public hh_sm510_state +{ +public: + gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bjack(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bjack ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Double Down") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x10 / Hit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x1 / Stand") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Enter") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_bjack_state::gnw_bjack(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1290/2, 1920/2, 1297/2); +} + +// roms + +ROM_START( gnw_bjack ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // decap needed for verification + + ROM_REGION( 75366, "screen_top", 0) + ROM_LOAD( "gnw_bjack_top.svg", 0, 75366, CRC(d36fb4e4) SHA1(7f2a0256d78eb01e757208ead0fd52ee63ce8efa) ) + + ROM_REGION( 112599, "screen_bottom", 0) + ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112599, CRC(04880ae1) SHA1(60f3723f81965fe4891f25a3522351872f338389) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Squish (model MG-61) + * PCB label MG-61 + * Sharp SM510 label MG-61 8841B (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_squish_state : public hh_sm510_state +{ +public: + gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: unwanted segments light up + m_decay_pivot = 17; + } + + void gnw_squish(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_squish ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Bonus Life (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_squish_state::gnw_squish(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1285/2, 1920/2, 1287/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_squish ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) ) + + ROM_REGION( 70456, "screen_top", 0) + ROM_LOAD( "gnw_squish_top.svg", 0, 70456, CRC(8d10b94e) SHA1(33854e7ea8f02adceb597c9ba259aa553953e698) ) + + ROM_REGION( 279739, "screen_bottom", 0) + ROM_LOAD( "gnw_squish_bottom.svg", 0, 279739, CRC(7f4bd704) SHA1(e625910101896cf3a6d41e28ccda77f902f71c7a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Bomb Sweeper (model BD-62) + * PCB label BD-62 + * Sharp SM512 label BD-62 8727 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_bsweep_state : public hh_sm510_state +{ +public: + gnw_bsweep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bsweep(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bsweep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Controller keys skips level when activated + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_bsweep_state::gnw_bsweep(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1291/2, 1920/2, 1239/2); +} + +// roms + +ROM_START( gnw_bsweep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bd-62.program", 0x0000, 0x1000, CRC(f3ac66ea) SHA1(3fbf444ade5bc96cf0073ca72f1d583cb0f48fc5) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bd-62.melody", 0x000, 0x100, BAD_DUMP CRC(addc0368) SHA1(fc488bdf1c2ea5ca84cc66762126bb5874659d8f) ) // decap needed for verification + + ROM_REGION( 218174, "screen_top", 0) + ROM_LOAD( "gnw_bsweep_top.svg", 0, 218174, CRC(b2c8e895) SHA1(9f7d5973a5f920845c83d30f7ebbbec93232c41e) ) + + ROM_REGION( 277420, "screen_bottom", 0) + ROM_LOAD( "gnw_bsweep_bottom.svg", 0, 277420, CRC(8a9786cb) SHA1(48390a77b0e436ec7d7e8835923faef787e163d4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Safe Buster (model JB-63) + * PCB label JB-63 + * Sharp SM511 label JB-63 8841 B (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_sbuster_state : public hh_sm510_state +{ +public: + gnw_sbuster_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_sbuster(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_sbuster ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_sbuster_state::gnw_sbuster(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1246/2, 1920/2, 1269/2); +} + +// roms + +ROM_START( gnw_sbuster ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "jb-63.program", 0x0000, 0x1000, CRC(231d358d) SHA1(c748788da125e77b9d0fe1228f64de71f41af42b) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "jb-63.melody", 0x000, 0x100, BAD_DUMP CRC(28cb2914) SHA1(52d34265611f786b597653193752d16563dd5e82) ) // decap needed for verification + + ROM_REGION( 221903, "screen_top", 0) + ROM_LOAD( "gnw_sbuster_top.svg", 0, 221903, CRC(adb9b67f) SHA1(902998ead1a13d3c26854393283ab622e1fd3f70) ) + + ROM_REGION( 282593, "screen_bottom", 0) + ROM_LOAD( "gnw_sbuster_bottom.svg", 0, 282593, CRC(12542c5e) SHA1(fb05b8f4a2cbeeb566ae111cd27ff486c1478d7b) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Gold Cliff (model MV-64) + * PCB label MV-64 + * Sharp SM512 label MV-64 9027 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_gcliff_state : public hh_sm510_state +{ +public: + gnw_gcliff_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_gcliff(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_gcliff ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Left or right skips level when activated + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_gcliff_state::gnw_gcliff(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1257/2, 1920/2, 1239/2); +} + +// roms + +ROM_START( gnw_gcliff ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mv-64.program", 0x0000, 0x1000, CRC(2448a3bf) SHA1(bfb1a1b500321f8ee0b6f07ef8503e64fe6d37c0) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mv-64.melody", 0x000, 0x100, BAD_DUMP CRC(cb938709) SHA1(516dcc8a1edffe02f50d349389caac0676de1eba) ) // decap needed for verification + + ROM_REGION( 530731, "screen_top", 0) + ROM_LOAD( "gnw_gcliff_top.svg", 0, 530731, CRC(3bb60d8f) SHA1(e7dac1fcbe7b682c9d988443c1446e5ad28d3baa) ) + + ROM_REGION( 519321, "screen_bottom", 0) + ROM_LOAD( "gnw_gcliff_bottom.svg", 0, 519321, CRC(1117041e) SHA1(0f87167614c1ba65915fa7205a6bb44778e443a8) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Zelda (model ZL-65) + * PCB label ZL-65 + * Sharp SM512 label ZL-65 8935 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_zelda_state : public hh_sm510_state +{ +public: + gnw_zelda_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_zelda(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_zelda ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Water of Life + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " -- Invincibility when playing on bottom screen only + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_zelda_state::gnw_zelda(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1346/2, 1920/2, 1291/2); +} + +// roms + +ROM_START( gnw_zelda ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "zl-65.program", 0x0000, 0x1000, CRC(b96aa64e) SHA1(d1f0c64104eb3ecbf370674d5078a3a85b2b7227) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "zl-65.melody", 0x000, 0x100, BAD_DUMP CRC(3a281b0f) SHA1(7a236775557939050bbcd6f9d0a598d219a032f2) ) // decap needed for verification + + ROM_REGION( 283029, "screen_top", 0) + ROM_LOAD( "gnw_zelda_top.svg", 0, 283029, CRC(aaab1d7e) SHA1(fe01e8a92e6dcf457da87afe6bf39fcf511da9db) ) + + ROM_REGION( 424886, "screen_bottom", 0) + ROM_LOAD( "gnw_zelda_bottom.svg", 0, 424886, CRC(09f00d09) SHA1(33045028bd7e0df4e976e79dc180028c6886359a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Cement Factory (model CM-72) + * PCB labels: CM-72 M (main board) + CM-72 C (joystick controller board) + CM-72 S (buttons controller board) + * Sharp SM511 label CM-72 534A, or CM-72A 536C (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the tabletop version. There's also a new wide screen version which is + a different game. Unlike the other tabletop games, there is no panorama version. + There are two known versions, distinguished by the startup jingle. The first + version sounds like Queen's "Another One Bites the Dust". + +***************************************************************************/ + +class gnw_mariocmt_state : public hh_sm510_state +{ +public: + gnw_mariocmt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariocmt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariocmt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariocmt_state::gnw_mariocmt(machine_config &config) +{ + sm511_common(config, 1920, 1046); +} + +// roms + +ROM_START( gnw_mariocmt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cm-72.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cm-72.melody", 0x000, 0x100, BAD_DUMP CRC(db4f0fc1) SHA1(e386df3e3e88fa36a73bcd0649feb904180493c8) ) // decap needed for verification + + ROM_REGION( 293317, "screen", 0) + ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) +ROM_END + +ROM_START( gnw_mariocmta ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cm-72a.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cm-72a.melody", 0x000, 0x100, BAD_DUMP CRC(b6d72560) SHA1(9d7c23f94b7f894ba1b7881f68824949702a37f2) ) // decap needed for verification + + ROM_REGION( 293317, "screen", 0) + ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Snoopy (model SM-91) + * PCB labels: SM-91 M (main board), SM-91C (controller board) + * Sharp SM511 label SM-91 538A (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD. + +***************************************************************************/ + +class gnw_snoopyp_state : public hh_sm510_state +{ +public: + gnw_snoopyp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_snoopyp(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_snoopyp ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_snoopyp_state::gnw_snoopyp(machine_config &config) +{ + sm511_common(config, 1920, 1020); +} + +// roms + +ROM_START( gnw_snoopyp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "sm-91.program", 0x0000, 0x1000, CRC(893bd7e3) SHA1(94e218f464b2ec8c81bd4c0f13f3a3049c4effe9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "sm-91.melody", 0x000, 0x100, BAD_DUMP CRC(09360aaf) SHA1(906eff1d2eaf7ff040d833b4513a995e7026279b) ) // decap needed for verification + + ROM_REGION( 353488, "screen", 0) + ROM_LOAD( "gnw_snoopyp.svg", 0, 353488, CRC(30cfa42e) SHA1(2abe74299db7241c66f9631b01d0ea336ec411ad) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Popeye (model PG-92) + * PCB labels: PG-92 M (main board), SM-91C (controller board) + * Sharp SM511 label PG-92 538A (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD, and a new wide screen version which is + a different game. + + The PCB design for the controller board is shared with the panorama version + of Snoopy (SM-91). + +***************************************************************************/ + +class gnw_popeyep_state : public hh_sm510_state +{ +public: + gnw_popeyep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_popeyep(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_popeyep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Punch + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives and Stronger Punch (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_popeyep_state::gnw_popeyep(machine_config &config) +{ + sm511_common(config, 1920, 1043); +} + +// roms + +ROM_START( gnw_popeyep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "pg-92.program", 0x0000, 0x1000, CRC(f9a2f181) SHA1(f97969abe63285964ef9585660e82590014bbece) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "pg-92.melody", 0x000, 0x100, BAD_DUMP CRC(ce2a0e03) SHA1(cb7e4c64639579349aa944e4bfff7b05cf49ce0e) ) // decap needed for verification + + ROM_REGION( 541218, "screen", 0) + ROM_LOAD( "gnw_popeyep.svg", 0, 541218, CRC(ad93aa24) SHA1(b02c1fec1d8388878b5f21887f19aa5007b8ae43) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong Jr. (model CJ-93) + * PCB labels: CJ-93 M (main board), CJ-93C (controller board) + * Sharp SM511 label CJ-93 539D (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD, and a new wide screen version which is + a different game. + + The tabletop version was also licensed to Coleco. + +***************************************************************************/ + +class gnw_dkjrp_state : public hh_sm510_state +{ +public: + gnw_dkjrp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkjrp(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkjrp ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkjrp_state::gnw_dkjrp(machine_config &config) +{ + sm511_common(config, 1920, 1049); +} + +// roms + +ROM_START( gnw_dkjrp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cj-93.program", 0x0000, 0x1000, CRC(a2cd5a91) SHA1(33f6fd1530e5522491851f16d7c9f928b2dbdc3b) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cj-93.melody", 0x000, 0x100, BAD_DUMP CRC(99fbf76a) SHA1(15ba1af51bebc316146eb9a0a3d58d28f644d45f) ) // decap needed for verification + + ROM_REGION( 340751, "screen", 0) + ROM_LOAD( "gnw_dkjrp.svg", 0, 340751, CRC(eb3cb98b) SHA1(5b148557d3ade2e2050ddde879a6cc05e119b446) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Bombs Away (model TB-94) + * PCB labels: TB-94 M (main board), SM-91C (controller board) + * Sharp SM511 label TB-94 537C (no decap) + * inverted lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mbaway_state : public hh_sm510_state +{ +public: + gnw_mbaway_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mbaway(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mbaway ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Up/Down + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mbaway_state::gnw_mbaway(machine_config &config) +{ + sm511_common(config, 1920, 1031); +} + +// roms + +ROM_START( gnw_mbaway ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tb-94.program", 0x0000, 0x1000, CRC(11d18a48) SHA1(afccfa19dace7c4fcc15a84ecfcfb9d7ae3861e4) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "tb-94.melody", 0x000, 0x100, BAD_DUMP CRC(60d98353) SHA1(8789d7cd39111fe01848a89748ab91731de5caef) ) // decap needed for verification + + ROM_REGION( 514643, "screen", 0) + ROM_LOAD( "gnw_mbaway.svg", 0, 514643, CRC(2ec2f18b) SHA1(8e2fd20615d867aac97e443fb977513ff98138b4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey Mouse (model DC-95), + Nintendo Game & Watch: Donkey Kong Circus (model MK-96) + * PCB labels: DC-95M (main board), DC-95C (controller board) + * Sharp SM511 + - label DC-95 284C (Mickey Mouse) (no decap) + - label DC-95 541D (Donkey Kong Circus) (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version of Mickey Mouse. There's also a wide screen + version which is a different game. + + DC-95 and MK-96 are the same game, it's assumed that the latter was for + regions where Nintendo wasn't able to license from Disney. + +***************************************************************************/ + +class gnw_mmousep_state : public hh_sm510_state +{ +public: + gnw_mmousep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mmousep(machine_config &config); + void gnw_dkcirc(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mmousep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mmousep_state::gnw_mmousep(machine_config &config) +{ + sm511_common(config, 1920, 1122); +} + +void gnw_mmousep_state::gnw_dkcirc(machine_config &config) +{ + sm511_common(config, 1920, 1107); +} + +// roms + +ROM_START( gnw_mmousep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dc-95.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dc-95.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification + + ROM_REGION( 275609, "screen", 0) + ROM_LOAD( "gnw_mmousep.svg", 0, 275609, CRC(bac13689) SHA1(3ddcb4416bc5b8615b2854434ef78acac204a583) ) +ROM_END + +ROM_START( gnw_dkcirc ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk-96.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mk-96.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification + + ROM_REGION( 367718, "screen", 0) + ROM_LOAD( "gnw_dkcirc.svg", 0, 367718, CRC(f8571437) SHA1(bc000267deab83dfd460aea5c4102a23ac51f169) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong Jr. (model DJ-101) + * Sharp SM510 label DJ-101 52ZA (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a tabletop version that + plays more like the arcade game. + +***************************************************************************/ + +class gnw_dkjr_state : public hh_sm510_state +{ +public: + gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkjr(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkjr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkjr_state::gnw_dkjr(machine_config &config) +{ + sm510_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkjr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) ) + + ROM_REGION( 281202, "screen", 0) + ROM_LOAD( "gnw_dkjr.svg", 0, 281202, CRC(f8b18d58) SHA1(fa8321b3d8f81685da763d66fc148d339e6bcd55) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Cement Factory (model ML-102) + * Sharp SM510 label ML-102 298D (die label CMS54C, KMS577) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a tabletop version. + +***************************************************************************/ + +class gnw_mariocm_state : public hh_sm510_state +{ +public: + gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariocm(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariocm ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariocm_state::gnw_mariocm(machine_config &config) +{ + sm510_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_mariocm ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) ) + + ROM_REGION( 302983, "screen", 0) + ROM_LOAD( "gnw_mariocm.svg", 0, 302983, CRC(32ed7941) SHA1(ce7c5ae7a179ec9bcd17db7d7a27780801f7c1cb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Manhole (model NH-103) + * PCB label NH-103 + * Sharp SM510 label NH-103 538A (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a Gold Series version + (MH-06). The two games are using different MCU types so this version seems + to be a complete rewrite. + +***************************************************************************/ + +class gnw_manhole_state : public hh_sm510_state +{ +public: + gnw_manhole_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_manhole(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_manhole ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_manhole_state::gnw_manhole(machine_config &config) +{ + sm510_common(config, 1560, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_manhole ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "nh-103", 0x0000, 0x1000, CRC(ec03acf7) SHA1(b74ae672d8f8a155b2ea4ecee9afbaed95ec0ceb) ) + + ROM_REGION( 223414, "screen", 0) + ROM_LOAD( "gnw_manhole.svg", 0, 223414, CRC(774d806b) SHA1(acb730d8e397eb29988a353e0a9db8ae69913117) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Tropical Fish (model TF-104) + * PCB label TF-104 + * Sharp SM510 label TF-104 8739A (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_tfish_state : public hh_sm510_state +{ +public: + gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_tfish(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_tfish ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_tfish_state::gnw_tfish(machine_config &config) +{ + sm510_common(config, 1572, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_tfish ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) ) + + ROM_REGION( 257396, "screen", 0) + ROM_LOAD( "gnw_tfish.svg", 0, 257396, CRC(6f457a30) SHA1(0b748c9573ff96b99f4fa0adb17d218e89b56d3f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Super Mario Bros. (model: see below) + * PCB label YM-801 (Crystal Screen), YM-105 (New Wide Screen) + * Sharp SM511 + - label YM-801 8034A (crystal screen) (not dumped yet) + - label YM-105 9024B (new wide screen version) (die label ?) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model YM-801), rereleased on + New Wide Screen in 1988 (model YM-105). It was also a prize in a Nintendo + game contest in 1987 (model YM-901-S). In YM-801, Mario looks like the + ones in ML-102 and MW-56. In YM-901-S and YM-105 he looks more detailed. + Until further proof, it's assumed that the ROM is the same for each model. + +***************************************************************************/ + +class gnw_smb_state : public hh_sm510_state +{ +public: + gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_smb(machine_config &config); + void gnw_smbn(machine_config & config); +}; + +// config + +static INPUT_PORTS_START( gnw_smb ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_smb_state::gnw_smb(machine_config &config) +{ + sm511_common(config, 1768, 1080); +} + +void gnw_smb_state::gnw_smbn(machine_config &config) +{ + sm511_common(config, 1677, 1080); +} + +// roms + +ROM_START( gnw_smb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ym-801.program", 0x0000, 0x1000, BAD_DUMP CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ym-801.melody", 0x000, 0x100, BAD_DUMP CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) // dumped from NWS version + + ROM_REGION( 342106, "screen", 0) + ROM_LOAD( "gnw_smb.svg", 0, 342106, CRC(243224ac) SHA1(9b7f41abe4e340e32893ff1ef6e4d696deadc637) ) +ROM_END + +ROM_START( gnw_smbn ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) + + ROM_REGION( 648313, "screen", 0) + ROM_LOAD( "gnw_smbn.svg", 0, 648313, CRC(5808c793) SHA1(06b90993eb9db2a1909509f99ebf00e27c20dcad) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Climber Crystal Screen (model DR-802), + Nintendo Game & Watch: Climber New Wide Screen (model DR-106) + * PCB label DR-802 (Crystal Screen), DR-106 (New Wide Screen) + * Sharp SM511 + - label DR-802 8626A (crystal screen) (not dumped yet) + - label DR-106 9038B (new wide screen version) (no decap) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model DR-802), rereleased on + New Wide Screen in 1988 (model DR-106). The graphic LCD elements look the same + in both versions but the display aspect ratio and the graphical background is + slightly different. Until further proof, it's assumed that the ROM is the same + for both models. + +***************************************************************************/ + +class gnw_climber_state : public hh_sm510_state +{ +public: + gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_climber(machine_config &config); + void gnw_climbern(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_climber ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_climber_state::gnw_climber(machine_config &config) +{ + sm511_common(config, 1756, 1080); +} + +void gnw_climber_state::gnw_climbern(machine_config &config) +{ + sm511_common(config, 1677, 1080); +} + +// roms + +ROM_START( gnw_climber ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dr-802.program", 0x0000, 0x1000, BAD_DUMP CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dr-802.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // dumped from NWS version + + ROM_REGION( 564868, "screen", 0) + ROM_LOAD( "gnw_climber.svg", 0, 564868, CRC(a50ebd1c) SHA1(51047db960c8f110c1b681347cf8efd1d6263b85) ) +ROM_END + +ROM_START( gnw_climbern ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // decap needed for verification + + ROM_REGION( 542453, "screen", 0) + ROM_LOAD( "gnw_climbern.svg", 0, 542453, CRC(2ded966e) SHA1(7e9c99d372b6e547b9b3e789dca9dee60455a427) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Balloon Fight Crystal Screen (model BF-803), + Nintendo Game & Watch: Balloon Fight New Wide Screen (model BF-107) + * PCB labels + - DR-802-2 (Crystal Screen) + - DR-106 (new wide screen version) + * Sharp SM511 + - label BF-803 8646A (crystal screen) (not dumped yet) + - label BF-107 9031B (new wide screen version) (no decap) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model BF-803), rereleased on + New Wide Screen in 1988 (model BF-107). The graphic LCD elements look the same + in both versions but the graphical background is slightly different. + Until further proof, it's assumed that the ROM is the same for both models. + + The PCB design for the different editions seems to be shared with the + corresponding editions of Climber. + +***************************************************************************/ + +class gnw_bfight_state : public hh_sm510_state +{ +public: + gnw_bfight_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bfight(machine_config &config); + void gnw_bfightn(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bfight ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Eject + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_bfight_state::gnw_bfight(machine_config &config) +{ + sm511_common(config, 1771, 1080); +} + +void gnw_bfight_state::gnw_bfightn(machine_config &config) +{ + sm511_common(config, 1549, 1080); +} + +// roms + +ROM_START( gnw_bfight ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bf-803.program", 0x0000, 0x1000, BAD_DUMP CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bf-803.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // dumped from NWS version + + ROM_REGION( 586453, "screen", 0) + ROM_LOAD( "gnw_bfight.svg", 0, 586453, CRC(40d81b65) SHA1(96ed909647229cfde6d733ba10d54ace29e5618a) ) +ROM_END + +ROM_START( gnw_bfightn ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // decap needed for verification + + ROM_REGION( 558496, "screen", 0) + ROM_LOAD( "gnw_bfightn.svg", 0, 558496, CRC(c488000e) SHA1(f9a042799a1489f83b07a91827b8b421238a67e8) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario The Juggler (model MB-108) + * PCB label MB-108 + * Sharp SM511 label MB-108 9209B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mariotj_state : public hh_sm510_state +{ +public: + gnw_mariotj_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariotj(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariotj ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariotj_state::gnw_mariotj(machine_config &config) +{ + sm511_common(config, 1630, 1080); +} + +// roms + +ROM_START( gnw_mariotj ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb-108.program", 0x0000, 0x1000, CRC(f7118bb4) SHA1(c3117fd009e4686a149f85fb65786ddffc091eeb) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mb-108.melody", 0x000, 0x100, BAD_DUMP CRC(d8cc1f74) SHA1(4bbb470ef01777b0c1dbd7b84dc560da6d3b87e7) ) // decap needed for verification + + ROM_REGION( 210391, "screen", 0) + ROM_LOAD( "gnw_mariotj.svg", 0, 210391, CRC(8f1e6118) SHA1(4ecad443142330470384659af1e8dd59bca519e4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Spitball Sparky (model BU-201) + * PCB label BU-201 + * Sharp SM510 label BU-201 542A (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_ssparky_state : public hh_sm510_state +{ +public: + gnw_ssparky_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_ssparky(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ssparky ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Shooter + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_ssparky_state::gnw_ssparky(machine_config &config) +{ + sm510_common(config, 627, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ssparky ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bu-201", 0x0000, 0x1000, CRC(ae0d28e7) SHA1(1427cca1f3aaf3ef6fc3499171a5220428d9894f) ) + + ROM_REGION( 136929, "screen", 0) + ROM_LOAD( "gnw_ssparky.svg", 0, 136929, CRC(66e5d586) SHA1(b666f675abb8edef65ff402e8bc9a5213b630851) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Crab Grab (model UD-202) + * PCB label UD-202 + * Sharp SM510 label UD-202 542B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_cgrab_state : public hh_sm510_state +{ +public: + gnw_cgrab_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_cgrab(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_cgrab ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Do not release crabs (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_cgrab_state::gnw_cgrab(machine_config &config) +{ + sm510_common(config, 609, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_cgrab ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ud-202", 0x0000, 0x1000, CRC(65e97963) SHA1(f6d589fac337e2c4acdaa8f1281912feabc54198) ) + + ROM_REGION( 354770, "screen", 0) + ROM_LOAD( "gnw_cgrab.svg", 0, 354770, CRC(d61478aa) SHA1(8dd44cfb3720740150defdfbebe0bd52a3b3a377) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Boxing (model BX-301) + * Sharp SM511 label BX-301 287C (die label KMS73B, KMS744) + * wide lcd screen with custom segments, 1-bit sound + + Also known as Punch-Out!! in the USA. + +***************************************************************************/ + +class gnw_boxing_state : public hh_sm510_state +{ +public: + gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_boxing(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( microvs_shared ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( gnw_boxing ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "P2 Decrease Health (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Health (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_boxing_state::gnw_boxing(machine_config &config) +{ + sm511_common(config, 1920, 524); +} + +// roms + +ROM_START( gnw_boxing ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) ) + + ROM_REGION( 265217, "screen", 0) + ROM_LOAD( "gnw_boxing.svg", 0, 265217, CRC(306c733e) SHA1(8c80df1295ff0889e16ef9a14e45b27a6ebaa9a2) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Donkey Kong 3 (model AK-302) + * PCB label AK-302M + * Sharp SM511 label AK-302 299D (no decap) + * wide lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong3_state : public hh_sm510_state +{ +public: + gnw_dkong3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong3 ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong3_state::gnw_dkong3(machine_config &config) +{ + sm511_common(config, 1920, 563); +} + +// roms + +ROM_START( gnw_dkong3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ak-302.program", 0x0000, 0x1000, CRC(ed59c15e) SHA1(94f6ce23677d2150c9f86c4b1954f5f531693b21) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ak-302.melody", 0x000, 0x100, BAD_DUMP CRC(8b8f3d55) SHA1(54ebdeff4dd56a8bc2cd39bca1deada14bb90cce) ) // decap needed for verification + + ROM_REGION( 292480, "screen", 0) + ROM_LOAD( "gnw_dkong3.svg", 0, 292480, CRC(980d2486) SHA1(8578bdf4a3814401d9a79867252ee09ed7df253c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Donkey Kong Hockey (model HK-303) + * PCB label HK-303M + * Sharp SM511 label HK-303 57XD (no decap) + * wide lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkhockey_state : public hh_sm510_state +{ +public: + gnw_dkhockey_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkhockey(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkhockey ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Any Goal Scores 10 Points (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P2 Goals Scores No Points (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkhockey_state::gnw_dkhockey(machine_config &config) +{ + sm511_common(config, 1920, 579); +} + +// roms + +ROM_START( gnw_dkhockey ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "hk-303.program", 0x0000, 0x1000, CRC(dc73eec7) SHA1(daaca286de326321335fd26d9b435b444787f609) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "hk-303.melody", 0x000, 0x100, BAD_DUMP CRC(3f61032c) SHA1(b0fd9077fb5e59ca2787c828c78c35116c48c245) ) // decap needed for verification + + ROM_REGION( 263239, "screen", 0) + ROM_LOAD( "gnw_dkhockey.svg", 0, 263239, CRC(3a576c12) SHA1(9a7ca67c35fcfb5858227f3ef2a6027c877c64d3) ) +ROM_END + + + + + +/*************************************************************************** + + Telko Bassmate Computer (model BM-501) + * PCB label BM-501 + * Sharp SM511 label BM-501 556AA (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + + The Bassmate Computer was produced for Telko by Nintendo as an OEM product + and sold under different brands, i.e. Telko, KMV and Probe 2000. + + The hardware is identical as G&W Multi Screen, but it's not part of the game + series. + +***************************************************************************/ + +class bassmate_state : public hh_sm510_state +{ +public: + bassmate_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void bassmate(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( bassmate ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Compute") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Wind") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Cover") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time of Day") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Temp F") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Clarity") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Structure") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Depth(ft)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Season") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Skip Compute Animation (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void bassmate_state::bassmate(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1253/2, 1920/2, 1273/2); +} + +// roms + +ROM_START( bassmate ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bm-501.program", 0x0000, 0x1000, CRC(9bdd0501) SHA1(986b3b84184a987ae383c325700df21d8915f0e2) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bm-501.melody", 0x000, 0x100, BAD_DUMP CRC(fbe15600) SHA1(8be64792fffe5b8913a55b9b2624dd57dc238be7) ) // decap needed for verification + + ROM_REGION( 42305, "screen_top", 0) + ROM_LOAD( "bassmate_top.svg", 0, 42305, CRC(0cc056fe) SHA1(4d0e5b115adf513f5b3148ca7e39e0acbafd925c) ) + + ROM_REGION( 19775, "screen_bottom", 0) + ROM_LOAD( "bassmate_bottom.svg", 0, 19775, CRC(9561d52d) SHA1(903ef3944810c0efdc02f46a619891c1ef17c483) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Double Dribble + * Sharp SM510 under epoxy (die label CMS54C, KMS584) + * lcd screen with custom segments, 1-bit sound + + BTANB: At the basket, the ball goes missing sometimes for 1 frame, or + may show 2 balls at the same time. It's the same on the real handheld. + BTANB: players flicker (increasing LCD delay won't improve it much) + Another BTANB? If a period is over at the same time a defender on the + 2nd column grabs the ball, his arm won't be erased until it's redrawn. + +***************************************************************************/ + +class kdribble_state : public hh_sm510_state +{ +public: + kdribble_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kdribble(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kdribble ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Level Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kdribble_state::kdribble(machine_config &config) +{ + sm510_common(config, 1524, 1080); // R mask option confirmed +} + +// roms + +ROM_START( kdribble ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) ) + + ROM_REGION( 450349, "screen", 0) + ROM_LOAD( "kdribble.svg", 0, 450349, CRC(0ea4153e) SHA1(b5deb398bb9f5e56e5bbcbe477d54528fb989487) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Top Gun + * PCB label BH003 + * Sharp SM510 under epoxy (die label CMS54C, KMS598) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ktopgun_state : public hh_sm510_state +{ +public: + ktopgun_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void ktopgun(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ktopgun ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void ktopgun_state::ktopgun(machine_config &config) +{ + sm510_common(config, 1515, 1080); // R mask option confirmed +} + +// roms + +ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) + + ROM_REGION( 425839, "screen", 0) + ROM_LOAD( "ktopgun.svg", 0, 425839, CRC(f0eb200f) SHA1(cbdc7cfaf1785b393c806dabd1a355d325bddc3f) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Contra + * PCB label BH002 + * Sharp SM511 under epoxy (die label KMS73B, KMS773) + * lcd screen with custom segments, 1-bit sound + + Contra handheld is titled simply "C" in the USA. + +***************************************************************************/ + +class kcontra_state : public hh_sm510_state +{ +public: + kcontra_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: score digit flickers + m_decay_len = 20; + } + + void kcontra(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kcontra ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kcontra_state::kcontra(machine_config &config) +{ + sm511_common(config, 1505, 1080); +} + +// roms + +ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) ) + + ROM_REGION( 721055, "screen", 0) + ROM_LOAD( "kcontra.svg", 0, 721055, CRC(f1ce8d19) SHA1(7d8f2fac40605a3fd6f1386c945a53412b2f2b15) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Teenage Mutant Ninja Turtles + * PCB label BH005 + * Sharp SM511 under epoxy (die label KMS73B, KMS774) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ktmnt_state : public hh_sm510_state +{ +public: + ktmnt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void ktmnt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ktmnt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void ktmnt_state::ktmnt(machine_config &config) +{ + sm511_common(config, 1505, 1080); +} + +// roms + +ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) ) + + ROM_REGION( 610309, "screen", 0) + ROM_LOAD( "ktmnt.svg", 0, 610309, CRC(9f48c50d) SHA1(917c0ed8e83d949e5115c897cacda8d60e42d74d) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Gradius + * PCB label BH004 + * Sharp SM511 under epoxy (die label KMS73B, KMS774) + * lcd screen with custom segments, 1-bit sound + + Known in Japan as Nemesis. + +***************************************************************************/ + +class kgradius_state : public hh_sm510_state +{ +public: + kgradius_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kgradius(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kgradius ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kgradius_state::kgradius(machine_config &config) +{ + sm511_common(config, 1420, 1080); +} + +// roms + +ROM_START( kgradius ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) ) + + ROM_REGION( 638136, "screen", 0) + ROM_LOAD( "kgradius.svg", 0, 638136, CRC(85dd296e) SHA1(bd75d0c08387a69bbcf4fd100252846499a261b3) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Lone Ranger + * PCB label BH009 + * Sharp SM511 under epoxy (die label KMS73B, KMS781) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kloneran_state : public hh_sm510_state +{ +public: + kloneran_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kloneran(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kloneran ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kloneran_state::kloneran(machine_config &config) +{ + sm511_common(config, 1497, 1080); +} + +// roms + +ROM_START( kloneran ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) ) + + ROM_REGION( 633161, "screen", 0) + ROM_LOAD( "kloneran.svg", 0, 633161, CRC(1fb937ff) SHA1(9e5841dc67e50b789f0161693ebbd75f79915980) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Blades of Steel + * PCB label BH011 + * Sharp SM511 under epoxy (die label KMS73B, KMS782) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kblades_state : public hh_sm510_state +{ +public: + kblades_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 25; + } + + void kblades(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kblades ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kblades_state::kblades(machine_config &config) +{ + sm511_common(config, 1516, 1080); +} + +// roms + +ROM_START( kblades ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) ) + + ROM_REGION( 455154, "screen", 0) + ROM_LOAD( "kblades.svg", 0, 455154, CRC(f17ec8ba) SHA1(ed999ef4b3f0ae94c243219ea8ea1eedd7179c26) ) +ROM_END + + + + + +/*************************************************************************** + + Konami NFL Football + * Sharp SM511 under epoxy (die label KMS73B, KMS786) + * lcd screen with custom segments, 1-bit sound + + This is the 1989 version. It was rereleased in 1992, assumed to be the same + game underneath. + +***************************************************************************/ + +class knfl_state : public hh_sm510_state +{ +public: + knfl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 35; + } + + void knfl(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( knfl ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void knfl_state::knfl(machine_config &config) +{ + sm511_common(config, 1449, 1080); +} + +// roms + +ROM_START( knfl ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) ) + + ROM_REGION( 571173, "screen", 0) + ROM_LOAD( "knfl.svg", 0, 571173, CRC(406c5bed) SHA1(1f3a704f091b78c89c06108ba11310f4072cc178) ) +ROM_END + + + + + +/*************************************************************************** + + Konami The Adventures of Bayou Billy + * Sharp SM511 under epoxy (die label KMS73B, KMS788) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kbilly_state : public hh_sm510_state +{ +public: + kbilly_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kbilly(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kbilly ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kbilly_state::kbilly(machine_config &config) +{ + sm511_common(config, 1490, 1080); +} + +// roms + +ROM_START( kbilly ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) ) + + ROM_REGION( 598317, "screen", 0) + ROM_LOAD( "kbilly.svg", 0, 598317, CRC(fec67ddf) SHA1(3e5f520733e8b720966028ed6a72062be5381f27) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Bucky O'Hare + * Sharp SM511 under epoxy (die label KMS73B, N58) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kbucky_state : public hh_sm510_state +{ +public: + kbucky_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kbucky(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kbucky ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kbucky_state::kbucky(machine_config &config) +{ + sm511_common(config, 1490, 1080); +} + +// roms + +ROM_START( kbucky ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) ) + + ROM_REGION( 727879, "screen", 0) + ROM_LOAD( "kbucky.svg", 0, 727879, CRC(64cde7e6) SHA1(60c0120c7955a694bb07eb013e42c7a71757ab9f) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Garfield + * Sharp SM511 under epoxy (die label KMS73B, N62) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kgarfld_state : public hh_sm510_state +{ +public: + kgarfld_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 30; + } + + void kgarfld(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kgarfld ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kgarfld_state::kgarfld(machine_config &config) +{ + sm511_common(config, 1500, 1080); +} + +// roms + +ROM_START( kgarfld ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) ) + + ROM_REGION( 581147, "screen", 0) + ROM_LOAD( "kgarfld.svg", 0, 581147, CRC(ef2e5a61) SHA1(fbf0236cd0d4228403823d2623c6fd2d68349f7a) ) +ROM_END + + + + + +/*************************************************************************** + + Nelsonic Game Watches on SM530*, wristwatch with an LCD game on it. + *: Older games are on a different MCU, several seen with OKI MSM5055. + Newer ones: to be investigated, maybe SM5x. + + Hardware notes: + * Sharp SM530 under epoxy (die label KAS600 + ROM serial, see romdefs) + * lcd screen with custom segments, 1-bit sound + + Currently emulated in generic driver: + - Super Mario Bros. 3 + - Super Mario World (aka Super Mario Bros. 4) + + Different hardware: + - Star Fox (extra sound effect chip) + +***************************************************************************/ + +class gamewatch_state : public hh_sm510_state +{ +public: + gamewatch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void nsmb3(machine_config &config); + void nsmw(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gamewatch ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // mode + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // set + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY +INPUT_PORTS_END + +void gamewatch_state::nsmb3(machine_config &config) +{ + sm530_common(config, 1000, 1000); + config.set_default_layout(layout_hh_sm500_test); +} + +void gamewatch_state::nsmw(machine_config &config) +{ + sm530_common(config, 1000, 1000); + config.set_default_layout(layout_hh_sm500_test); +} + +// roms + +ROM_START( nsmb3 ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "633.program", 0x000, 0x800, CRC(a981b540) SHA1(1271d15e6168d73852f8ade9ade4d5f3b1838bf5) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "633.melody", 0x000, 0x100, CRC(98340c46) SHA1(94b5865fc669b7f6487845647866c06f4f581f63) ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "nsmb3.svg", 0, 100000, NO_DUMP ) +ROM_END + +ROM_START( nsmw ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "636.program", 0x000, 0x800, CRC(56a705fa) SHA1(384ba68e597c7901cc9db2eb991cb80049113503) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "636.melody", 0x000, 0x100, CRC(5df99e13) SHA1(98d5f78b5bcf59a232ccb5c61210568948c4501b) ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "nsmw.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Nelsonic Star Fox (Game Watch) + * Sharp SM530 under epoxy (die label KAS600, 643) + * sound effect chip under epoxy (die label HMC, HA1152_001A) + * lcd screen with custom segments, 1-bit sound + + Two versions are known, with different shape/button layout, but assumed + to be the exact same game. + + The HMC sound effect chip is very similar (possibly the same one) as found + in electronic toys such as the Executor keychain. There are 8 sound effects + in the ROM, only 3 are used in Star Fox. + +***************************************************************************/ + +class nstarfox_state : public hh_sm510_state +{ +public: + nstarfox_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void nstarfox(machine_config &config); + +private: + void sound_w(u8 data); +}; + +// handlers + +void nstarfox_state::sound_w(u8 data) +{ + // S2-S4: falling edge starts sound effect +} + +// config + +static INPUT_PORTS_START( nstarfox ) + PORT_INCLUDE( gamewatch ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // laser + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // bomb +INPUT_PORTS_END + +void nstarfox_state::nstarfox(machine_config &config) +{ + sm530_common(config, 1176, 1080); + m_maincpu->write_s().set(FUNC(nstarfox_state::sound_w)); +} + +// roms + +ROM_START( nstarfox ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "643.program", 0x000, 0x800, CRC(ac1f5c68) SHA1(165cefeba9abc8725e55d15fdc218b07857d4cfe) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "643.melody", 0x000, 0x100, CRC(6684f6b7) SHA1(32056467f796cb2e3c9f05c364419e7935fd1361) ) + + ROM_REGION( 0x80, "sfx", 0) + ROM_LOAD( "ha1152_001a", 0x00, 0x80, CRC(fba00b7c) SHA1(5dfb15eee3c57bbca80f485f68442e5f7c6bc5e4) ) + + ROM_REGION( 155284, "screen", 0) + ROM_LOAD( "nstarfox.svg", 0, 155284, CRC(843c0fa2) SHA1(bed08fcc8e9fd20624052d91db90923897a1cf7c) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Gauntlet (model 7-778), Robin Hood (model 7-861) + * Sharp SM510 under epoxy (die label CMS54C, KMS583) + * lcd screen with custom segments, 1-bit sound + + known releases (Gauntlet): + - World: Gauntlet, published by Tiger + - Japan: Gauntlet, published by Sega + - UK: Gauntlet, published by Grandstand + + Robin Hood is the same MCU/ROM, different LCD. + +***************************************************************************/ + +class tgaunt_state : public hh_sm510_state +{ +public: + tgaunt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobhood(machine_config &config); + void tgaunt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgaunt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Bomb") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Key") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( trobhood ) + PORT_INCLUDE( tgaunt ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Money") +INPUT_PORTS_END + +void tgaunt_state::tgaunt(machine_config &config) +{ + sm510_tiger(config, 1425, 1080); +} + +void tgaunt_state::trobhood(machine_config &config) +{ + sm510_tiger(config, 1468, 1080); +} + +// roms + +ROM_START( tgaunt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) + + ROM_REGION( 713071, "screen", 0) + ROM_LOAD( "tgaunt.svg", 0, 713071, CRC(b2dfb31b) SHA1(3e57c6aaa665e2874e6e7e051245a81ab7a917b3) ) +ROM_END + +ROM_START( trobhood ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) + + ROM_REGION( 704816, "screen", 0) + ROM_LOAD( "trobhood.svg", 0, 704816, CRC(f4b94f32) SHA1(8f68a7f4240489d42934d3875f82456aceabfb48) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Double Dragon (model 7-780) + * Sharp SM510 under epoxy (die label CMS54C, KMS570, 593) + * lcd screen with custom segments, 1-bit sound + + BTANB: On the baddie in the background throwing dynamite, the sparks + above his head are the same segment as the body, not the arm. + +***************************************************************************/ + +class tddragon_state : public hh_sm510_state +{ +public: + tddragon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tddragon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tddragon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sway") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tddragon_state::tddragon(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); // R mask option confirmed +} + +// roms + +ROM_START( tddragon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) ) + + ROM_REGION( 511477, "screen", 0) + ROM_LOAD( "tddragon.svg", 0, 511477, CRC(d3046671) SHA1(15fd328e28362402eab1094851dddd8e20a0bcec) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Karnov (model 7-783) + * Sharp SM510 under epoxy (die label CMS54C, KMS582) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tkarnov_state : public hh_sm510_state +{ +public: + tkarnov_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tkarnov(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tkarnov ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire-Ball") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Boomerang") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tkarnov_state::tkarnov(machine_config &config) +{ + sm510_tiger(config, 1477, 1080); +} + +// roms + +ROM_START( tkarnov ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) ) + + ROM_REGION( 527432, "screen", 0) + ROM_LOAD( "tkarnov.svg", 0, 527432, CRC(9317066c) SHA1(087cfde97e106c6fd8c52d3a1138e6bde2ad9289) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Vindicators (model 7-786) + * Sharp SM510 under epoxy (die label CMS54C, KMS595) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tvindictr_state : public hh_sm510_state +{ +public: + tvindictr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tvindictr(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tvindictr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tvindictr_state::tvindictr(machine_config &config) +{ + sm510_tiger(config, 1459, 1080); +} + +// roms + +ROM_START( tvindictr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) ) + + ROM_REGION( 314205, "screen", 0) + ROM_LOAD( "tvindictr.svg", 0, 314205, CRC(fefe9f31) SHA1(3c8e7ab2cd81de72740b2948def07a2fc000a78a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Ninja Gaiden (model 7-787) + * Sharp SM510 under epoxy (die label M82) + * lcd screen with custom segments, 1 led, 1-bit sound + +***************************************************************************/ + +class tgaiden_state : public hh_sm510_state +{ +public: + tgaiden_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag), + m_led_out(*this, "led") + { + inp_fixed_last(); + } + + void tgaiden(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // R2 connects to a single LED behind the screen + void led_w(u8 data) { m_led_out = data >> 1 & 1; } + output_finder<> m_led_out; +}; + +void tgaiden_state::machine_start() +{ + hh_sm510_state::machine_start(); + m_led_out.resolve(); +} + +// config + +static INPUT_PORTS_START( tgaiden ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgaiden_state::tgaiden(machine_config &config) +{ + sm510_tiger(config, 1476, 1080); + m_maincpu->write_r().append(FUNC(tgaiden_state::led_w)); +} + +// roms + +ROM_START( tgaiden ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) ) + + ROM_REGION( 588916, "screen", 0) + ROM_LOAD( "tgaiden.svg", 0, 588916, CRC(5845c630) SHA1(c4b0d4d85e4b58a051920b6b34668847049c57a7) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman (model 7-799) + * Sharp SM510 under epoxy (die label CMS54C, KMS597) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbatman_state : public hh_sm510_state +{ +public: + tbatman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatman ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatman_state::tbatman(machine_config &config) +{ + sm510_tiger(config, 1442, 1080); +} + +// roms + +ROM_START( tbatman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) ) + + ROM_REGION( 551931, "screen", 0) + ROM_LOAD( "tbatman.svg", 0, 551931, CRC(95ae104b) SHA1(0508f925f29b2152b41c478447e63c74fce718ad) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Space Harrier II (model 7-814) + * Sharp SM510 under epoxy (die label M91) + * lcd screen with custom segments, 1-bit sound + + known releases: + - World: Space Harrier II, published by Tiger + - Japan: Space Harrier, published by Sega + +***************************************************************************/ + +class tsharr2_state : public hh_sm510_state +{ +public: + tsharr2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsharr2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsharr2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsharr2_state::tsharr2(machine_config &config) +{ + sm510_tiger(config, 1493, 1080); // R mask option confirmed +} + +// roms + +ROM_START( tsharr2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) ) + + ROM_REGION( 555177, "screen", 0) + ROM_LOAD( "tsharr2.svg", 0, 555177, CRC(842f8f7e) SHA1(2c523531059acdfa3a0cebac9d8f84f1971e1086) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Strider (model 7-815) + * Sharp SM510 under epoxy (die label M92) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tstrider_state : public hh_sm510_state +{ +public: + tstrider_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tstrider(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tstrider ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Weapon") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tstrider_state::tstrider(machine_config &config) +{ + sm510_tiger(config, 1479, 1080); +} + +// roms + +ROM_START( tstrider ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) ) + + ROM_REGION( 554858, "screen", 0) + ROM_LOAD( "tstrider.svg", 0, 554858, CRC(12767799) SHA1(9d67a96affee18dacaf3d49d89f60940c33492aa) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Golden Axe (model 7-817) + * Sharp SM510 under epoxy (die label M94) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tgoldnaxe_state : public hh_sm510_state +{ +public: + tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tgoldnaxe(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgoldnaxe ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Magic") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgoldnaxe_state::tgoldnaxe(machine_config &config) +{ + sm510_tiger(config, 1456, 1080); +} + +// roms + +ROM_START( tgoldnaxe ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) ) + + ROM_REGION( 605525, "screen", 0) + ROM_LOAD( "tgoldnaxe.svg", 0, 605525, CRC(9c1097c5) SHA1(bf9c2a1f4ae98ebe5eb9d381b0729588a150fa27) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Robocop 2 (model 7-830), The Rocketeer (model 7-864) + * Sharp SM510 under epoxy (die label M96) + * lcd screen with custom segments, 1-bit sound + + The Rocketeer is the same MCU/ROM, different LCD. + +***************************************************************************/ + +class trobocop2_state : public hh_sm510_state +{ +public: + trobocop2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobocop2(machine_config &config); + void trockteer(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trobocop2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( trockteer ) + PORT_INCLUDE( trobocop2 ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Up/Rocket Pack") + + PORT_MODIFY("IN.3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Right") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Left") +INPUT_PORTS_END + +void trobocop2_state::trobocop2(machine_config &config) +{ + sm510_tiger(config, 1487, 1080); +} + +void trobocop2_state::trockteer(machine_config &config) +{ + sm510_tiger(config, 1463, 1080); +} + +// roms + +ROM_START( trobocop2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) + + ROM_REGION( 463572, "screen", 0) + ROM_LOAD( "trobocop2.svg", 0, 463572, CRC(0218c1d9) SHA1(2932825ca03e008e5c2993882d363ae00df43f26) ) +ROM_END + +ROM_START( trockteer ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) + + ROM_REGION( 558128, "screen", 0) + ROM_LOAD( "trockteer.svg", 0, 558128, CRC(70ff1f46) SHA1(5cd94655654614206ed11844ba31650edb51eb22) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Altered Beast (model 7-831) + * Sharp SM510 under epoxy (die label M88) + * lcd screen with custom segments, 1-bit sound + + known releases: + - World: Altered Beast, published by Tiger + - Japan: Juuouki, published by Sega + +***************************************************************************/ + +class taltbeast_state : public hh_sm510_state +{ +public: + taltbeast_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void taltbeast(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( taltbeast ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick/Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void taltbeast_state::taltbeast(machine_config &config) +{ + sm510_tiger(config, 1455, 1080); // R mask option confirmed +} + +// roms + +ROM_START( taltbeast ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) ) + + ROM_REGION( 667931, "screen", 0) + ROM_LOAD( "taltbeast.svg", 0, 667931, CRC(a642d5f7) SHA1(ad005deaa35189e59317a07d860403adeef51aad) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Street Fighter 2010 - The Final Fight (model 7-837) + * Sharp SM510 under epoxy (die label MA2) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsf2010_state : public hh_sm510_state +{ +public: + tsf2010_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsf2010(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsf2010 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select Planet") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsf2010_state::tsf2010(machine_config &config) +{ + sm510_tiger(config, 1465, 1080); +} + +// roms + +ROM_START( tsf2010 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) ) + + ROM_REGION( 595191, "screen", 0) + ROM_LOAD( "tsf2010.svg", 0, 595191, CRC(78f96bad) SHA1(4389580e3d47dda0243b01625427013eb7ec4336) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Swamp Thing (model 7-851) + * Sharp SM510 under epoxy (die label MB0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tswampt_state : public hh_sm510_state +{ +public: + tswampt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tswampt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tswampt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tswampt_state::tswampt(machine_config &config) +{ + sm510_tiger(config, 1450, 1080); +} + +// roms + +ROM_START( tswampt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) ) + + ROM_REGION( 578544, "screen", 0) + ROM_LOAD( "tswampt.svg", 0, 578544, CRC(921e2b43) SHA1(176426fe9bf4855256e0ff7804ca48e619fa0cf3) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Spider-Man (model 7-853) + * Sharp SM510 under epoxy (die label MA5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tspidman_state : public hh_sm510_state +{ +public: + tspidman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tspidman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tspidman ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right/Kick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up/Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left/Rescue") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tspidman_state::tspidman(machine_config &config) +{ + sm510_tiger(config, 1440, 1080); +} + +// roms + +ROM_START( tspidman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) ) + + ROM_REGION( 605375, "screen", 0) + ROM_LOAD( "tspidman.svg", 0, 605375, CRC(6c032ce4) SHA1(69043096e28709821ddc26ef05f60f353fc3e35d) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger X-Men (model 7-854) + * Sharp SM510 under epoxy (die label MA7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class txmen_state : public hh_sm510_state +{ +public: + txmen_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void txmen(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( txmen ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Claws") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void txmen_state::txmen(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( txmen ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) ) + + ROM_REGION( 543273, "screen", 0) + ROM_LOAD( "txmen.svg", 0, 543273, CRC(039b37bb) SHA1(bd57cba8f380185beda2eb5ea7b5d1f25c8d447b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Double Dragon 3 - The Rosetta Stone (model 7-858) + * Sharp SM510 under epoxy (die label MA6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tddragon3_state : public hh_sm510_state +{ +public: + tddragon3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tddragon3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tddragon3 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tddragon3_state::tddragon3(machine_config &config) +{ + sm510_tiger(config, 1514, 1080); +} + +// roms + +ROM_START( tddragon3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) ) + + ROM_REGION( 615734, "screen", 0) + ROM_LOAD( "tddragon3.svg", 0, 615734, CRC(4c94d574) SHA1(e2717db6c0279da4813550f0035a23bdaaa8b7bb) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Flash (model 7-859) + * Sharp SM510 under epoxy (die label MB5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tflash_state : public hh_sm510_state +{ +public: + tflash_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tflash(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tflash ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Brake") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Run") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tie") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tflash_state::tflash(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tflash ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) ) + + ROM_REGION( 587863, "screen", 0) + ROM_LOAD( "tflash.svg", 0, 587863, CRC(8ddb9391) SHA1(fa8b4610a914de8ae95123c4273a12cdb4353a39) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger MC Hammer: U Can't Touch This (model 7-863) + * Sharp SM511 under epoxy (die label N63) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tmchammer_state : public hh_sm510_state +{ +public: + tmchammer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tmchammer(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tmchammer ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Up") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Up/Jump") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Right") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Left") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Down") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tmchammer_state::tmchammer(machine_config &config) +{ + sm511_tiger1bit(config, 1471, 1080); +} + +// roms + +ROM_START( tmchammer ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) ) + + ROM_REGION( 456487, "screen", 0) + ROM_LOAD( "tmchammer.svg", 0, 456487, CRC(1cd10ff3) SHA1(092396c56adae7f872c3b5916ef3ecf67ab30161) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Battletoads (model 7-868) + * Sharp SM510 under epoxy (die label MB3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbtoads_state : public hh_sm510_state +{ +public: + tbtoads_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbtoads(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbtoads ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbtoads_state::tbtoads(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( tbtoads ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) ) + + ROM_REGION( 694417, "screen", 0) + ROM_LOAD( "tbtoads.svg", 0, 694417, CRC(c0fbc25d) SHA1(def54ab2f10123246f7809fc3caf3e9d26800f87) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Hook (model 7-869) + * Sharp SM510 under epoxy (die label MB7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thook_state : public hh_sm510_state +{ +public: + thook_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thook(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thook ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Up") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Down/Dodge") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thook_state::thook(machine_config &config) +{ + sm510_tiger(config, 1489, 1080); +} + +// roms + +ROM_START( thook ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) ) + + ROM_REGION( 680544, "screen", 0) + ROM_LOAD( "thook.svg", 0, 680544, CRC(bddefb9b) SHA1(438b0fe6f4c0196952bd179075498d6bd19c3e48) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Back to the Future (model 7-809) + * Sharp SM510 under epoxy (die label MC3) + * lcd screen with custom segments, 1-bit sound + + This game is from 1992, even though the model number suggests otherwise. + Perhaps Tiger filled unused model numbers before switching to 78-xxx. + +***************************************************************************/ + +class tbttf_state : public hh_sm510_state +{ +public: + tbttf_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbttf(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbttf ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Repair") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbttf_state::tbttf(machine_config &config) +{ + sm510_tiger(config, 1466, 1080); +} + +// roms + +ROM_START( tbttf ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) ) + + ROM_REGION( 667741, "screen", 0) + ROM_LOAD( "tbttf.svg", 0, 667741, CRC(1a57e35a) SHA1(9b622e08cc44e3d48b71a283cd07b89fbcc6faa4) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Addams Family (model 7-829) + * Sharp SM510 under epoxy (die label MC2) + * lcd screen with custom segments, 1-bit sound + + Like Back to the Future, this game is newer than the model number suggests. + +***************************************************************************/ + +class taddams_state : public hh_sm510_state +{ +public: + taddams_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void taddams(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( taddams ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Take") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void taddams_state::taddams(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( taddams ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) ) + + ROM_REGION( 554703, "screen", 0) + ROM_LOAD( "taddams.svg", 0, 554703, CRC(85f15123) SHA1(088dbfbe760b782988bbfe6d29d89b8427844992) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Home Alone (model 78-502) + * Sharp SM510 under epoxy (die label MC7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thalone_state : public hh_sm510_state +{ +public: + thalone_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thalone(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thalone ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thalone_state::thalone(machine_config &config) +{ + sm510_tiger(config, 1448, 1080); +} + +// roms + +ROM_START( thalone ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) ) + + ROM_REGION( 494279, "screen", 0) + ROM_LOAD( "thalone.svg", 0, 494279, CRC(2479d88d) SHA1(061413d6e0893106b335ca42cf0260f45c7dacc7) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger X-Men - Project X (model 78-504) + * Sharp SM510 under epoxy (die label MD3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class txmenpx_state : public hh_sm510_state +{ +public: + txmenpx_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void txmenpx(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( txmenpx ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Move") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void txmenpx_state::txmenpx(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( txmenpx ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) ) + + ROM_REGION( 572583, "screen", 0) + ROM_LOAD( "txmenpx.svg", 0, 572583, CRC(b98f3134) SHA1(78ac7cd32b36f214b5e6eada725378ccbca91987) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Home Alone 2 - Lost in New York (model 78-506) + * Sharp SM510 under epoxy (die label MD7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thalone2_state : public hh_sm510_state +{ +public: + thalone2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thalone2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thalone2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thalone2_state::thalone2(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( thalone2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) ) + + ROM_REGION( 748928, "screen", 0) + ROM_LOAD( "thalone2.svg", 0, 748928, CRC(d42ec743) SHA1(7df9654b7f700662f29ca7cabe25ac78b2c4b04b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sonic The Hedgehog (model 78-513) + * Sharp SM511 under epoxy (die label KMS73B, N71) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tsonic_state : public hh_sm510_state +{ +public: + tsonic_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsonic(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsonic ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump Up + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Super Sonic Spin + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsonic_state::tsonic(machine_config &config) +{ + sm511_tiger2bit(config, 1517, 1080); +} + +// roms + +ROM_START( tsonic ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) ) + + ROM_REGION( 541491, "screen", 0) + ROM_LOAD( "tsonic.svg", 0, 541491, CRC(ac6bff26) SHA1(fa944958eb64e8283d35951ff105cead28e6ab8a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Robocop 3 (model 78-514) + * Sharp SM510 under epoxy (die label MC6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class trobocop3_state : public hh_sm510_state +{ +public: + trobocop3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobocop3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trobocop3 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Fly") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trobocop3_state::trobocop3(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( trobocop3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) ) + + ROM_REGION( 612142, "screen", 0) + ROM_LOAD( "trobocop3.svg", 0, 612142, CRC(b55c1440) SHA1(e8f692deecf489be22be570510175b750d65d5c5) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Incredible Crash Dummies (model 78-516) + * Sharp SM510 under epoxy (die label ME0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tdummies_state : public hh_sm510_state +{ +public: + tdummies_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tdummies(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tdummies ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Crash") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tdummies_state::tdummies(machine_config &config) +{ + sm510_tiger(config, 1441, 1080); +} + +// roms + +ROM_START( tdummies ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) ) + + ROM_REGION( 525535, "screen", 0) + ROM_LOAD( "tdummies.svg", 0, 525535, CRC(b0db8655) SHA1(937b3edd9c0949b9f7d01ef8920ac63b61e64909) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Street Fighter II (model 78-522) + * Sharp SM510 under epoxy (die label ME1) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsfight2_state : public hh_sm510_state +{ +public: + tsfight2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsfight2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsfight2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Special Move") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsfight2_state::tsfight2(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tsfight2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) ) + + ROM_REGION( 630444, "screen", 0) + ROM_LOAD( "tsfight2.svg", 0, 630444, CRC(42b82c9b) SHA1(8e18d0cfd629478973f2c857105daad70eae46d9) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Wayne's World (model 78-523) + * Sharp SM510 under epoxy (die label ME7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class twworld_state : public hh_sm510_state +{ +public: + twworld_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void twworld(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( twworld ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("High Five") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Cassandra") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void twworld_state::twworld(machine_config &config) +{ + sm510_tiger(config, 1429, 1080); +} + +// roms + +ROM_START( twworld ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) ) + + ROM_REGION( 527901, "screen", 0) + ROM_LOAD( "twworld.svg", 0, 527901, CRC(515fede8) SHA1(e9c5adfb02b860fb97968957f282e685b1a4e3bc) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Jurassic Park (model 78-524) + * Sharp SM510 under epoxy (die label MF4) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tjpark_state : public hh_sm510_state +{ +public: + tjpark_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tjpark(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tjpark ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Climb") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing/Power") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Forward") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tjpark_state::tjpark(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( tjpark ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) ) + + ROM_REGION( 812619, "screen", 0) + ROM_LOAD( "tjpark.svg", 0, 812619, CRC(04d85ec6) SHA1(97f67bb496d985b62dc094f6f1d6b5597a4df895) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sonic The Hedgehog 2 (model 78-527) + * Sharp SM511 under epoxy (die label N86) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tsonic2_state : public hh_sm510_state +{ +public: + tsonic2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsonic2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsonic2 ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsonic2_state::tsonic2(machine_config &config) +{ + sm511_tiger2bit(config, 1475, 1080); +} + +// roms + +ROM_START( tsonic2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) ) + + ROM_REGION( 667927, "screen", 0) + ROM_LOAD( "tsonic2.svg", 0, 667927, CRC(d2c52e67) SHA1(24ffbc8fae606dcd2f60a4d95fe1dcfd261c3576) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Super Double Dragon (model 78-528) + * Sharp SM510 under epoxy (die label MF5) + * lcd screen with custom segments, 1-bit sound + + BTANB: The player char right arm muscle is part of the right kick segment. + They probably meant to use it for the right punch segment, but this is + how it shows on the LCD. + +***************************************************************************/ + +class tsddragon_state : public hh_sm510_state +{ +public: + tsddragon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsddragon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsddragon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Special Technique") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsddragon_state::tsddragon(machine_config &config) +{ + sm510_tiger(config, 1503, 1080); +} + +// roms + +ROM_START( tsddragon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) ) + + ROM_REGION( 753572, "screen", 0) + ROM_LOAD( "tsddragon.svg", 0, 753572, CRC(0759388b) SHA1(4e4acb1b97845e529522ba21de846ce1dc74357d) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Dennis the Menace (model 78-532) + * Sharp SM510 under epoxy (die label MF9) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tdennis_state : public hh_sm510_state +{ +public: + tdennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tdennis(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tdennis ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Left") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tdennis_state::tdennis(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( tdennis ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) ) + + ROM_REGION( 754896, "screen", 0) + ROM_LOAD( "tdennis.svg", 0, 754896, CRC(6e7512c3) SHA1(b84ef988051a6a883f3435a779ea67e544d50dae) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Nightmare Before Christmas (model 78-537) + * Sharp SM510 under epoxy (die label MG0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tnmarebc_state : public hh_sm510_state +{ +public: + tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tnmarebc(machine_config &config); + +private: + virtual void input_w(u8 data) override; +}; + +// handlers + +void tnmarebc_state::input_w(u8 data) +{ + // S5 and S6 tied together + hh_sm510_state::input_w((data & 0x1f) | (data >> 1 & 0x10)); +} + +// config + +static INPUT_PORTS_START( tnmarebc ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5/S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tnmarebc_state::tnmarebc(machine_config &config) +{ + sm510_tiger(config, 1456, 1080); +} + +// roms + +ROM_START( tnmarebc ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) ) + + ROM_REGION( 631351, "screen", 0) + ROM_LOAD( "tnmarebc.svg", 0, 631351, CRC(140e278b) SHA1(f0d2b6e6ee2328f54255532ad03d5d505ebbb23b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Transformers - Generation 2 (model 78-541) + * Sharp SM510 under epoxy (die label MG2) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ttransf2_state : public hh_sm510_state +{ +public: + ttransf2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void ttransf2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ttransf2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Transform") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void ttransf2_state::ttransf2(machine_config &config) +{ + sm510_tiger(config, 1476, 1080); +} + +// roms + +ROM_START( ttransf2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) ) + + ROM_REGION( 727708, "screen", 0) + ROM_LOAD( "ttransf2.svg", 0, 727708, CRC(bd527f23) SHA1(9ce35bbfe1ea61c431eccaf32274faa4181587da) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Operation: Aliens (model 78-552) + * Sharp SM510 under epoxy (die label MJ1) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class topaliens_state : public hh_sm510_state +{ +public: + topaliens_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void topaliens(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( topaliens ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void topaliens_state::topaliens(machine_config &config) +{ + sm510_tiger(config, 1450, 1080); +} + +// roms + +ROM_START( topaliens ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) ) + + ROM_REGION( 1214917, "screen", 0) + ROM_LOAD( "topaliens.svg", 0, 1214917, CRC(cbd57ab4) SHA1(efac0833f421212a81a8fc9b35c97369375aa1a9) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Mortal Kombat (model 78-553) + * Sharp SM510 under epoxy (die label MG6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tmkombat_state : public hh_sm510_state +{ +public: + tmkombat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tmkombat(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tmkombat ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch High") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick High") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Low") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Low") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tmkombat_state::tmkombat(machine_config &config) +{ + sm510_tiger(config, 1468, 1080); +} + +// roms + +ROM_START( tmkombat ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) ) + + ROM_REGION( 841871, "screen", 0) + ROM_LOAD( "tmkombat.svg", 0, 841871, CRC(3bd5a963) SHA1(4d093f34c64caf60233e156fe160d8fceb15b6c6) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Shadow (model 78-559) + * Sharp SM510 under epoxy (die label MJ5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tshadow_state : public hh_sm510_state +{ +public: + tshadow_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tshadow(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tshadow ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shadow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tshadow_state::tshadow(machine_config &config) +{ + sm510_tiger(config, 1484, 1080); +} + +// roms + +ROM_START( tshadow ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) ) + + ROM_REGION( 946494, "screen", 0) + ROM_LOAD( "tshadow.svg", 0, 946494, CRC(e62de82e) SHA1(94fcef33066e97266efcd0d91b60229859088b36) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Skeleton Warriors - The Dark Crusade (model 78-569) + * Sharp SM510 under epoxy (die label MK0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tskelwarr_state : public hh_sm510_state +{ +public: + tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tskelwarr(machine_config &); +}; + +// config + +static INPUT_PORTS_START( tskelwarr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tskelwarr_state::tskelwarr(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tskelwarr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) ) + + ROM_REGION( 1125043, "screen", 0) + ROM_LOAD( "tskelwarr.svg", 0, 1125043, CRC(ee086073) SHA1(70e06a7fe8a1a8b8fee483c08522996da9917501) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman Forever - Double Dose of Doom (model 78-572) + * Sharp SM510 under epoxy (die label MK3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbatfor_state : public hh_sm510_state +{ +public: + tbatfor_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatfor(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatfor ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Grappling Gun") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Help") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Batarang") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatfor_state::tbatfor(machine_config &config) +{ + sm510_tiger(config, 1493, 1080); +} + +// roms + +ROM_START( tbatfor ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) ) + + ROM_REGION( 902412, "screen", 0) + ROM_LOAD( "tbatfor.svg", 0, 902412, CRC(d92d799e) SHA1(fa8b4198099748570a9cc9772c81aa583ac7ea72) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Judge Dredd (model 78-581) + * Sharp SM510 under epoxy (die label MK5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tjdredd_state : public hh_sm510_state +{ +public: + tjdredd_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tjdredd(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tjdredd ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tjdredd_state::tjdredd(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tjdredd ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) ) + + ROM_REGION( 1051637, "screen", 0) + ROM_LOAD( "tjdredd.svg", 0, 1051637, CRC(0f3541c6) SHA1(9838e2ae5806a48be595f53e6096b7c150b91651) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Apollo 13 (model 78-591) + * Sharp SM510 under epoxy (die label 10 07) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tapollo13_state : public hh_sm510_state +{ +public: + tapollo13_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tapollo13(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tapollo13 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Parachute") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Capture") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tapollo13_state::tapollo13(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( tapollo13 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) ) + + ROM_REGION( 643219, "screen", 0) + ROM_LOAD( "tapollo13.svg", 0, 643219, CRC(f4b94141) SHA1(d67367212f2be1685de0f3acaebaae0dc67734c4) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger 007: GoldenEye (model 78-594) + * Sharp SM510 under epoxy (die label 10 06) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tgoldeye_state : public hh_sm510_state +{ +public: + tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tgoldeye(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgoldeye ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Q") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgoldeye_state::tgoldeye(machine_config &config) +{ + sm510_tiger(config, 1461, 1080); +} + +// roms + +ROM_START( tgoldeye ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) ) + + ROM_REGION( 938956, "screen", 0) + ROM_LOAD( "tgoldeye.svg", 0, 938956, CRC(c4ad9836) SHA1(23555bd5fdaebed190ce02054a8ee681c88a8afb) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Kazaam (model 78-613) + * Sharp SM510 under epoxy (die label KMS10, 18) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tkazaam_state : public hh_sm510_state +{ +public: + tkazaam_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tkazaam(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tkazaam ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Rescue") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Back") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tkazaam_state::tkazaam(machine_config &config) +{ + sm510_tiger(config, 1452, 1080); // no external XTAL +} + +// roms + +ROM_START( tkazaam ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_18", 0x0000, 0x1000, CRC(aa796372) SHA1(fdaea736e1df46c19fca08ed981e9659e038d15a) ) + + ROM_REGION( 929109, "screen", 0) + ROM_LOAD( "tkazaam.svg", 0, 929109, CRC(5eb178d4) SHA1(bcf64df4f342d16d5fd3d4cb503fceb1e5485591) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Space Jam (model 78-621) + * Sharp SM510 under epoxy (die label KMS10, 23) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsjam_state : public hh_sm510_state +{ +public: + tsjam_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsjam(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsjam ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Block") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tune/Steal") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsjam_state::tsjam(machine_config &config) +{ + sm510_tiger(config, 1421, 1080); // no external XTAL +} + +// roms + +ROM_START( tsjam ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) ) + + ROM_REGION( 1046158, "screen", 0) + ROM_LOAD( "tsjam.svg", 0, 1046158, CRC(29187365) SHA1(f277a064e6ecd6219c930736a0bdf56196279b42) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Independence Day (model 78-624) + * Sharp SM510 under epoxy (die label 10 16) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tinday_state : public hh_sm510_state +{ +public: + tinday_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tinday(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tinday ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alert") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Velocity") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tinday_state::tinday(machine_config &config) +{ + sm510_tiger(config, 1463, 1080); +} + +// roms + +ROM_START( tinday ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) ) + + ROM_REGION( 1162716, "screen", 0) + ROM_LOAD( "tinday.svg", 0, 1162716, CRC(97056e62) SHA1(0348f0aca5d9b8e24f83c7e73b5e31f419fe60df) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman: The Animated Series (model 72-505) + * Sharp SM511 under epoxy (die label N81) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tbatmana_state : public hh_sm510_state +{ +public: + tbatmana_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatmana(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatmana ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fast") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw/Attack") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatmana_state::tbatmana(machine_config &config) +{ + sm511_tiger2bit(config, 1478, 1080); +} + +// roms + +ROM_START( tbatmana ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) ) + + ROM_REGION( 618872, "screen", 0) + ROM_LOAD( "tbatmana.svg", 0, 618872, CRC(8c721273) SHA1(d8c52441466943254bffcd6449af47a9fad6296b) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica Shuttle Voyage (MG-8) + * Sharp SM510 label 0019 238E TRONICA (no decap) + * lcd screen with custom segments, 1-bit sound + + Even though the serial is MG-8, the back of the game says 1983, newer than MG-9? + Thief in Garden (model TG-18) is the exact same MCU, but different graphics. + +***************************************************************************/ + +class trshutvoy_state : public hh_sm510_state +{ +public: + trshutvoy_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trshutvoy(machine_config &config); + void tigarden(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trshutvoy ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F + + PORT_START("IN.7") // S8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("FAKE") // Up/Sound are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") +INPUT_PORTS_END + +void trshutvoy_state::trshutvoy(machine_config &config) +{ + sm510_common(config, 1496, 1080); // R mask option confirmed +} + +void trshutvoy_state::tigarden(machine_config &config) +{ + sm510_common(config, 1515, 1080); +} + +// roms + +ROM_START( trshutvoy ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) + + ROM_REGION( 221748, "screen", 0) + ROM_LOAD( "trshutvoy.svg", 0, 221748, CRC(9e630b4e) SHA1(7e2a3a82519f29f7b1b92930604e010b5b9fdb06) ) +ROM_END + +ROM_START( tigarden ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) + + ROM_REGION( 409134, "screen", 0) + ROM_LOAD( "tigarden.svg", 0, 409134, CRC(628f4aee) SHA1(5fa4843be61b52660a932e0d1efad403cf12de88) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica: Space Rescue (model MG-9), Thunder Ball (model FR-23) + * PCB labels: SPACE RESCUE MG-9 080492 (MG-9) + SPACE RESCUE MG-9 210982 (FR-23) + * Sharp SM510 labels (no decap): 0015 224B TRONICA (MG-9) + 0015 236D TRONICA (FR-23) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class trsrescue_state : public hh_sm510_state +{ +public: + trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trsrescue(machine_config &config); + void trthuball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trsrescue ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trsrescue_state::trsrescue(machine_config &config) +{ + sm510_common(config, 1533, 1080); // R mask option confirmed +} + +void trsrescue_state::trthuball(machine_config &config) +{ + sm510_common(config, 1599, 1080); // R mask option confirmed +} + +// roms + +ROM_START( trsrescue ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) + + ROM_REGION( 178760, "screen", 0) + ROM_LOAD( "trsrescue.svg", 0, 178760, CRC(40756fd3) SHA1(9762ebbe4753a3194d7f0844c91addb8e1f8930b) ) +ROM_END + +ROM_START( trthuball ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0015_236d", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) + + ROM_REGION( 175018, "screen", 0) + ROM_LOAD( "trthuball.svg", 0, 175018, CRC(3404cc1d) SHA1(4cebe3c742c6947c6fddb8a84ae2f7d0cea1b527) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica: Space Mission (model SM-11), Spider (model SG-21) + * PCB labels: SPACE MISSION SM-11 250582 (SM-11) + SPACE MISSION SM-11 220982 (SG-21) + * Sharp SM5A labels (no decap): 0126 228B TRONICA (SM-11) + 0126 22YC TRONICA (SG-21) + * lcd screen with custom segments, 1-bit sound + + SM-11 and SG-21 are the exact same MCU, but with different graphics. + + In 1983, Tronica released a second revision of SG-21 with different graphic + overlays. This version can be distinguished by having the year 1983 labeled + on the backside of the unit. + +***************************************************************************/ + +class trspacmis_state : public hh_sm510_state +{ +public: + trspacmis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trspacmis(machine_config &config); + void trspider(machine_config & config); +}; + +// config + +static INPUT_PORTS_START( trspacmis ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trspacmis_state::trspacmis(machine_config &config) +{ + sm5a_common(config, 1601, 1080); // R mask option confirmed +} + +void trspacmis_state::trspider(machine_config &config) +{ + sm5a_common(config, 1597, 1080); // R mask option confirmed +} + +// roms + +ROM_START( trspacmis ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "0126_228b", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) + + ROM_REGION( 106675, "screen", 0) + ROM_LOAD( "trspacmis.svg", 0, 106675, CRC(45d7b798) SHA1(db08fef21462507a115547ecf8eac38260a0c868) ) +ROM_END + +ROM_START( trspider ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "0126_22yc", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) + + ROM_REGION( 130534, "screen", 0) + ROM_LOAD( "trspider.svg", 0, 130534, CRC(d3f00245) SHA1(348c47dbe87ce8537c9b1c91d0d8bbf0809546e8) ) +ROM_END + + + + + +/*************************************************************************** + + Elektronika Автослалом (Autoslalom) (model ИМ-23) + * KB1013VK1-2 MCU + * lcd screen with custom segments, 1-bit sound + + This is not an unlicensed clone, but doing a hex compare with MC-25 + still shows around 30% similarity so clearly they used that as a base. + +***************************************************************************/ + +class auslalom_state : public hh_sm510_state +{ +public: + auslalom_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void auslalom(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( auslalom ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Запуск (Start)") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Скорость (Speed)") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void auslalom_state::auslalom(machine_config &config) +{ + kb1013vk12_common(config, 1732, 1080); // R mask option ? +} + +// roms + +ROM_START( auslalom ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-23.bin", 0x0000, 0x0740, CRC(3b6e726f) SHA1(eabd04722811d1cc6519db9386b14a535f5aa865) ) + + ROM_REGION( 117520, "screen", 0) + ROM_LOAD( "auslalom.svg", 0, 117520, CRC(2f90fd4c) SHA1(f0de58b1fe2f7c18fc219f9f9a94c227ca1245e4) ) +ROM_END + + + + + +/*************************************************************************** + + VTech Electronic Number Muncher + * Sharp SM511 under epoxy (die label 772) + * lcd screen with custom segments(no background), 1-bit sound + +***************************************************************************/ + +class nummunch_state : public hh_sm510_state +{ +public: + nummunch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void nummunch(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( nummunch ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CHANGED_CB(input_changed) PORT_NAME("Calc. / Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CHANGED_CB(input_changed) PORT_NAME("Count") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHANGED_CB(input_changed) PORT_NAME("Quiz") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose +") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose -") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ÷") + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CHANGED_CB(input_changed) PORT_NAME("Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHANGED_CB(input_changed) PORT_NAME("Right") + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") + + PORT_START("IN.7") // S8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) +INPUT_PORTS_END + +void nummunch_state::nummunch(machine_config &config) +{ + sm511_common(config, 1920, 875); +} + +// roms + +ROM_START( nummunch ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "772.program", 0x0000, 0x1000, CRC(2f7ff516) SHA1(132e7c5c4d69170953b2e51731992d6d6ba829f9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "772.melody", 0x000, 0x100, CRC(96fe463a) SHA1(dcef5eee15a3f6d21e0db1b8ae3fbddc81633fc8) ) + + ROM_REGION( 140704, "screen", 0) + ROM_LOAD( "nummunch.svg", 0, 140704, CRC(050301d7) SHA1(3671d0e1b0cc788d74df0c6adb57a01729f66d7c) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT COMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS + +// Nintendo G&W: Silver/Gold (initial series is uncategorized, "Silver" was made up later) +CONS( 1980, gnw_ball, 0, 0, gnw_ball, gnw_ball, gnw_ball_state, empty_init, "Nintendo", "Game & Watch: Ball", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_flagman, 0, 0, gnw_flagman, gnw_flagman, gnw_flagman_state, empty_init, "Nintendo", "Game & Watch: Flagman", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_vermin, 0, 0, gnw_vermin, gnw_vermin, gnw_vermin_state, empty_init, "Nintendo", "Game & Watch: Vermin", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_fires, 0, 0, gnw_fires, gnw_fires, gnw_fires_state, empty_init, "Nintendo", "Game & Watch: Fire (Silver)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, gnw_judge, 0, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (purple version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_judgeo, gnw_judge, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (green version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, gnw_manholeg, 0, 0, gnw_manholeg, gnw_manholeg, gnw_manholeg_state, empty_init, "Nintendo", "Game & Watch: Manhole (Gold)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_helmet, 0, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-17)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_helmeto, gnw_helmet, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-07)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_lion, 0, 0, gnw_lion, gnw_lion, gnw_lion_state, empty_init, "Nintendo", "Game & Watch: Lion", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Wide Screen +CONS( 1981, gnw_pchute, 0, 0, gnw_pchute, gnw_pchute, gnw_pchute_state, empty_init, "Nintendo", "Game & Watch: Parachute", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_octopus, 0, 0, gnw_octopus, gnw_octopus, gnw_octopus_state, empty_init, "Nintendo", "Game & Watch: Octopus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_popeye, 0, 0, gnw_popeye, gnw_popeye, gnw_popeye_state, empty_init, "Nintendo", "Game & Watch: Popeye (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_chef, 0, 0, gnw_chef, gnw_chef, gnw_chef_state, empty_init, "Nintendo", "Game & Watch: Chef", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_mmouse, 0, 0, gnw_mmouse, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_egg, gnw_mmouse, 0, gnw_egg, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Egg", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_fire, 0, 0, gnw_fire, gnw_fire, gnw_fire_state, empty_init, "Nintendo", "Game & Watch: Fire (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_tbridge, 0, 0, gnw_tbridge, gnw_tbridge, gnw_tbridge_state, empty_init, "Nintendo", "Game & Watch: Turtle Bridge", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_fireatk, 0, 0, gnw_fireatk, gnw_fireatk, gnw_fireatk_state, empty_init, "Nintendo", "Game & Watch: Fire Attack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_stennis, 0, 0, gnw_stennis, gnw_stennis, gnw_stennis_state, empty_init, "Nintendo", "Game & Watch: Snoopy Tennis", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Multi Screen +CONS( 1982, gnw_opanic, 0, 0, gnw_opanic, gnw_opanic, gnw_opanic_state, empty_init, "Nintendo", "Game & Watch: Oil Panic", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_dkong, 0, 0, gnw_dkong, gnw_dkong, gnw_dkong_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_mickdon, 0, 0, gnw_mickdon, gnw_mickdon, gnw_mickdon_state, empty_init, "Nintendo", "Game & Watch: Mickey & Donald", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_ghouse, 0, 0, gnw_ghouse, gnw_ghouse, gnw_ghouse_state, empty_init, "Nintendo", "Game & Watch: Green House", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_dkong2, 0, 0, gnw_dkong2, gnw_dkong2, gnw_dkong2_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mario, 0, 0, gnw_mario, gnw_mario, gnw_mario_state, empty_init, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_rshower, 0, 0, gnw_rshower, gnw_rshower, gnw_rshower_state, empty_init, "Nintendo", "Game & Watch: Rain Shower", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_lboat, 0, 0, gnw_lboat, gnw_lboat, gnw_lboat_state, empty_init, "Nintendo", "Game & Watch: Life Boat", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_pinball, 0, 0, gnw_pinball, gnw_pinball, gnw_pinball_state, empty_init, "Nintendo", "Game & Watch: Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1985, gnw_bjack, 0, 0, gnw_bjack, gnw_bjack, gnw_bjack_state, empty_init, "Nintendo", "Game & Watch: Black Jack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_squish, 0, 0, gnw_squish, gnw_squish, gnw_squish_state, empty_init, "Nintendo", "Game & Watch: Squish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1987, gnw_bsweep, 0, 0, gnw_bsweep, gnw_bsweep, gnw_bsweep_state, empty_init, "Nintendo", "Game & Watch: Bomb Sweeper", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_sbuster, 0, 0, gnw_sbuster, gnw_sbuster, gnw_sbuster_state, empty_init, "Nintendo", "Game & Watch: Safe Buster", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_gcliff, 0, 0, gnw_gcliff, gnw_gcliff, gnw_gcliff_state, empty_init, "Nintendo", "Game & Watch: Gold Cliff", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, gnw_zelda, 0, 0, gnw_zelda, gnw_zelda, gnw_zelda_state, empty_init, "Nintendo", "Game & Watch: Zelda", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: New Wide Screen / Crystal Screen +CONS( 1982, gnw_dkjr, 0, 0, gnw_dkjr, gnw_dkjr, gnw_dkjr_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mariocm, 0, 0, gnw_mariocm, gnw_mariocm, gnw_mariocm_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_manhole, 0, 0, gnw_manhole, gnw_manhole, gnw_manhole_state, empty_init, "Nintendo", "Game & Watch: Manhole (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1985, gnw_tfish, 0, 0, gnw_tfish, gnw_tfish, gnw_tfish_state, empty_init, "Nintendo", "Game & Watch: Tropical Fish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_smb, 0, 0, gnw_smb, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_smbn, gnw_smb, 0, gnw_smbn, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_climber, 0, 0, gnw_climber, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_climbern, gnw_climber, 0, gnw_climbern, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_bfight, 0, 0, gnw_bfight, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_bfightn, gnw_bfight, 0, gnw_bfightn, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, gnw_mariotj, 0, 0, gnw_mariotj, gnw_mariotj, gnw_mariotj_state, empty_init, "Nintendo", "Game & Watch: Mario The Juggler", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Table Top / Panorama Screen (the first Table Top releases in Japan were called "Color Screen") +CONS( 1983, gnw_mariocmt, 0, 0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // "Another one bites the dust" startup jingle +CONS( 1983, gnw_mariocmta,gnw_mariocmt,0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72A)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // Plays an alternate jingle when starting a game +CONS( 1983, gnw_snoopyp, 0, 0, gnw_snoopyp, gnw_snoopyp, gnw_snoopyp_state, empty_init, "Nintendo", "Game & Watch: Snoopy (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_popeyep, 0, 0, gnw_popeyep, gnw_popeyep, gnw_popeyep_state, empty_init, "Nintendo", "Game & Watch: Popeye (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_dkjrp, 0, 0, gnw_dkjrp, gnw_dkjrp, gnw_dkjrp_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mbaway, 0, 0, gnw_mbaway, gnw_mbaway, gnw_mbaway_state, empty_init, "Nintendo", "Game & Watch: Mario's Bombs Away", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_mmousep, 0, 0, gnw_mmousep, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkcirc, gnw_mmousep, 0, gnw_dkcirc, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Circus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Super Color +CONS( 1984, gnw_ssparky, 0, 0, gnw_ssparky, gnw_ssparky, gnw_ssparky_state, empty_init, "Nintendo", "Game & Watch: Spitball Sparky", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_cgrab, 0, 0, gnw_cgrab, gnw_cgrab, gnw_cgrab_state, empty_init, "Nintendo", "Game & Watch: Crab Grab", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Micro Vs. System (actually, no official Game & Watch logo anywhere) +CONS( 1984, gnw_boxing, 0, 0, gnw_boxing, gnw_boxing, gnw_boxing_state, empty_init, "Nintendo", "Micro Vs. System: Boxing", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkong3, 0, 0, gnw_dkong3, gnw_dkong3, gnw_dkong3_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong 3", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkhockey, 0, 0, gnw_dkhockey, gnw_dkhockey, gnw_dkhockey_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong Hockey", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W hardware licensed to other companies (not part of G&W series) +CONS( 1984, bassmate, 0, 0, bassmate, bassmate, bassmate_state, empty_init, "Telko / Nintendo", "Bassmate Computer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Elektronika (mostly G&W clones) +CONS( 1988, taynyoke, gnw_octopus, 0, taynyoke, gnw_octopus, gnw_octopus_state, empty_init, "bootleg (Elektronika)", "Tayny okeana", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, vespovar, gnw_chef, 0, vespovar, gnw_chef, gnw_chef_state, empty_init, "bootleg (Elektronika)", "Vesyolyy povar", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, nupogodi, gnw_mmouse, 0, nupogodi, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nu, pogodi!", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, ehockey, gnw_mmouse, 0, ehockey, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Hockey (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, rkosmosa, gnw_mmouse, 0, rkosmosa, rkosmosa, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Razvedchiki kosmosa", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, okhota, gnw_mmouse, 0, okhota, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Okhota", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, biathlon, gnw_mmouse, 0, biathlon, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Biathlon", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, vfutbol, gnw_mmouse, 0, vfutbol, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Vesyolye futbolisty", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, krybolov, gnw_mmouse, 0, krybolov, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kot-rybolov (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kvakazad, gnw_mmouse, 0, kvakazad, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kvaka-zadavaka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, nochnyev, gnw_mmouse, 0, nochnyev, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nochnye vorishki", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, kosmicpt, gnw_mmouse, 0, kosmicpt, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy polyot", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, morataka, gnw_mmouse, 0, morataka, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Morskaja ataka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, atakaast, gnw_mmouse, 0, atakaast, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Ataka asteroidov", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, ecircus, gnw_mmouse, 0, ecircus, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Circus (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kosmicmt, gnw_fire, 0, kosmicmt, gnw_fire, gnw_fire_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy most", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, auslalom, 0, 0, auslalom, auslalom, auslalom_state, empty_init, "Elektronika", "Autoslalom", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Konami +CONS( 1989, kdribble, 0, 0, kdribble, kdribble, kdribble_state, empty_init, "Konami", "Double Dribble (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, ktopgun_state, empty_init, "Konami", "Top Gun (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kcontra, 0, 0, kcontra, kcontra, kcontra_state, empty_init, "Konami", "Contra (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, ktmnt_state, empty_init, "Konami", "Teenage Mutant Ninja Turtles (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kgradius, 0, 0, kgradius, kgradius, kgradius_state, empty_init, "Konami", "Gradius (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kloneran, 0, 0, kloneran, kloneran, kloneran_state, empty_init, "Konami", "Lone Ranger (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kblades, 0, 0, kblades, kblades, kblades_state, empty_init, "Konami", "Blades of Steel (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, knfl, 0, 0, knfl, knfl, knfl_state, empty_init, "Konami", "NFL Football (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kbilly, 0, 0, kbilly, kbilly, kbilly_state, empty_init, "Konami", "The Adventures of Bayou Billy (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, kbucky, 0, 0, kbucky, kbucky, kbucky_state, empty_init, "Konami", "Bucky O'Hare (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, kgarfld, 0, 0, kgarfld, kgarfld, kgarfld_state, empty_init, "Konami", "Garfield (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nelsonic Game Watch series +CONS( 1990, nsmb3, 0, 0, nsmb3, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario Bros. 3 (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +CONS( 1991, nsmw, 0, 0, nsmw, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario World (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +CONS( 1993, nstarfox, 0, 0, nstarfox, nstarfox, nstarfox_state, empty_init, "Nelsonic (licensed from Nintendo)", "Star Fox (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_IMPERFECT_SOUND ) + +// Tiger 7-xxx/78-xxx models +CONS( 1989, tgaunt, 0, 0, tgaunt, tgaunt, tgaunt_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Gauntlet (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, trobhood, tgaunt, 0, trobhood, trobhood, tgaunt_state, empty_init, "Tiger Electronics", "Robin Hood (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tddragon, 0, 0, tddragon, tddragon, tddragon_state, empty_init, "Tiger Electronics (licensed from Technos/Tradewest)", "Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tkarnov, 0, 0, tkarnov, tkarnov, tkarnov_state, empty_init, "Tiger Electronics (licensed from Data East)", "Karnov (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tvindictr, 0, 0, tvindictr, tvindictr, tvindictr_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Vindicators (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tgaiden, 0, 0, tgaiden, tgaiden, tgaiden_state, empty_init, "Tiger Electronics (licensed from Tecmo)", "Ninja Gaiden (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tbatman, 0, 0, tbatman, tbatman, tbatman_state, empty_init, "Tiger Electronics", "Batman (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tsharr2, 0, 0, tsharr2, tsharr2, tsharr2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Space Harrier II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tstrider, 0, 0, tstrider, tstrider, tstrider_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Strider (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tgoldnaxe, 0, 0, tgoldnaxe, tgoldnaxe, tgoldnaxe_state, empty_init, "Tiger Electronics (licensed from Sega)", "Golden Axe (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, trobocop2, 0, 0, trobocop2, trobocop2, trobocop2_state, empty_init, "Tiger Electronics", "Robocop 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, trockteer, trobocop2, 0, trockteer, trockteer, trobocop2_state, empty_init, "Tiger Electronics", "The Rocketeer (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, taltbeast, 0, 0, taltbeast, taltbeast, taltbeast_state, empty_init, "Tiger Electronics (licensed from Sega)", "Altered Beast (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tsf2010, 0, 0, tsf2010, tsf2010, tsf2010_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter 2010 - The Final Fight (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tswampt, 0, 0, tswampt, tswampt, tswampt_state, empty_init, "Tiger Electronics", "Swamp Thing (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tspidman, 0, 0, tspidman, tspidman, tspidman_state, empty_init, "Tiger Electronics", "Spider-Man (Tiger, 1991 version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, txmen, 0, 0, txmen, txmen, txmen_state, empty_init, "Tiger Electronics", "X-Men (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tddragon3, 0, 0, tddragon3, tddragon3, tddragon3_state, empty_init, "Tiger Electronics (licensed from Technos)", "Double Dragon 3 - The Rosetta Stone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tflash, 0, 0, tflash, tflash, tflash_state, empty_init, "Tiger Electronics", "The Flash (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tmchammer, 0, 0, tmchammer, tmchammer, tmchammer_state, empty_init, "Tiger Electronics", "MC Hammer: U Can't Touch This (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tbtoads, 0, 0, tbtoads, tbtoads, tbtoads_state, empty_init, "Tiger Electronics (licensed from Rare/Tradewest)", "Battletoads (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, thook, 0, 0, thook, thook, thook_state, empty_init, "Tiger Electronics", "Hook (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, tbttf, 0, 0, tbttf, tbttf, tbttf_state, empty_init, "Tiger Electronics", "Back to the Future (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, taddams, 0, 0, taddams, taddams, taddams_state, empty_init, "Tiger Electronics", "The Addams Family (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, thalone, 0, 0, thalone, thalone, thalone_state, empty_init, "Tiger Electronics", "Home Alone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, txmenpx, 0, 0, txmenpx, txmenpx, txmenpx_state, empty_init, "Tiger Electronics", "X-Men - Project X (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, thalone2, 0, 0, thalone2, thalone2, thalone2_state, empty_init, "Tiger Electronics", "Home Alone 2 - Lost in New York (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, tsonic, 0, 0, tsonic, tsonic, tsonic_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, trobocop3, 0, 0, trobocop3, trobocop3, trobocop3_state, empty_init, "Tiger Electronics", "Robocop 3 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tdummies, 0, 0, tdummies, tdummies, tdummies_state, empty_init, "Tiger Electronics", "The Incredible Crash Dummies (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsfight2, 0, 0, tsfight2, tsfight2, tsfight2_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, twworld, 0, 0, twworld, twworld, twworld_state, empty_init, "Tiger Electronics", "Wayne's World (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tjpark, 0, 0, tjpark, tjpark, tjpark_state, empty_init, "Tiger Electronics", "Jurassic Park (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsonic2, 0, 0, tsonic2, tsonic2, tsonic2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsddragon, 0, 0, tsddragon, tsddragon, tsddragon_state, empty_init, "Tiger Electronics (licensed from Technos)", "Super Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tdennis, 0, 0, tdennis, tdennis, tdennis_state, empty_init, "Tiger Electronics", "Dennis the Menace (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tnmarebc, 0, 0, tnmarebc, tnmarebc, tnmarebc_state, empty_init, "Tiger Electronics", "Nightmare Before Christmas (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: title has no "The" +CONS( 1993, ttransf2, 0, 0, ttransf2, ttransf2, ttransf2_state, empty_init, "Tiger Electronics", "Transformers - Generation 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, topaliens, 0, 0, topaliens, topaliens, topaliens_state, empty_init, "Tiger Electronics", "Operation: Aliens (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tmkombat, 0, 0, tmkombat, tmkombat, tmkombat_state, empty_init, "Tiger Electronics (licensed from Midway)", "Mortal Kombat (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, tshadow, 0, 0, tshadow, tshadow, tshadow_state, empty_init, "Tiger Electronics", "The Shadow (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, tskelwarr, 0, 0, tskelwarr, tskelwarr, tskelwarr_state, empty_init, "Tiger Electronics", "Skeleton Warriors - The Dark Crusade (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tbatfor, 0, 0, tbatfor, tbatfor, tbatfor_state, empty_init, "Tiger Electronics", "Batman Forever - Double Dose of Doom (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tjdredd, 0, 0, tjdredd, tjdredd, tjdredd_state, empty_init, "Tiger Electronics", "Judge Dredd (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tapollo13, 0, 0, tapollo13, tapollo13, tapollo13_state, empty_init, "Tiger Electronics", "Apollo 13 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tgoldeye, 0, 0, tgoldeye, tgoldeye, tgoldeye_state, empty_init, "Tiger Electronics", "007: GoldenEye (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tkazaam, 0, 0, tkazaam, tkazaam, tkazaam_state, empty_init, "Tiger Electronics", "Kazaam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tsjam, 0, 0, tsjam, tsjam, tsjam_state, empty_init, "Tiger Electronics", "Space Jam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Tiger 72-xxx models +CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Tronica Game Clock series +CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, trthuball, trsrescue, 0, trthuball, trsrescue, trsrescue_state, empty_init, "Tronica", "Thunder Ball (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trspider, trspacmis, 0, trspider, trspacmis, trspacmis_state, empty_init, "Tronica", "Spider (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// misc +CONS( 1989, nummunch, 0, 0, nummunch, nummunch, nummunch_state, empty_init, "VTech", "Electronic Number Muncher", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_sm510.h b/src/mame/misc_handheld/hh_sm510.h new file mode 100644 index 00000000000..ad9041ae226 --- /dev/null +++ b/src/mame/misc_handheld/hh_sm510.h @@ -0,0 +1,116 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Sharp SM5xx family handhelds. + +*/ + +#ifndef MAME_INCLUDES_HH_SM510_H +#define MAME_INCLUDES_HH_SM510_H + +#pragma once + +#include "cpu/sm510/sm510.h" +#include "cpu/sm510/sm511.h" +#include "cpu/sm510/sm530.h" +#include "cpu/sm510/sm5a.h" +#include "sound/spkrdev.h" + + +#define PORT_CHANGED_CB(x) \ + PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, x, 0) + + +class hh_sm510_state : public driver_device +{ +public: + hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), + m_io_ba(*this, "BA"), + m_io_b(*this, "B"), + m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); + virtual DECLARE_INPUT_CHANGED_MEMBER(acl_button); + +protected: + // devices + required_device m_maincpu; + optional_device m_speaker; + optional_ioport_array<8+1> m_inputs; // max 8 + optional_ioport m_io_ba, m_io_b; + output_finder<16, 16, 4> m_out_x; + + // misc common + u16 m_inp_mux = 0; // multiplexed inputs mask + int m_inp_lines = 0; // number of input mux columns + int m_inp_fixed = -1; // input column fixed to GND/Vdd (-1 means none) + u8 m_speaker_data = 0; // speaker output data(if more than 1 bit) + u8 m_s = 0; // MCU S output pins + u8 m_r = 0; // MCU R output pins + + void inp_fixed_last() { m_inp_fixed = -2; } // last input line to GND + u8 read_inputs(int columns, int fixed = -1); + + virtual void update_k_line(); + virtual void sm510_lcd_segment_w(offs_t offset, u16 data); + virtual void sm500_lcd_segment_w(offs_t offset, u16 data); + virtual u8 input_r(); + virtual void input_w(u8 data); + virtual void piezo_r1_w(u8 data); + virtual void piezo_r2_w(u8 data); + virtual void piezo_input_w(u8 data); + virtual void piezo2bit_r1_w(u8 data); + virtual void piezo2bit_input_w(u8 data); + + // display common + int m_decay_pivot = 8; // lcd segment off-to-on delay in 1kHz ticks (affects input lag) + int m_decay_len = 17; // lcd segment on-to-off delay in 1kHz ticks (lcd persistence) + u8 m_display_x_len = 0; // lcd number of groups + u8 m_display_y_len = 0; // lcd number of segments + u8 m_display_z_len = 0; // lcd number of commons + u32 m_display_state[0x20] = { }; // lcd segment data (max. 5-bit offset) + u8 m_display_decay[0x20][0x20] = { }; // (internal use) + + void set_display_size(u8 x, u8 y, u8 z); + TIMER_CALLBACK_MEMBER(display_decay_tick); + emu_timer *m_display_decay_timer = nullptr; + + virtual void machine_start() override; + virtual void machine_reset() override; + + // machine configs + void mcfg_cpu_common(machine_config &config); + void mcfg_cpu_sm5a(machine_config &config); + void mcfg_cpu_kb1013vk12(machine_config &config); + void mcfg_cpu_sm510(machine_config &config); + void mcfg_cpu_sm511(machine_config &config); + void mcfg_cpu_sm512(machine_config &config); + void mcfg_cpu_sm530(machine_config &config); + void mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag = "screen"); + void mcfg_sound_r1(machine_config &config); + + void sm5a_common(machine_config &config, u16 width, u16 height); + void kb1013vk12_common(machine_config &config, u16 width, u16 height); + void sm510_common(machine_config &config, u16 width, u16 height); + void sm511_common(machine_config &config, u16 width, u16 height); + //void sm512_common(machine_config &config, u16 width, u16 height); + void sm530_common(machine_config &config, u16 width, u16 height); + + void sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight); + void dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm510_tiger(machine_config &config, u16 width, u16 height); + void sm511_tiger1bit(machine_config &config, u16 width, u16 height); + void sm511_tiger2bit(machine_config &config, u16 width, u16 height); +}; + + +#endif // MAME_INCLUDES_HH_SM510_H diff --git a/src/mame/misc_handheld/hh_tms1k.cpp b/src/mame/misc_handheld/hh_tms1k.cpp new file mode 100644 index 00000000000..4ad3d0b2c72 --- /dev/null +++ b/src/mame/misc_handheld/hh_tms1k.cpp @@ -0,0 +1,14465 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +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: +- eva: Chrysler EVA-11 (and EVA-24) +- microvsn: Milton Bradley Microvision +- sag: Entex Select-A-Game Machine + +(contd.) hh_tms1k child drivers: +- tispellb: TI Spelling B series gen. 1 +- tispeak: TI Speak & Spell series gen. 1 + +About the approximated MCU frequency everywhere: The RC osc. is not that +stable on most of these handhelds. When comparing multiple video recordings +of the same game, it shows(and sounds) that the frequency range can differ +up to 50kHz. This is probably exaggerated due to components getting worn out +after many decades. 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. + +ROM source notes when dumped from another publisher, but confident it's the same: +- arrball: Tandy Zingo +- bcheetah: Fundimensions Incredible Brain Buggy +- cmsport: Conic Basketball +- cnbaskb: Cardinal Electronic Basketball +- cnfball: Elecsonic Football +- copycat: Sears Follow Me +- ditto: Tandy Electronic Pocket Repeat +- fxmcr165: Tandy Science Fair Microcomputer Trainer +- ginv1000: Tandy Cosmic 1000 Fire Away +- gjackpot: Entex Electronic Jackpot: Gin Rummy & Black Jack +- gpoker: Entex Electronic Poker +- matchnum: LJN Electronic Concentration +- palmf31: Toshiba BC-8018B +- ti1250: Texas Instruments TI-1200 +- ti25503: Texas Instruments TI-1265 +- ti5100: loose 1979 TMS1073NL chip + +TODO: +- Verify output PLA and microinstructions PLA for MCUs that have been dumped + electronically (mpla is usually the default, opla is often custom). +- unknown MCU clocks for some, especially if no YouTube videos are found +- Fake-press ON button when emulation starts for machines that have it on the + button matrix (doesn't look like any relies on it though). +- t7in1ss: in 2-player mode, game select and skill select can be configured after + selecting a game? Possibly BTANB, players are expected to quickly press the + "First Up" button after the alarm sound. +- bship discrete sound, netlist is documented +- finish bshipb SN76477 sound +- redo internal artwork for the baseball games (embedded SVG for diamond shapes) +- improve elecbowl driver +- tithermos temperature sensor comparator (right now just the digital clock works) +- is alphie(patent) the same as the final version? +- is starwbcp the same as MP3438? (starwbc is MP3438A) + +============================================================================ + +Let's use this driver for a list of known devices and their serials, +excluding most of TI's own products(they normally didn't use "MP" codes). +For TI's calculators, a comprehensive list of MCU serials is available +on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm + + serial device etc. +-------------------------------------------------------------------- + @CP0904A TMS0970 1977, Milton Bradley Comp IV + @MP0905B TMS0970 1977, Parker Brothers Codename Sector + *MP0057 TMS1000 1978, APH Student Speech+ (same ROM contents as TSI Speech+?) + @MP0154 TMS1000 1979, Fonas 2 Player Baseball + @MP0158 TMS1000 1979, Entex Soccer (6003) + @MP0163 TMS1000 1979, A-One LSI Match Number/LJN Electronic Concentration + @MP0166 TMS1000 1980, A-One Arrange Ball/LJN Computer Impulse/Tandy Zingo (model 60-2123) + @MP0168 TMS1000 1979, Conic Multisport/Tandy Sports Arena (model 60-2158) + @MP0170 TMS1000 1979, Conic Football + *MP0220 TMS1000 1980, Tomy Teacher + @MP0230 TMS1000 1980, Entex Blast It (6015) + @MP0271 TMS1000 1982, Radio Shack Monkey See + @MP0907 TMS1000 1979, Conic Basketball (101-006) + @MP0908 TMS1000 1979, Conic Electronic I.Q. + *MP0910 TMS1000 1979, Conic Basketball (101-003) + @MP0914 TMS1000 1979, Entex Baseball 1 + @MP0915 TMS1000 1979, Bandai System Control Car: Cheetah/The Incredible Brain Buggy + @MP0919 TMS1000 1979, Tiger Copy Cat (model 7-520) + @MP0920 TMS1000 1979, Entex Space Battle (6004) + @MP0923 TMS1000 1979, Entex Baseball 2 (6002) + *MP1022 TMS1100 1979, Texas Instruments unknown thermostat + @MP1030 TMS1100 1980, APF Mathemagician + *MP1072 TMS1100 198?, unknown device, Germany (have decap) + @MP1133 TMS1470 1979, Kosmos Astro + @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 + @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 + @MP1211 TMS1100 1980, Entex Space Invader (6012) + @MP1215 TMS1100 1980, Tiger Playmaker + @MP1218 TMS1100 1980, Entex Basketball 2 (6010) + @MP1219 TMS1100 1980, U.S. Games Super Sports-4 + @MP1221 TMS1100 1980, Entex Raise The Devil (6011) + @MP1228 TMS1100 1980, Entex Musical Marvin (6014) + @MP1231 TMS1100 1984, Tandy 3 in 1 Sports Arena (model 60-2178) + @MP1296 TMS1100 1982, Entex Black Knight Pinball (6081) + @MP1311 TMS1100 1981, Bandai TC7: Air Traffic Control + @MP1312 TMS1100 1983, Gakken FX-Micom R-165/Radio Shack Science Fair Microcomputer Trainer + *MP1359 TMS1100? 1985, Capsela CRC2000 + @MP1525 TMS1170 1980, Coleco Head to Head: Electronic Baseball + @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) + @MP2110 TMS1370 1980, Gakken Invader/Tandy Fire Away + @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away + @MP2726 TMS1040 1979, Tomy Break Up + *MP2788 TMS1070? 1980, Bandai Flight Time (? note: VFD-capable) + @MP3005 TMS1730 1989, Tiger Copy Cat (model 7-522) + @MP3200 TMS1000 1978, Parker Brothers Electronic Master Mind + @MP3201 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750A) + *MP3206 TMS1000 1979, Concept 2000 Mr. Mus-I-Cal + @MP3208 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750B) + @MP3226 TMS1000 1978, Milton Bradley Simon (Rev A) + *MP3232 TMS1000 1979, Fonas 2 Player Baseball (no "MP" on chip label) + @MP3260 TMS1000 1979, Electroplay Quickfire + @MP3300 TMS1000 1979, Milton Bradley Simon (Rev F) + @MP3301A TMS1000 1979, Milton Bradley Big Trak + *MP3312 TMS1000 1980, Nathan Mega 10000 + @MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball + @MP3321A TMS1000 1979, Coleco Head to Head: Electronic Hockey + @MP3352 TMS1200 1979, Tiger Sub Wars (model 7-490) + @M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?) + *M32018 TMS1000 1990, unknown device (have decap/dump) + M32045B TMS1000 1983, Chrysler Electronic Voice Alert (11-function) -> eva.cpp + @MP3403 TMS1100 1978, Marx Electronic Bowling + @MP3404 TMS1100 1978, Parker Brothers Merlin + @MP3405 TMS1100 1979, Coleco Amaze-A-Tron + *MP3407 TMS1100 1979, General Electric The Great Awakening (model 7-4880) + @MP3415 TMS1100 1978, Coleco Electronic Quarterback + @MP3435 TMS1100 1979, Coleco Zodiac + @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command + MP3450A TMS1100 1979, Microvision cartridge: Block Buster + MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike + MP3455 TMS1100 1980, Microvision cartridge: Pinball + MP3457 TMS1100 1979, Microvision cartridge: Mindbuster + @MP3460 TMS1100 1979, Coleco Head to Head: Electronic Football + MP3474 TMS1100 1979, Microvision cartridge: Vegas Slots + MP3475 TMS1100 1979, Microvision cartridge: Bowling + @MP3476 TMS1100 1979, Milton Bradley Super Simon + MP3479 TMS1100 1980, Microvision cartridge: Baseball + MP3481 TMS1100 1979, Microvision cartridge: Connect Four + @MP3489 TMS1100 1980, Kenner Live Action Football + @MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer + *MP3493 TMS1100 1980, Milton Bradley OMNI Entertainment System (1/2) + *MP3494 TMS1100 1980, Milton Bradley OMNI Entertainment System (2/2) + MP3496 TMS1100 1980, Microvision cartridge: Sea Duel + M34009 TMS1100 1981, Microvision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..) + @M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game + *M34014 TMS1100 1981, Coleco Bowlatronic + M34017 TMS1100 1981, Microvision cartridge: Cosmic Hunter + @M34018 TMS1100 1981, Coleco Head to Head: Electronic Boxing + @M34038 TMS1100 1982, Parker Brothers Lost Treasure + M34047 TMS1100 1982, Microvision cartridge: Super Blockbuster + @M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania + *M34137 TMS1100? 1985, Technasonic Weight Talker + @MP4486A TMS1000C 1983, Vulcan XL 25 + *MP6061 TMS0970 1979, Texas Instruments Electronic Digital Thermostat (from patent, the one in MAME didn't have a label) + @MP6100A TMS0980 1979, Ideal Electronic Detective + @MP6101B TMS0980 1979, Parker Brothers Stop Thief + *MP6354 ? 1982, Tsukuda The Dracula (? note: 40-pin, VFD-capable) + *MP6361 ? 1983, Defender Strikes (? note: VFD-capable) + @MP7302 TMS1400 1980, Tiger Deluxe Football with Instant Replay + @MP7304 TMS1400 1982, Tiger 7 in 1 Sports Stadium (model 7-555) + @MP7313 TMS1400 1980, Parker Brothers Bank Shot + @MP7314 TMS1400 1980, Parker Brothers Split Second + MP7324 TMS1400 1985, Tiger K28/Coleco Talking Teacher -> tispeak.cpp + @MP7332 TMS1400 1981, Milton Bradley Dark Tower + @MP7334 TMS1400 1981, Coleco Total Control 4 + @MP7351 TMS1400 1982, Parker Brothers Master Merlin + @MP7551 TMS1670 1980, Entex Color Football 4 (6009) + @MPF553 TMS1670 1980, Gakken/Entex Jackpot: Gin Rummy & Black Jack (6008) (note: assume F to be a misprint) + MP7573 TMS1670 1981, Entex Select-A-Game cartridge: Football 4 -> sag.cpp + *M30026 TMS2370 1983, Yaesu FT-757 Display Unit part + *M95041 TMS2670 1983, Tsukuda Game Pachinko (have decap, missing MCU emulation) + + inconsistent: + + @TMS1007 TMS1000 1976, TSI Speech+ (S14002-A) + @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) + + (* means undumped unless noted, @ denotes it's in this driver) + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "machine/clock.h" +#include "machine/ds8874.h" +#include "machine/timer.h" +#include "machine/tmc0999.h" +#include "machine/tms1024.h" +#include "sound/beep.h" +#include "sound/flt_vol.h" +#include "sound/s14001a.h" +#include "sound/sn76477.h" +#include "video/hlcd0515.h" +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" + +#include "softlist_dev.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "t7in1ss.lh" +#include "alphie.lh" +#include "amaztron.lh" // clickable +#include "arcmania.lh" // clickable +#include "arrball.lh" +#include "astro.lh" +#include "bankshot.lh" +#include "bcheetah.lh" +#include "bigtrak.lh" +#include "blastit.lh" +#include "bship.lh" // clickable +#include "cmsport.lh" +#include "cnbaskb.lh" +#include "cnfball.lh" +#include "cnfball2.lh" +#include "cnsector.lh" // clickable +#include "comp4.lh" // clickable +#include "copycat.lh" // clickable +#include "copycatm2.lh" // clickable +#include "dataman.lh" +#include "ditto.lh" // clickable +#include "dxfootb.lh" +#include "cqback.lh" +#include "ebball.lh" +#include "ebball2.lh" +#include "ebball3.lh" +#include "ebaskb2.lh" +#include "ebknight.lh" +#include "efootb4.lh" +#include "einvader.lh" +#include "elecbowl.lh" +#include "elecdet.lh" +#include "eleciq.lh" // clickable +#include "esbattle.lh" +#include "esoccer.lh" +#include "f2pbball.lh" +#include "f3in1.lh" +#include "fxmcr165.lh" // clickable +#include "gjackpot.lh" +#include "gpoker.lh" +#include "h2hbaseb.lh" +#include "h2hbaskb.lh" +#include "h2hboxing.lh" +#include "h2hfootb.lh" +#include "h2hhockey.lh" +#include "horseran.lh" +#include "liveafb.lh" +#include "lostreas.lh" // clickable +#include "matchnum.lh" // clickable +#include "mathmagi.lh" +#include "mathmarv.lh" +#include "mbdtower.lh" // clickable +#include "mdndclab.lh" // clickable +#include "merlin.lh" // clickable +#include "mmarvin.lh" // clickable +#include "mmerlin.lh" // clickable +#include "monkeysee.lh" +#include "palmf31.lh" +#include "palmmd8.lh" +#include "pbmastm.lh" +#include "phpball.lh" +#include "playmaker.lh" +#include "qfire.lh" // clickable +#include "quizwizc.lh" +#include "raisedvl.lh" +#include "simon.lh" // clickable +#include "speechp.lh" +#include "splitsec.lh" +#include "ssimon.lh" // clickable +#include "ssports4.lh" +#include "starwbc.lh" // clickable +#include "stopthief.lh" // clickable +#include "subwars.lh" +#include "t3in1sa.lh" +#include "tandy12.lh" // clickable +#include "tbreakup.lh" +#include "tc4.lh" +#include "tc7atc.lh" +#include "tcfball.lh" +#include "tcfballa.lh" +#include "ti1250.lh" +#include "ti1270.lh" +#include "ti1680.lh" +#include "ti25503.lh" +#include "ti30.lh" +#include "ti5100.lh" +#include "timaze.lh" +#include "tisr16.lh" +#include "tithermos.lh" +#include "wizatron.lh" +#include "xl25.lh" // clickable +#include "zodiac.lh" // clickable + +//#include "hh_tms1k_test.lh" // common test-layout - use external artwork + + +// machine_start/reset + +void hh_tms1k_state::machine_start() +{ + // resolve handlers + m_out_power.resolve(); + + // register for savestates + save_item(NAME(m_o)); + save_item(NAME(m_r)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_power_on)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_tms1k_state::machine_reset() +{ + set_power(true); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_tms1k_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) +{ + u8 ret = 0; + u16 colmask = (1 << columns) - 1; + + // read selected input columns + for (int i = 0; i < 8; i++) + if (1 << i & rowmask && m_inputs[i]->read() & m_inp_mux & colmask) + ret |= 1 << i; + + return ret; +} + +void hh_tms1k_state::switch_change(int sel, u32 mask, bool next) +{ + // config switches (for direct control) + ioport_field *inp = m_inputs[sel]->field(mask); + + if (next && inp->has_next_setting()) + inp->select_next_setting(); + else if (!next && inp->has_previous_setting()) + inp->select_previous_setting(); +} + +INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button) +{ + // when an input is directly wired to MCU INIT pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) +{ + set_power((bool)param); + m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); +} + +WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off) +{ + // devices with a TMS0980 can auto power-off + if (state) + power_off(); +} + +void hh_tms1k_state::power_off() +{ + set_power(false); + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); +} + +void hh_tms1k_state::set_power(bool state) +{ + m_power_on = state; + m_out_power = state ? 1 : 0; +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + A-One LSI Match Number + * PCB label PT-204 "Pair Card" + * TMS1000NLL MP0163 (die label 1000B, MP0163) + * 2x2-digit 7seg LED displays + 3 LEDs, 1-bit sound + + A-One was a subsidiary of Bandai? The PCB serial PT-xxx is same, and the font + used on the boxes for "A-One LSI" is same as "Bandai Electronics" from early-80s. + + known releases: + - Japan: Match Number, published by A-One (white case, Queen playing card bezel) + - USA: Electronic Concentration, published by LJN (black case, rainbow pattern bezel) + - UK: Electronic Concentration, published by Peter Pan Playthings (same as USA version) + +***************************************************************************/ + +class matchnum_state : public hh_tms1k_state +{ +public: + matchnum_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void matchnum(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void matchnum_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void matchnum_state::write_r(u16 data) +{ + // R3-R5,R8-R10: input mux + m_inp_mux = (data >> 3 & 7) | (data >> 5 & 0x38); + + // R6,R7: speaker out + m_speaker->level_w(data >> 6 & 3); + + // R0-R3: digit/led select + m_r = data; + update_display(); +} + +void matchnum_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: led data + m_o = data; + update_display(); +} + +u8 matchnum_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( matchnum ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Change") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") + + PORT_START("IN.5") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") +INPUT_PORTS_END + +void matchnum_state::matchnum(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(matchnum_state::read_k)); + m_maincpu->r().set(FUNC(matchnum_state::write_r)); + m_maincpu->o().set(FUNC(matchnum_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_matchnum); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( matchnum ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) ) +ROM_END + + + + + +/*************************************************************************** + + A-One LSI Arrange Ball + * PCB label Kaken, PT-249 + * TMS1000NLL MP0166 (die label 1000B, MP0166) + * 2-digit 7seg LED display + 22 LEDs, 1-bit sound + + known releases: + - Japan/World: Arrange Ball, published by A-One (black case) + - USA(1): Zingo (model 60-2123), published by Tandy (red case) + - USA(2): Computer Impulse, published by LJN (white case) + - Germany: Fixball, unknown publisher, same as LJN version + +***************************************************************************/ + +class arrball_state : public hh_tms1k_state +{ +public: + arrball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void arrball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void arrball_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void arrball_state::write_r(u16 data) +{ + // R8: input mux (always set) + m_inp_mux = data >> 8 & 1; + + // R9,R10: speaker out + m_speaker->level_w(data >> 9 & 3); + + // R0-R6: digit/led select + m_r = data; + update_display(); +} + +void arrball_state::write_o(u16 data) +{ + // O0-O6: digit segments/led data + m_o = data; + update_display(); +} + +u8 arrball_state::read_k() +{ + // K: multiplexed inputs (actually just 1) + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( arrball ) + PORT_START("IN.0") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shot") // pressed when START lights up + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stop") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Speed" ) + PORT_CONFSETTING( 0x00, "Slow" ) + PORT_CONFSETTING( 0x08, "Fast" ) +INPUT_PORTS_END + +void arrball_state::arrball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(arrball_state::read_k)); + m_maincpu->r().set(FUNC(arrball_state::write_r)); + m_maincpu->o().set(FUNC(arrball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x10, 0x7f); + m_display->set_segmask(0x20, 0x06); // left digit only segments B and C + config.set_default_layout(layout_arrball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( arrball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) ) +ROM_END + + + + + +/*************************************************************************** + + APF Mathemagician + * TMS1100 MCU, label MP1030 (no decap) + * 2 x DS8870N - Hex LED Digit Driver + * 2 x DS8861N - MOS-to-LED 5-Segment Driver + * 10-digit 7seg LED display(2 custom ones) + 4 LEDs, no sound + + This is a tabletop educational calculator. It came with plastic overlays + for playing different kind of games. Refer to the manual on how to use it. + In short, to start from scratch, press [SEL]. By default the device is in + calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT], + one of the games is started. + + 1) Number Machine + 2) Countin' On + 3) Walk The Plank + 4) Gooey Gumdrop + 5) Football + 6) Lunar Lander + +***************************************************************************/ + +class mathmagi_state : public hh_tms1k_state +{ +public: + mathmagi_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void mathmagi(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void mathmagi_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void mathmagi_state::write_r(u16 data) +{ + // R3,R5-R7,R9,R10: input mux + m_inp_mux = (data >> 3 & 1) | (data >> 4 & 0xe) | (data >> 5 & 0x30); + + // R0-R7: 7seg leds + // R8: custom math symbols digit + // R9: custom equals digit + // R10: misc lamps + m_r = data; + update_display(); +} + +void mathmagi_state::write_o(u16 data) +{ + // O1-O7: led/digit segment data + // O0: N/C + m_o = data; + update_display(); +} + +u8 mathmagi_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* physical button layout and labels are like this: + + ON ONE [SEL] [NXT] [?] [/] + | | [7] [8] [9] [x] + OFF TWO [4] [5] [6] [-] + PLAYERS [1] [2] [3] [+] + [0] [_] [r] [=] +*/ + +static INPUT_PORTS_START( mathmagi ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.1") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // R10 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 mathmagi_output_pla[0x20] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 + 0x7f, 0x6f, 0x53, 0x50, 0x08, 0x79, 0x40, 0x00, // 8, 9, questionmark, r, underscore?, E, -(negative), empty + 0x00, 0x40, 0x08, 0x7c, 0x02, 0x42, 0x06, 0x6e, // empty, led4/-, led3, b, led2, +, ×, y + 0x01, 0x41, 0x09, 0, 0, 0x5c, 0, 0x3d // led1, ÷, =, ?, ?, o, ?, G +}; + +void mathmagi_state::mathmagi(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 175000); // approximation - RC osc. R=68K, C=82pF + m_maincpu->set_output_pla(mathmagi_output_pla); + m_maincpu->k().set(FUNC(mathmagi_state::read_k)); + m_maincpu->r().set(FUNC(mathmagi_state::write_r)); + m_maincpu->o().set(FUNC(mathmagi_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 7); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_mathmagi); + + // no sound! +} + +// roms + +ROM_START( mathmagi ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai System Control Car: Cheetah 「システムコントロールカー チーター」 + * TMS1000NLL MP0915 (die label 1000B, MP0915) + * 2 motors (one for back axis, one for steering), no sound + + It's a programmable buggy, like Big Track but much simpler. To add a command + step in program-mode, press a direction key and one of the time delay number + keys at the same time. To run the program(max 24 steps), switch to run-mode + and press the go-key. + + known releases: + - Japan: System Control Car: Cheetah, published by Bandai + - USA: The Incredible Brain Buggy, published by Fundimensions + - UK: The Incredible Brain Buggy, published by Palitoy (same as USA version) + +***************************************************************************/ + +class bcheetah_state : public hh_tms1k_state +{ +public: + bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_motor1(*this, "motor1"), + m_motor2_left(*this, "motor2_left"), + m_motor2_right(*this, "motor2_right") + { } + + void bcheetah(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + output_finder<> m_motor1; + output_finder<> m_motor2_left; + output_finder<> m_motor2_right; +}; + +void bcheetah_state::machine_start() +{ + hh_tms1k_state::machine_start(); + m_motor1.resolve(); + m_motor2_left.resolve(); + m_motor2_right.resolve(); +} + +// handlers + +void bcheetah_state::write_r(u16 data) +{ + // R0-R4: input mux + // R5,R6: tied to K4?? + m_inp_mux = data & 0x1f; +} + +void bcheetah_state::write_o(u16 data) +{ + // O1: back motor (drive) + // O0: front motor steer left + // O2: front motor steer right + // O3: GND, other: N/C + m_motor1 = data >> 1 & 1; + m_motor2_left = data & 1; + m_motor2_right = data >> 2 & 1; +} + +u8 bcheetah_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( bcheetah ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, "Mode") + PORT_CONFSETTING( 0x02, "Program" ) + PORT_CONFSETTING( 0x00, "Run" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") +INPUT_PORTS_END + +void bcheetah_state::bcheetah(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 100000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(bcheetah_state::read_k)); + m_maincpu->r().set(FUNC(bcheetah_state::write_r)); + m_maincpu->o().set(FUNC(bcheetah_state::write_o)); + + config.set_default_layout(layout_bcheetah); + + // no sound! +} + +// roms + +ROM_START( bcheetah ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai TC7: Air Traffic Control + * TMS1100 MCU, label MP1311 (die label 1100E, MP1311) + * 4-digit 7seg LED display, 40 other LEDs, 1-bit sound + + It is a very complicated game, refer to the manual on how to play. + +***************************************************************************/ + +class tc7atc_state : public hh_tms1k_state +{ +public: + tc7atc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tc7atc(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tc7atc_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void tc7atc_state::write_r(u16 data) +{ + // R5: speaker out + m_speaker->level_w(BIT(data, 5)); + + // R0-R4: input mux, led select + // R6-R9: digit select + m_inp_mux = m_r = data; + update_display(); +} + +void tc7atc_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 tc7atc_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( tc7atc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("High Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hazard") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("West") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("East") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Arrive") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Depart") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Flight Path A / Level 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Flight Path B / Level 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Flight Path C / Level 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Flight Path D / Level 4") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Altitude Descend") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Altitude Ascend") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Air Speed Decrease") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Air Speed Increase") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("10%") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("20%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("40%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("80%") +INPUT_PORTS_END + +void tc7atc_state::tc7atc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=68K, C=47pF + m_maincpu->k().set(FUNC(tc7atc_state::read_k)); + m_maincpu->r().set(FUNC(tc7atc_state::write_r)); + m_maincpu->o().set(FUNC(tc7atc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3c0, 0x7f); + config.set_default_layout(layout_tc7atc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tc7atc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1311", 0x0000, 0x0800, CRC(704f5e1b) SHA1(765dce31798640480eab7576550c5378d6351b65) ) + + 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_tc7atc_output.pla", 0, 365, CRC(0e6e3096) SHA1(375beb43657af0cc3070e581b42e501878c0eaaa) ) +ROM_END + + + + + +/*************************************************************************** + + Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B, + Triumph-Adler 81 SN, Silver-Reed 8J, more + * TMS1040 MCU label TMS1045NL (die label 1040A, 1045) + * 9-digit cyan VFD display (leftmost may be custom) + + TMS1045NL is a versatile calculator chip for 3rd party manufacturers, used + by Canon, Toshiba, and several smaller companies. It doesn't look like it + was used in any TI calculator. It was up to the manufacturer to choose which + functions(keys) to leave out. + +***************************************************************************/ + +class palmf31_state : public hh_tms1k_state +{ +public: + palmf31_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void palmf31(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void palmf31_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void palmf31_state::write_r(u16 data) +{ + // R0-R8: select digit, input mux + m_r = m_inp_mux = data; + update_display(); +} + +void palmf31_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 palmf31_state::read_k() +{ + // K: multiplexed inputs, one of the columns is K2+K8 + u8 data = read_inputs(9); + if (data & 1) + data = (data & 0xe) | 0xa; + + // switches are on K1 + if (m_inp_mux & m_inputs[9]->read()) + data |= 1; + + return data; +} + +// config + +static INPUT_PORTS_START( palmf31 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M+") // add to memory + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("M-") // subtract from memory + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("RV") // reverse + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as M+ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as sqrt + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("1/x") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("RM/CM") // combined function (press twice) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("C") // clear (all) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(UTF8_LEFT) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("CI") // clear indicator + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("CI/C") // combined function (press twice) + + PORT_START("IN.9") // K1 + PORT_CONFNAME( 0x1f, 0x00, "DP" ) // display point + PORT_CONFSETTING( 0x02, "+" ) + PORT_CONFSETTING( 0x01, "0" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x10, "4" ) + PORT_CONFSETTING( 0x00, "F" ) + PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_CONFNAME( 0x100, 0x000, "AM" ) // accumulate memory + PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x100, DEF_STR( On ) ) +INPUT_PORTS_END + +void palmf31_state::palmf31(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(palmf31_state::read_k)); + m_maincpu->o().set(FUNC(palmf31_state::write_o)); + m_maincpu->r().set(FUNC(palmf31_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_palmf31); + + // no sound! +} + +// roms + +ROM_START( palmf31 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1045nl", 0x0000, 0x0400, CRC(0c42d43e) SHA1(b76d404623e3abfd0b237ee1c0b46e83f96ceb78) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_palmf31_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_palmf31_output.pla", 0, 365, CRC(bc295ea6) SHA1(7e7c9ed0c1e5e37173dd8f297473516c410bca8c) ) +ROM_END + + + + + +/*************************************************************************** + + Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810 + * TMS1070 MCU label TMC1079 (die label 1070B, 1079A) + * 2-line cyan VFD display, each 9-digit 7seg + 1 custom (label 20-ST-22) + * PCB label Canon EHI-0115-03 + + The only difference between MD-8 and MD 810 is the form factor. The latter + is a tabletop calculator. + +***************************************************************************/ + +class palmmd8_state : public hh_tms1k_state +{ +public: + palmmd8_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void palmmd8(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void palmmd8_state::update_display() +{ + // M-digit is on in memory mode, upper row is off in single mode + u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0; + u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00; + + // R10 selects display row + u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); + m_display->matrix((sel & mask) | m, m_o); +} + +void palmmd8_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void palmmd8_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = bitswap<8>(data,0,4,5,6,7,1,2,3); + update_display(); +} + +u8 palmmd8_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( palmmd8 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M+") // add to memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") // reverse + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CI/C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.10") // R10 + PORT_CONFNAME( 0x31, 0x20, "Mode" ) // bit 4 indicates M-digit on/off, bit 5 indicates upper row filament on/off + PORT_CONFSETTING( 0x31, "Memory" ) + PORT_CONFSETTING( 0x01, "Single" ) + PORT_CONFSETTING( 0x20, "Process" ) + PORT_CONFNAME( 0x02, 0x00, "AM" ) // accumulate memory + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x02, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void palmmd8_state::palmmd8(machine_config &config) +{ + // basic machine hardware + TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf + m_maincpu->k().set(FUNC(palmmd8_state::read_k)); + m_maincpu->o().set(FUNC(palmmd8_state::write_o)); + m_maincpu->r().set(FUNC(palmmd8_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(21, 8); + m_display->set_segmask(0xfffff, 0xff); + config.set_default_layout(layout_palmmd8); + + // no sound! +} + +// roms + +ROM_START( palmmd8 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_palmmd8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Amaze-A-Tron, by Ralph Baer + * TMS1100 MCU, label MP3405 (die label same) + * 2-digit 7seg LED display + 2 LEDs(one red, one green), 1-bit sound + * 5*5 pressure-sensitive playing board(buttons), 4 game pieces + + This is an electronic board game with a selection of 8 maze games, + most of them for 2 players. + +***************************************************************************/ + +class amaztron_state : public hh_tms1k_state +{ +public: + amaztron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void amaztron(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void amaztron_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void amaztron_state::write_r(u16 data) +{ + // R0-R5: input mux + m_inp_mux = data & 0x3f; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R6,R7: leds + // R8,R9: select digit + m_r = data >> 6 & 0xf; + update_display(); +} + +void amaztron_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 amaztron_state::read_k() +{ + // K: multiplexed inputs + u8 k = read_inputs(6); + + // the 5th column is tied to K4+K8 + if (k & 0x10) k |= 0xc; + return k & 0xf; +} + +// config + +static INPUT_PORTS_START( amaztron ) + 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") + + 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") + + 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") + + 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") + + 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Game Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Game Start") + PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void amaztron_state::amaztron(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=33K?, C=100pF + m_maincpu->k().set(FUNC(amaztron_state::read_k)); + m_maincpu->r().set(FUNC(amaztron_state::write_r)); + m_maincpu->o().set(FUNC(amaztron_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xc, 0x7f); + config.set_default_layout(layout_amaztron); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( amaztron ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Zodiac - The Astrology Computer (model 2110) + * TMS1100 MP3435 (no decap) + * 8-digit 7seg display, 12 other LEDs, 1-bit sound + + As the name suggests, this is an astrologic calculator. Refer to the + (very extensive) manual on how to use it. + +***************************************************************************/ + +class zodiac_state : public hh_tms1k_state +{ +public: + zodiac_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void zodiac(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void zodiac_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void zodiac_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R4,R8: input mux + m_inp_mux = (data & 0x1f) | (data >> 3 & 0x20); + + // R0-R7: digit select + // R8,R9: led select + m_r = data & 0x3ff; + update_display(); +} + +void zodiac_state::write_o(u16 data) +{ + // O0-O7: digit segment/led data + m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); + update_display(); +} + +u8 zodiac_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* The physical button layout and labels are like this: + + [P] [A] + [ 1 ] [ 2 ] [ 3 ] + [L] [ 4 ] [ 5 ] [ 6 ] [D] + [ 7 ] [ 8 ] [ 9 ] + [J] [ 0 ] [CLR] [ENT] [E] + + [.__.__.__.] + OFF H P A + +Despite that this layout features a typical digital keypad and distances +the letter buttons from it, the 8-character encoding for date input uses +letters and digits in combination. This fact and the use of the P key are +why the digit buttons are mapped here as keyboard inputs rather than as a +keypad. + +*/ + +static INPUT_PORTS_START( zodiac ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8) + + PORT_START("IN.5") // R8 + PORT_CONFNAME( 0x03, 0x01, "Mode") + PORT_CONFSETTING( 0x01, "Horoscope" ) + PORT_CONFSETTING( 0x02, "Preview" ) + PORT_CONFSETTING( 0x00, "Answer" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void zodiac_state::zodiac(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 500000); // approximation - RC osc. R=18K, C=100pF + m_maincpu->k().set(FUNC(zodiac_state::read_k)); + m_maincpu->r().set(FUNC(zodiac_state::write_r)); + m_maincpu->o().set(FUNC(zodiac_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_zodiac); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( zodiac ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_zodiac_output.bin", 0, 0x20, CRC(d35d64cb) SHA1(315e7ca9a18a06ff7dc0b95c6f119e093b15a41f) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Electronic Quarterback (model 2120) + * TMS1100NLL MP3415 (die label same) + * 9-digit LED grid, 1-bit sound + + known releases: + - USA(1): Electronic Quarterback, published by Coleco + - USA(2): Electronic Touchdown, published by Sears + +***************************************************************************/ + +class cqback_state : public hh_tms1k_state +{ +public: + cqback_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cqback(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cqback_state::update_display() +{ + // R9 selects between segments B/C or A'/D' + u16 seg = m_o; + if (m_r & 0x200) + seg = (m_o << 7 & 0x300) | (m_o & 0xf9); + + m_display->matrix(m_r & 0x1ff, seg); +} + +void cqback_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R0-R9: select digit/segment + m_r = data; + update_display(); +} + +void cqback_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cqback_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(5); +} + +// config + +static INPUT_PORTS_START( cqback ) + PORT_START("IN.0") // K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick/Pass") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") + + PORT_START("IN.1") // K2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.3") // K8 + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) // TP1-TP2 +INPUT_PORTS_END + +void cqback_state::cqback(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(cqback_state::read_k)); + m_maincpu->r().set(FUNC(cqback_state::write_r)); + m_maincpu->o().set(FUNC(cqback_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x1ff, 0xff); + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_cqback); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cqback ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Football (model 2140) + * TMS1100NLLE (rev. E!) MP3460 (die label same) + * 2*SN75492N LED display drivers, 9-digit LED grid, 1-bit sound + + LED electronic football game. To distinguish between offense and defense, + offense blips appear brighter. The hardware is similar to cqback. + + known releases: + - USA(1): Head to Head: Electronic Football, published by Coleco + - USA(2): Team Play Football, published by Sears + +***************************************************************************/ + +class h2hfootb_state : public hh_tms1k_state +{ +public: + h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hfootb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void h2hfootb_state::update_display() +{ + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 1 & 0x100)); +} + +void h2hfootb_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R8: input mux + m_inp_mux = data & 0x1ff; + + // R0-R8: select led + // R9: led between digits + m_r = data; + update_display(); +} + +void h2hfootb_state::write_o(u16 data) +{ + // O0-O7: digit segments A-G,A' + m_o = data; + update_display(); +} + +u8 h2hfootb_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(9); +} + +// config + +static INPUT_PORTS_START( h2hfootb ) + PORT_START("IN.0") // K1 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.1") // K2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("P1 Play Selector") // pass + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.3") // K8 + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick/Pass") + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY +INPUT_PORTS_END + +void h2hfootb_state::h2hfootb(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=39K, C=100pF + m_maincpu->k().set(FUNC(h2hfootb_state::read_k)); + m_maincpu->r().set(FUNC(h2hfootb_state::write_r)); + m_maincpu->o().set(FUNC(h2hfootb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1ff, 0x7f); + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_h2hfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hfootb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Basketball (model 2150) + * TMS1000NLL MP3320A (die label 1000E MP3320A) + * 2-digit 7seg LED display, LED grid display, 1-bit sound + + Coleco Head to Head: Electronic Hockey (model 2160) + * TMS1000NLL E MP3321A (die label 1000E MP3321A) + * same PCB/hardware as above + + Unlike the COP420 version(see hh_cop400.cpp driver), each game has its own MCU. + To begin play, press start while holding left/right. + +***************************************************************************/ + +class h2hbaskb_state : public hh_tms1k_state +{ +public: + h2hbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_cap_empty_timer(*this, "cap_empty") + { } + + void h2hbaskb(machine_config &config); + void h2hhockey(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_cap_empty_timer; + TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback); + bool m_cap_state = false; + attotime m_cap_charge = attotime::zero; + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void h2hbaskb_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_cap_state)); + save_item(NAME(m_cap_charge)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(h2hbaskb_state::cap_empty_callback) +{ + if (~m_r & 0x200) + m_cap_state = false; +} + +void h2hbaskb_state::update_display() +{ + // R6,R7 are commons for R0-R5 + u16 sel = 0; + if (m_r & 0x40) sel |= (m_r & 0x3f); + if (m_r & 0x80) sel |= (m_r & 0x3f) << 6; + + m_display->matrix(sel, m_o); +} + +void h2hbaskb_state::write_r(u16 data) +{ + // R0-R3: input mux + m_inp_mux = (data & 0xf); + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R9: K8 and 15uF cap to V- (used as timer) + // rising edge, remember the time + if (data & ~m_r & 0x200) + { + m_cap_state = true; + m_cap_charge = machine().time(); + } + // falling edge, determine how long K8 should stay up + if (~data & m_r & 0x200) + { + const attotime full = attotime::from_usec(1300); // approx. charge time + const int factor = 27; // approx. factor for charge/discharge to logic 0 + + attotime charge = machine().time() - m_cap_charge; + if (charge > full) + charge = full; + + m_cap_empty_timer->adjust(charge * factor); + } + + // R0-R7: led select + m_r = data; + update_display(); +} + +void h2hbaskb_state::write_o(u16 data) +{ + // O1-O7: led data + m_o = data >> 1 & 0x7f; + update_display(); +} + +u8 h2hbaskb_state::read_k() +{ + // K1-K4: multiplexed inputs, K8: R9 and capacitor + return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0); +} + +// config + +static INPUT_PORTS_START( h2hbaskb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start/Display") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hhockey ) + PORT_INCLUDE( h2hbaskb ) + + PORT_MODIFY("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") +INPUT_PORTS_END + +void h2hbaskb_state::h2hbaskb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=100pF + m_maincpu->k().set(FUNC(h2hbaskb_state::read_k)); + m_maincpu->r().set(FUNC(h2hbaskb_state::write_r)); + m_maincpu->o().set(FUNC(h2hbaskb_state::write_o)); + + TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6+6, 7); + m_display->set_segmask(0xc0, 0x7f); + config.set_default_layout(layout_h2hbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void h2hbaskb_state::h2hhockey(machine_config &config) +{ + h2hbaskb(config); + config.set_default_layout(layout_h2hhockey); +} + +// roms + +ROM_START( h2hbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3320a", 0x0000, 0x0400, CRC(39a63f43) SHA1(14a765e42a39f8d3a465c990e09dd651e595a1c5) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_h2hbaskb_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) +ROM_END + +ROM_START( h2hhockey ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Baseball (model 2180) + * PCB labels Coleco rev C 73891/2 + * TMS1170NLN MP1525-N2 (die label MP1525) + * 9-digit cyan VFD display, and other LEDs behind bezel, 1-bit sound + + known releases: + - USA: Head to Head: Electronic Baseball, published by Coleco + - Japan: Computer Baseball, published by Tsukuda + +***************************************************************************/ + +class h2hbaseb_state : public hh_tms1k_state +{ +public: + h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hbaseb(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void h2hbaseb_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void h2hbaseb_state::set_clock() +{ + // MCU clock is from an RC circuit with C=47pF, and R value is depending on + // skill switch: R=51K(1) or 43K(2) + m_maincpu->set_unscaled_clock((m_inputs[5]->read() & 1) ? 400000 : 350000); +} + +void h2hbaseb_state::update_display() +{ + m_display->matrix((m_r & 0xff) | (m_r >> 1 & 0x100), (m_r & 0x100) | m_o); +} + +void h2hbaseb_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R4-R7: input mux + m_inp_mux = data >> 4 & 0xf; + + // R0-R7,R9: select vfd digit/led + // R8: led state + m_r = data; + update_display(); +} + +void h2hbaseb_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: N/C + m_o = data; + update_display(); +} + +u8 h2hbaseb_state::read_k() +{ + // K: multiplexed inputs (note: K8(Vss row) is always on) + return m_inputs[4]->read() | read_inputs(4); +} + +// config + +static INPUT_PORTS_START( h2hbaseb ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("N") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("B") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("S") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Curve") // these two buttons appear twice on the board + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Pitch") // " + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // Vss! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Swing") + + PORT_START("IN.5") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, h2hbaseb_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +void h2hbaseb_state::h2hbaseb(machine_config &config) +{ + // basic machine hardware + TMS1170(config, m_maincpu, 350000); // see set_clock + m_maincpu->k().set(FUNC(h2hbaseb_state::read_k)); + m_maincpu->r().set(FUNC(h2hbaseb_state::write_r)); + m_maincpu->o().set(FUNC(h2hbaseb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_h2hbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hbaseb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Boxing (model 2190) + * TMS1100NLL M34018-N2 (die label M34018) + * 2-digit 7seg LED display, LED grid display, 1-bit sound + + This appears to be the last game of Coleco's Head to Head series. + +***************************************************************************/ + +class h2hboxing_state : public hh_tms1k_state +{ +public: + h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hboxing(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void h2hboxing_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void h2hboxing_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R0-R7: select led + // R9,R10: select digit + m_r = data & ~0x100; + update_display(); +} + +void h2hboxing_state::write_o(u16 data) +{ + // O0-O7: digit segments/led data + m_o = data; + update_display(); +} + +u8 h2hboxing_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( h2hboxing ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punch / Pro") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Block / Amateur") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Punch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Block") +INPUT_PORTS_END + +void h2hboxing_state::h2hboxing(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=100pF + m_maincpu->k().set(FUNC(h2hboxing_state::read_k)); + m_maincpu->r().set(FUNC(h2hboxing_state::write_r)); + m_maincpu->o().set(FUNC(h2hboxing_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_segmask(0x600, 0x7f); + config.set_default_layout(layout_h2hboxing); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hboxing ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Quiz Wiz Challenger + * TMS1000NLL M32001-N2 (die label 1000E, M32001) + * 4 7seg LEDs, 17 other LEDs, 1-bit sound + + This is a 4-player version of Quiz Wiz, a multiple choice quiz game. + According to the manual, Quiz Wiz cartridges are compatible with it. + The question books are needed to play, as well as optional game pieces. + + Cartridge pinout: + 1 R4 + 2 R6 + 3 R7 + 4 K1 + 5 N/C + 6 R8 + 7 R5 + 8 R9 + + The cartridge connects one or more of the R pins to K1. Together with the + question numbers, the game generates a pseudo-random answerlist. + +***************************************************************************/ + +class quizwizc_state : public hh_tms1k_state +{ +public: + quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void quizwizc(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u16 m_pinout = 0x07; // cartridge R pins + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void quizwizc_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_pinout)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge pinout K1 to R connections + const char *pinout = image.get_feature("pinout"); + m_pinout = pinout ? strtoul(pinout, nullptr, 2) & 0xe7 : 0; + m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4; + + if (m_pinout == 0) + { + image.seterror(image_error::INVALIDIMAGE, "Invalid cartridge pinout"); + return image_init_result::FAIL; + } + + return image_init_result::PASS; +} + +void quizwizc_state::update_display() +{ + // note: O7 is on VSS + m_display->matrix(m_r | 0x400, m_o); +} + +void quizwizc_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R5: input mux + // R4-R9: to cartridge slot + m_inp_mux = data & 0x3f; + + // R0-R3: led select + // R6-R9: digit select + m_r = data; + update_display(); +} + +void quizwizc_state::write_o(u16 data) +{ + // O0-O7: led/digit segment data + m_o = bitswap<8>(data,7,0,1,2,3,4,5,6); + update_display(); +} + +u8 quizwizc_state::read_k() +{ + // K: multiplexed inputs + // K1: cartridge pin 4 (pin 5 N/C) + return read_inputs(6) | ((m_r & m_pinout) ? 1 : 0); +} + +// config + +static INPUT_PORTS_START( quizwizc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // A (player 1 at bottom, increment counter-clockwise) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // B + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // C + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) // D + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Go") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Slow Forward") + + PORT_START("IN.5") // R5 + PORT_CONFNAME( 0x02, 0x00, "Game Select" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void quizwizc_state::quizwizc(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=100pF + m_maincpu->k().set(FUNC(quizwizc_state::read_k)); + m_maincpu->r().set(FUNC(quizwizc_state::write_r)); + m_maincpu->o().set(FUNC(quizwizc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10+1, 8); + m_display->set_segmask(0x3c0, 0x7f); + config.set_default_layout(layout_quizwizc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "quizwiz_cart")); + cartslot.set_must_be_loaded(true); + cartslot.set_device_load(FUNC(quizwizc_state::cart_load)); + SOFTWARE_LIST(config, "cart_list").set_original("quizwiz"); +} + +// roms + +ROM_START( quizwizc ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Total Control 4 + * TMS1400NLL MP7334-N2 (die label MP7334) + * 2x2-digit 7seg LED display + 4 LEDs, LED grid display, 1-bit sound + + This is a head to head electronic tabletop LED-display sports console. + One cartridge(Football) was included with the console, the other three were + sold in a pack. Gameplay has emphasis on strategy, read the official manual + on how to play. MAME external artwork is needed for the switchable overlays. + + Cartridge pinout: + 1 N/C + 2 9V+ + 3 power switch + 4 K8 + 5 K4 + 6 K2 + 7 K1 + 8 R9 + + The cartridge connects pin 8 with one of the K-pins. + +***************************************************************************/ + +class tc4_state : public hh_tms1k_state +{ +public: + tc4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tc4(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u8 m_pinout = 0xf; // cartridge K pins + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void tc4_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_pinout)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge pinout R9 to K connections + const char *pinout = image.get_feature("pinout"); + m_pinout = pinout ? strtoul(pinout, nullptr, 0) & 0xf : 0xf; + + return image_init_result::PASS; +} + +void tc4_state::update_display() +{ + // note: R6 is an extra column + m_display->matrix(m_r, (m_o | (m_r << 2 & 0x100))); +} + +void tc4_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R5: input mux + // R9: to cartridge slot + m_inp_mux = data & 0x3f; + + // R0-R4: select led + // R6: led 8 state + // R5,R7-R9: select digit + m_r = data; + update_display(); +} + +void tc4_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 tc4_state::read_k() +{ + // K: multiplexed inputs, cartridge pins from R9 + return read_inputs(6) | ((m_r & 0x200) ? m_pinout : 0); +} + +// config + +static INPUT_PORTS_START( tc4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pass/Shoot Button 3") // right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass/Shoot Button 1") // left + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass/Shoot Button 2") // middle + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 D/K Button") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 3") // right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 1") // left + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 2") // middle + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button") +INPUT_PORTS_END + +void tc4_state::tc4(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 450000); // approximation - RC osc. R=27.3K, C=100pF + m_maincpu->k().set(FUNC(tc4_state::read_k)); + m_maincpu->r().set(FUNC(tc4_state::write_r)); + m_maincpu->o().set(FUNC(tc4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x3a0, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_tc4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "tc4_cart")); + cartslot.set_must_be_loaded(true); // system won't power on without cartridge + cartslot.set_device_load(FUNC(tc4_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("tc4"); +} + +// roms + +ROM_START( tc4 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Basketball + * PCB label CONIC 101-006 + * TMS1000NLL MP0907 (die label 1000B MP0907) + * DS8871N, 2 7seg LEDs, 30 other LEDs, 1-bit sound + + There are 3 known versions of Conic Basketball: MP0910(101-003) and + MP0907(101-006) are nearly identical. MP0168 is found in Conic Multisport. + + known releases: + - Hong Kong: Electronic Basketball, published by Conic + - USA: Electronic Basketball, published by Cardinal + +***************************************************************************/ + +class cnbaskb_state : public hh_tms1k_state +{ +public: + cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnbaskb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnbaskb_state::update_display() +{ + m_display->matrix(m_r & 0x1fc, m_o); +} + +void cnbaskb_state::write_r(u16 data) +{ + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0,R1: input mux + // R10 is also tied to K1 (locks up at boot if it's not handled) + m_inp_mux = (data >> 8 & 4) | (data & 3); + + // R2-R6: led select + // R7,R8: digit select + m_r = data; + update_display(); +} + +void cnbaskb_state::write_o(u16 data) +{ + // O0-O6: led/digit segment data + // O7: N/C + m_o = data; + update_display(); +} + +u8 cnbaskb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cnbaskb ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x01, "2" ) // professional + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cnbaskb_state::cnbaskb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(cnbaskb_state::read_k)); + m_maincpu->r().set(FUNC(cnbaskb_state::write_r)); + m_maincpu->o().set(FUNC(cnbaskb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cnbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Multisport + * PCB label CONIC 101-027(1979), or CONIC 101-021 REV A(1980, with DS8871N) + * TMS1000 MP0168 (die label same) + * 2 7seg LEDs, 33 other LEDs, 1-bit sound + + This handheld includes 3 games: Basketball, Ice Hockey, Soccer. + MAME external artwork is needed for the switchable overlays. + + known releases: + - Hong Kong: Electronic Multisport, published by Conic + - Hong Kong: Basketball/Ice Hockey/Soccer, published by Conic (3 separate handhelds) + - USA(1): Electronic Multisport, published by Innocron + - USA(2): Sports Arena, published by Tandy (model 60-2158) + +***************************************************************************/ + +class cmsport_state : public hh_tms1k_state +{ +public: + cmsport_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cmsport(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cmsport_state::update_display() +{ + m_display->matrix(m_r & ~0x80, m_o); +} + +void cmsport_state::write_r(u16 data) +{ + // R7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // R0,R9,R10: input mux + m_inp_mux = (data & 1) | (data >> 8 & 6); + + // R0-R4,R8: led select + // R5,R6: digit select + m_r = data; + update_display(); +} + +void cmsport_state::write_o(u16 data) +{ + // O0-O7: led/digit segment data + m_o = data; + update_display(); +} + +u8 cmsport_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cmsport ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x05, 0x01, "Game Select" ) + PORT_CONFSETTING( 0x01, "Basketball" ) + PORT_CONFSETTING( 0x00, "Soccer" ) + PORT_CONFSETTING( 0x04, "Ice Hockey" ) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void cmsport_state::cmsport(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(cmsport_state::read_k)); + m_maincpu->r().set(FUNC(cmsport_state::write_r)); + m_maincpu->o().set(FUNC(cmsport_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x60, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cmsport); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cmsport ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Football + * TMS1000 MP0170 (die label same) + * DS8874N, 3*9 LED array, 7 7seg LEDs, 1-bit sound + + This is a clone of Mattel Football. Apparently Mattel tried to keep imports + of infringing games from going through customs. Conic (Hong Kong) answered + by distributing the game under subsidiary brands - see list below. + + known releases: + - Hong Kong: Electronic Football, published by Conic + - USA(1): Football, published by E.R.S.(Electronic Readout Systems) + - USA(2): Football, published by ELECsonic + - USA(3): Football, no brand! + + Another hardware revision of this game uses a PIC16 MCU. + +***************************************************************************/ + +class cnfball_state : public hh_tms1k_state +{ +public: + cnfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void cnfball(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnfball_state::update_display() +{ + m_display->matrix(~m_grid, m_o | (m_r << 6 & 0x700)); +} + +void cnfball_state::ds8874_output_w(u16 data) +{ + m_grid = data; + update_display(); +} + +void cnfball_state::write_r(u16 data) +{ + // R5,R8: N/C + // R6,R7: speaker out + m_speaker->level_w(data >> 6 & 3); + + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R0: DS8874N CP (note: it goes back to K8 too, game relies on it) + // R1: DS8874N _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 1)); + + // R2-R4: led data + m_r = data; + update_display(); +} + +void cnfball_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cnfball_state::read_k() +{ + // K: multiplexed inputs, K8 also tied to DS8874N CP(R0) + return read_inputs(2) | (m_r << 3 & 8); +} + +// config + +static INPUT_PORTS_START( cnfball ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) // college + PORT_CONFSETTING( 0x00, "2" ) // professional +INPUT_PORTS_END + +void cnfball_state::cnfball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(cnfball_state::read_k)); + m_maincpu->r().set(FUNC(cnfball_state::write_r)); + m_maincpu->o().set(FUNC(cnfball_state::write_o)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(cnfball_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 8+3); + m_display->set_segmask(0xc3, 0x7f); + m_display->set_segmask(0x38, 0xff); // only the middle 3 7segs have DP + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cnfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Football II + * TMS1100 MP1181 (no decap) + * 9-digit LED grid, 1-bit sound + + This is a clone of Coleco's Quarterback, similar at hardware-level too. + Unlike the other LED Football games, this one looks like it doesn't make + the offense(player) leds brighter. + + known releases: + - Hong Kong: Electronic Football II, published by Conic + - USA: Electronic Football II, published by Tandy + +***************************************************************************/ + +class cnfball2_state : public hh_tms1k_state +{ +public: + cnfball2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnfball2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnfball2_state::update_display() +{ + // R1 selects between segments B/C or A'/D' + u16 seg = m_o; + if (~m_r & 2) + seg = (m_o << 7 & 0x300) | (m_o & 0xf9); + + m_display->matrix(m_r >> 2 & 0x1ff, seg); +} + +void cnfball2_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R8-R10: input mux + m_inp_mux = data >> 8 & 7; + + // R1-R10: select digit/segment + m_r = data; + update_display(); +} + +void cnfball2_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cnfball2_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cnfball2 ) + PORT_START("IN.0") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x02, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass/run + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // college + PORT_CONFSETTING( 0x08, "2" ) // professional + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cnfball2_state::cnfball2(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(cnfball2_state::read_k)); + m_maincpu->r().set(FUNC(cnfball2_state::write_r)); + m_maincpu->o().set(FUNC(cnfball2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_cnfball2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnfball2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump, 2nd half unused + ROM_LOAD16_BYTE( "tms1100_cnfball2_output.bin", 0, 0x20, CRC(c51d7404) SHA1(3a00c69b52b7d0dd12ccd66428130592c7e06240) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic I.Q. + * PCB labels: main: CONIC 101-037 (other side: HG-15, 11*00198*00), button PCB: + CONIC 102-001, led PCB: CONIC 100-003 REV A itac + * TMS1000NLL MP0908 (die label 1000B, MP0908) + * 2 7seg LEDs, 30 other LEDs, 1-bit sound + + This is a peg solitaire game, with random start position. + + known releases: + - Hong Kong: Electronic I.Q., published by Conic + - UK: Solitaire, published by Grandstand + +***************************************************************************/ + +class eleciq_state : public hh_tms1k_state +{ +public: + eleciq_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void eleciq(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void eleciq_state::update_display() +{ + m_display->matrix(m_r & ~1, m_o); +} + +void eleciq_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R1-R6,R9: input mux + m_inp_mux = (data >> 1 & 0x3f) | (data >> 3 & 0x40); + + // R1-R6: led select + // R7,R8: digit select + m_r = data; + update_display(); +} + +void eleciq_state::write_o(u16 data) +{ + // O0-O6: led/digit segment data + // O7: N/C + m_o = data; + update_display(); +} + +u8 eleciq_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +static INPUT_PORTS_START( eleciq ) + PORT_START("IN.0") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Up-Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Up") + + PORT_START("IN.1") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button B") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Up-Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Down") + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Down-Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Left") + + PORT_START("IN.3") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button D") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Down-Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Right") + + PORT_START("IN.4") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button E") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button F") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R9 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x01, "2" ) // professional + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) +INPUT_PORTS_END + +void eleciq_state::eleciq(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=50pF + m_maincpu->k().set(FUNC(eleciq_state::read_k)); + m_maincpu->r().set(FUNC(eleciq_state::write_r)); + m_maincpu->o().set(FUNC(eleciq_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x180, 0x7f); + config.set_default_layout(layout_eleciq); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( eleciq ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) ) +ROM_END + + + + + +/*************************************************************************** + + Electroplay Quickfire + * TMS1000NLL MP3260 (die label same) + * 2 7seg LEDs, 5 lamps, 3 lightsensors, lightgun + + To play it in MAME, either use the clickable artwork with -mouse, or set + button 1 to "Z or X or C" and each lightsensor to one of those keys. + Although the game seems mostly playable without having to use the gun trigger + +***************************************************************************/ + +class qfire_state : public hh_tms1k_state +{ +public: + qfire_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void qfire(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void qfire_state::write_r(u16 data) +{ + // R1,R2,R5: input mux + m_inp_mux = (data >> 1 & 3) | (data >> 3 & 4); + + // R3,R4,R6-R8: leds (direct) + m_display->write_row(2, (data >> 3 & 3) | (data >> 4 & 0x1c)); + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); +} + +void qfire_state::write_o(u16 data) +{ + // O0: 1st digit "1" + // O1-O7: 2nd digit segments + m_display->write_row(0, (data & 1) ? 6 : 0); + m_display->write_row(1, data >> 1 & 0x7f); +} + +u8 qfire_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( qfire ) + PORT_START("IN.0") // R1 + PORT_CONFNAME( 0x0f, 0x00, "Game" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x02, "4" ) + PORT_CONFSETTING( 0x01, "5" ) + PORT_CONFSETTING( 0x06, "6" ) + + PORT_START("IN.1") // R2 + PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "A" ) + PORT_CONFSETTING( 0x02, "B" ) + PORT_CONFSETTING( 0x01, "C" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // lightgun trigger, also turns on lightgun lamp +INPUT_PORTS_END + +void qfire_state::qfire(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(qfire_state::read_k)); + m_maincpu->r().set(FUNC(qfire_state::write_r)); + m_maincpu->o().set(FUNC(qfire_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_qfire); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( qfire ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3260", 0x0000, 0x0400, CRC(f6e28376) SHA1(6129584c55a1629b458694cdc97edccb77ab00ba) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_qfire_output.pla", 0, 365, CRC(8f7668a9) SHA1(c8faeff0f88bfea8f032ce5bc583f049e8930c11) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Soccer + * TMS1000NL MP0158 (die label 1000B, MP0158) + * 2 7seg LEDs, 30 other LEDs, 1-bit sound + + known releases: + - USA: Electronic Soccer, 2 versions (leds on green bezel, or leds under bezel) + - Germany: Fussball, with skill switch + +***************************************************************************/ + +class esoccer_state : public hh_tms1k_state +{ +public: + esoccer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void esoccer(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void esoccer_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void esoccer_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void esoccer_state::write_o(u16 data) +{ + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 esoccer_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( esoccer ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R2 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // Auto + PORT_CONFSETTING( 0x02, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL +INPUT_PORTS_END + +void esoccer_state::esoccer(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 475000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(esoccer_state::read_k)); + m_maincpu->r().set(FUNC(esoccer_state::write_r)); + m_maincpu->o().set(FUNC(esoccer_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x300, 0x7f); + m_display->set_bri_levels(0.008, 0.08); // player led is brighter + config.set_default_layout(layout_esoccer); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( esoccer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball (1) + * TMS1000NLP MP0914 (die label MP0914A) + * 1 7seg LED, and other LEDs behind bezel, 1-bit sound + + This is a handheld LED baseball game. One player controls the batter, the CPU + or other player controls the pitcher. Pitcher throw buttons are on a 'joypad' + obtained from a compartment in the back. Player scores are supposed to be + written down manually, the game doesn't save scores or innings (this annoyance + was resolved in the sequel). For more information, refer to the official manual. + + The overlay graphic is known to have 2 versions: one where the field players + are denoted by words ("left", "center", "short", etc), and an alternate one + with little guys drawn next to the LEDs. + + led translation table: led LDzz from game PCB = MAME y.x: + + 0 = - 10 = 1.2 20 = 4.2 30 = 6.0 + 1 = 2.3 11 = 0.4 21 = 4.1 31 = 6.1 + 2 = 0.0 12 = 1.5 22 = 4.0 32 = 6.2 + 3 = 0.1 13 = 2.2 23 = 4.3 33 = 7.0 + 4 = 0.2 14 = 3.3 24 = 5.3 34 = 7.1 + 5 = 1.0 15 = 3.2 25 = 5.2 + 6 = 1.3 16 = 2.1 26 = 5.1 + 7 = 1.1 17 = 3.1 27 = 5.0 + 8 = 0.3 18 = 3.0 28 = 7.2 + 9 = 1.4 19 = 2.0 29 = 7.3 + +***************************************************************************/ + +class ebball_state : public hh_tms1k_state +{ +public: + ebball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebball_state::update_display() +{ + m_display->matrix(m_r, ~m_o); +} + +void ebball_state::write_r(u16 data) +{ + // R1-R5: input mux + m_inp_mux = data >> 1 & 0x1f; + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0-R7: led select + // R8: digit select + m_r = data; + update_display(); +} + +void ebball_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 ebball_state::read_k() +{ + // K: multiplexed inputs (note: K8(Vss row) is always on) + return m_inputs[5]->read() | read_inputs(5); +} + +// config + +static INPUT_PORTS_START( ebball ) + PORT_START("IN.0") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Change Sides") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // Vss! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") +INPUT_PORTS_END + +void ebball_state::ebball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=47pF + m_maincpu->k().set(FUNC(ebball_state::read_k)); + m_maincpu->r().set(FUNC(ebball_state::write_r)); + m_maincpu->o().set(FUNC(ebball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x100, 0x7f); + config.set_default_layout(layout_ebball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball 2 + * PCB label ZENY + * TMS1000 MCU, MP0923 (die label same) + * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + The Japanese version was published by Gakken, black case instead of white. + + The sequel to Entex Baseball, this version keeps up with score and innings. + As its predecessor, the pitcher controls are on a separate joypad. + + led translation table: led zz from game PCB = MAME y.x: + + 00 = - 10 = 9.4 20 = 7.4 30 = 5.0 + 01 = 5.3 11 = 9.3 21 = 7.5 31 = 5.1 + 02 = 0.7 12 = 9.2 22 = 8.0 32 = 5.2 + 03 = 1.7 13 = 6.2 23 = 8.1 33 = 4.0 + 04 = 2.7 14 = 7.0 24 = 8.2 34 = 4.1 + 05 = 9.7 15 = 7.1 25 = 8.3 35 = 3.1 + 06 = 9.0 16 = 6.1 26 = 8.4 36 = 3.0 + 07 = 9.5 17 = 7.2 27 = 8.5 37 = 3.3 + 08 = 6.3 18 = 7.3 28 = 4.2 38 = 3.2 + 09 = 9.1 19 = 6.0 29 = 4.3 + +***************************************************************************/ + +class ebball2_state : public hh_tms1k_state +{ +public: + ebball2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebball2_state::update_display() +{ + m_display->matrix(m_r ^ 0x7f, ~m_o); +} + +void ebball2_state::write_r(u16 data) +{ + // R3-R6: input mux + m_inp_mux = data >> 3 & 0xf; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R2: digit select + // R3-R9: led select + m_r = data; + update_display(); +} + +void ebball2_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 ebball2_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( ebball2 ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ebball2_state::ebball2(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ebball2_state::read_k)); + m_maincpu->r().set(FUNC(ebball2_state::write_r)); + m_maincpu->o().set(FUNC(ebball2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_ebball2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball 3 + * PCB label ZENY + * TMS1100NLL 6007 MP1204 (rev. E!) (die label MP1204) + * 2*SN75492N LED display driver + * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + This is another improvement over Entex Baseball, where gameplay is a bit more + varied. Like the others, the pitcher controls are on a separate joypad. + + led translation table: led zz from game PCB = MAME y.x: + note: unlabeled panel leds are listed here as Sz, Bz, Oz, Iz, z left-to-right + + 00 = - 10 = 7.5 20 = 7.2 + 01 = 6.0 11 = 6.5 21 = 8.4 + 02 = 6.1 12 = 5.5 22 = 8.5 + 03 = 6.2 13 = 5.2 23 = 9.0 + 04 = 6.3 14 = 8.0 24 = 9.2 + 05 = 7.3 15 = 8.1 25 = 9.1 + 06 = 5.3 16 = 5.1 26 = 9.3 + 07 = 7.4 17 = 8.2 27 = 9.5 + 08 = 6.4 18 = 8.3 28 = 9.4 + 09 = 5.4 19 = 5.0 + + S1,S2: 4.0,4.1 + B1-B3: 3.0-3.2 + O1,O2: 4.2,4.3 + I1-I6: 2.0-2.5, I7-I9: 3.3-3.5 + +***************************************************************************/ + +class ebball3_state : public hh_tms1k_state +{ +public: + ebball3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball3(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void ebball3_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void ebball3_state::set_clock() +{ + // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz, + // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed + // it up to around ~440kHz. + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 440000 : 340000); +} + +void ebball3_state::update_display() +{ + m_display->matrix_partial(0, 10, m_r, m_o); + + // R0,R1 are normal 7segs + // R4,R7 contain segments(only F and B) for the two other digits + m_display->write_row(10, (m_display->read_row(4) & 0x20) | (m_display->read_row(7) & 0x02)); + m_display->write_row(11, ((m_display->read_row(4) & 0x10) | (m_display->read_row(7) & 0x01)) << 1); +} + +void ebball3_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1, digit select + // R2-R9: led select + m_r = data; + update_display(); +} + +void ebball3_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 ebball3_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +/* physical button layout and labels are like this: + + main device (batter side): remote pitcher: + + MAN + PRO | [FAST BALL] [CHANGE UP] [CURVE] [SLIDER] + | OFF| + o o [STEAL DEFENSE] [KNUCKLER] + AM AUTO + + [BUNT] [BATTER] [STEAL] +*/ + +static INPUT_PORTS_START( ebball3 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Steal Defense") + + PORT_START("IN.2") // R2 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // AUTO + PORT_CONFSETTING( 0x00, "2" ) // MAN + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Bunt") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, ebball3_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // AM + PORT_CONFSETTING( 0x01, "2" ) // PRO +INPUT_PORTS_END + +void ebball3_state::ebball3(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 340000); // see set_clock + m_maincpu->k().set(FUNC(ebball3_state::read_k)); + m_maincpu->r().set(FUNC(ebball3_state::write_r)); + m_maincpu->o().set(FUNC(ebball3_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10+2, 7); + m_display->set_segmask(3, 0x7f); + m_display->set_segmask(0xc00, 0x22); + config.set_default_layout(layout_ebball3); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball3 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) ) + + 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_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Space Battle + * TMS1000 EN-6004 MP0920 (die label 1000B, MP0920) + * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + The Japanese version was published by Gakken, same name. + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 1.1 20 = 2.3 30 = 5.2 + 1 = 0.0 11 = 1.2 21 = 3.0 31 = 5.3 + 2 = 0.1 12 = 1.3 22 = 3.1 32 = 6.0 + 3 = 0.2 13 = 1.4 23 = 3.2 33 = 6.1 + 4 = 0.3 14 = 1.5 24 = 3.3 34 = 6.2 + 5 = 0.4 15 = 1.6 25 = 4.0 35 = 7.0 + 6 = 0.5 16 = 1.7 26 = 4.1 36 = 7.1 + 7 = 0.6 17 = 2.0 27 = 4.2 + 8 = 0.7 18 = 2.1 28 = 5.0 + 9 = 1.0 19 = 2.2 29 = 5.1 + +***************************************************************************/ + +class esbattle_state : public hh_tms1k_state +{ +public: + esbattle_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void esbattle(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void esbattle_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void esbattle_state::write_r(u16 data) +{ + // R0,R1: input mux + m_inp_mux = data & 3; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void esbattle_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 esbattle_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( esbattle ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual +INPUT_PORTS_END + +void esbattle_state::esbattle(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(esbattle_state::read_k)); + m_maincpu->r().set(FUNC(esbattle_state::write_r)); + m_maincpu->o().set(FUNC(esbattle_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x300, 0x7f); + config.set_default_layout(layout_esbattle); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( esbattle ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Blast It + * TMS1000 MP0230 (die label 1000B, MP0230) + * 3 7seg LEDs, 49 other LEDs (both under an overlay mask), 1-bit sound + +***************************************************************************/ + +class blastit_state : public hh_tms1k_state +{ +public: + blastit_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void blastit(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void blastit_state::update_display() +{ + m_display->matrix(m_r >> 1, m_o); +} + +void blastit_state::write_r(u16 data) +{ + // R3: input mux + m_inp_mux = data >> 3 & 1; + + // R0: speaker out + m_speaker->level_w(data & 1); + + // R1-R7: led select + // R8-R10: digit select + m_r = data; + update_display(); +} + +void blastit_state::write_o(u16 data) +{ + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 blastit_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( blastit ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) // AM + PORT_CONFSETTING( 0x00, "2" ) // PRO +INPUT_PORTS_END + +void blastit_state::blastit(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(blastit_state::read_k)); + m_maincpu->r().set(FUNC(blastit_state::write_r)); + m_maincpu->o().set(FUNC(blastit_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x380, 0x7f); + m_display->set_bri_levels(0.01, 0.115); // ball/paddle is slightly brighter + config.set_default_layout(layout_blastit); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( blastit ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0230", 0x0000, 0x0400, CRC(1eb5f473) SHA1(76cd8c0e04368aa2150d428018643e1d0b9adda0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_blastit_output.pla", 0, 365, CRC(fa8081df) SHA1(99706d5ad58a76d47446576fac18964e602171c8) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Space Invader + * TMS1100 MP1211 (die label same) + * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + There are two versions of this game: the first release(this one) is on + TMS1100, the second more widespread release runs on a COP400. There are + also differences with the overlay mask. + +***************************************************************************/ + +class einvader_state : public hh_tms1k_state +{ +public: + einvader_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + void einvader(machine_config &config); + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); +}; + +void einvader_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void einvader_state::set_clock() +{ + // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz, + // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed + // it up to around ~400kHz. + m_maincpu->set_unscaled_clock((m_inputs[0]->read() & 8) ? 400000 : 320000); +} + +void einvader_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void einvader_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R6: led select + // R7-R9: digit select + m_r = data; + update_display(); +} + +void einvader_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( einvader ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, einvader_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void einvader_state::einvader(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 320000); // see set_clock + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(einvader_state::write_r)); + m_maincpu->o().set(FUNC(einvader_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(945, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x380, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // ufo/player explosion is brighter + config.set_default_layout(layout_einvader); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvader ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) ) + + 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_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) ) + + ROM_REGION( 45196, "mask", 0) + ROM_LOAD( "einvader.svg", 0, 45196, CRC(35a1c744) SHA1(6beb9767454b9bc8f2ccf9fee25e7be209eefd22) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Color Football 4 + * TMS1670 6009 MP7551 (die label MP7551) + * 9-digit cyan VFD display, 60 red and green LEDs behind mask, 1-bit sound + + Another version exist, one with a LED(red) 7seg display. + +***************************************************************************/ + +class efootb4_state : public hh_tms1k_state +{ +public: + efootb4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void efootb4(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void efootb4_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void efootb4_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R0-R9: led select + // R10-R15: digit select + m_r = data; + update_display(); +} + +void efootb4_state::write_o(u16 data) +{ + // O7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 efootb4_state::read_k() +{ + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( efootb4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // 2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // 4 + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // 2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // 3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // 4 + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Run") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Run") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x02, "2" ) // professional + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Status") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void efootb4_state::efootb4(machine_config &config) +{ + // basic machine hardware + TMS1670(config, m_maincpu, 400000); // approximation - RC osc. R=42K, C=47pF + m_maincpu->k().set(FUNC(efootb4_state::read_k)); + m_maincpu->r().set(FUNC(efootb4_state::write_r)); + m_maincpu->o().set(FUNC(efootb4_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1920, 904); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(16, 7); + m_display->set_segmask(0xfc00, 0x7f); + config.set_default_layout(layout_efootb4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( efootb4 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) ) + + ROM_REGION( 67472, "mask", 0) + ROM_LOAD( "efootb4.svg", 0, 67472, CRC(ba0abcda) SHA1(6066e4cbae5404e4db17fae0153808b044adc823) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Basketball 2 + * TMS1100 6010 MP1218 (die label MP1218) + * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + led translation table: led zz from game PCB = MAME y.x: + + 11 = 9.0 21 = 9.1 31 = 9.2 41 = 9.3 51 = 9.5 + 12 = 8.0 22 = 8.1 32 = 8.2 42 = 8.3 52 = 8.5 + 13 = 7.0 23 = 7.1 33 = 7.2 43 = 7.3 53 = 8.4 + 14 = 6.0 24 = 6.1 34 = 6.2 44 = 6.3 54 = 7.5 + 15 = 5.0 25 = 5.1 35 = 5.2 45 = 5.3 55 = 7.4 + 16 = 4.0 26 = 4.1 36 = 4.2 46 = 4.3 56 = 6.5 + + A = 9.4 + B = 6.4 + +***************************************************************************/ + +class ebaskb2_state : public hh_tms1k_state +{ +public: + ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebaskb2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebaskb2_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void ebaskb2_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R6-R9: input mux + m_inp_mux = data >> 6 & 0xf; + + // R0-R3: digit select + // R4-R9: led select + m_r = data; + update_display(); +} + +void ebaskb2_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data; + update_display(); +} + +u8 ebaskb2_state::read_k() +{ + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( ebaskb2 ) + PORT_START("IN.0") // R6 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // amateur + PORT_CONFSETTING( 0x00, "2" ) // professional + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + + PORT_START("IN.1") // R7 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Shoot") + + PORT_START("IN.2") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.3") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY +INPUT_PORTS_END + +void ebaskb2_state::ebaskb2(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 360000); // approximation - RC osc. R=33K, C=82pF + m_maincpu->k().set(FUNC(ebaskb2_state::read_k)); + m_maincpu->r().set(FUNC(ebaskb2_state::write_r)); + m_maincpu->o().set(FUNC(ebaskb2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0xf, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // ball carrier led is brighter + config.set_default_layout(layout_ebaskb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebaskb2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) ) + + 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_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Raise The Devil + * TMS1100 MP1221 (die label same) + * 4 7seg LEDs(rightmost one unused), and other LEDs behind bezel, 1-bit sound + + Entex Black Knight (licensed handheld version of Williams' pinball game) + * TMS1100 MP1296 (no decap) + * same hardware as Raise The Devil + + raisedvl led translation table: led zz from game PCB = MAME y.x: + (no led labels on ebknight PCB) + + 0 = - 10 = 4.4 20 = 5.3 30 = 9.5 40 = 9.2 + 1 = 3.0 11 = 4.5 21 = 5.4 31 = 8.5 41 = 9.3 + 2 = 3.1 12 = - 22 = - 32 = 6.5 42 = 9.0 + 3 = 3.2 13 = 5.0 23 = 6.0 33 = 7.4 43 = 9.1 + 4 = 3.3 14 = 5.1 24 = 6.1 34 = 7.0 + 5 = 3.4 15 = 5.2 25 = 6.2 35 = 7.1 + 6 = 4.0 16 = - 26 = 6.3 36 = 8.0 + 7 = 4.1 17 = 7.2 27 = 6.4 37 = 8.1 + 8 = 4.2 18 = 7.3 28 = 8.4 38 = 8.2 + 9 = 4.3 19 = - 29 = 9.4 39 = 8.3 + + NOTE!: MAME external artwork is required + +***************************************************************************/ + +class raisedvl_state : public hh_tms1k_state +{ +public: + raisedvl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void raisedvl(machine_config &config); + void ebknight(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void raisedvl_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void raisedvl_state::set_clock() +{ + // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills + // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one. + // 0: R=47K -> ~350kHz + // 2,3: R=35K8 -> ~425kHz (combined) + // 4: R=32K -> ~465kHz (combined) + u8 inp = m_inputs[1]->read(); + m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000)); +} + +void raisedvl_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void raisedvl_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1: input mux + m_inp_mux = data & 3; + + // R0-R2: digit select + // R3-R9: led select + m_r = data; + update_display(); +} + +void raisedvl_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 raisedvl_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2) & 0xf; +} + +// config + +static INPUT_PORTS_START( raisedvl ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 (only bit 0) + PORT_CONFNAME( 0x31, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, raisedvl_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x10, "2" ) + PORT_CONFSETTING( 0x11, "3" ) + PORT_CONFSETTING( 0x21, "4" ) +INPUT_PORTS_END + +void raisedvl_state::raisedvl(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // see set_clock + m_maincpu->k().set(FUNC(raisedvl_state::read_k)); + m_maincpu->r().set(FUNC(raisedvl_state::write_r)); + m_maincpu->o().set(FUNC(raisedvl_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_raisedvl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void raisedvl_state::ebknight(machine_config &config) +{ + raisedvl(config); + config.set_default_layout(layout_ebknight); +} + +// roms + +ROM_START( raisedvl ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) ) + + 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_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) +ROM_END + +ROM_START( ebknight ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1296", 0x0000, 0x0800, CRC(bc57a46a) SHA1(f60843779f49a8bd28291df3390086e54b9e3f40) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified, taken from raisedvl + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ebknight_output.pla", 0, 365, BAD_DUMP CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) // " +ROM_END + + + + + +/*************************************************************************** + + Entex Musical Marvin + * TMS1100 MP1228 (no decap) + * 1 7seg LED, 8 other leds, 1-bit sound with volume decay + * dials for speed, tone (volume decay), volume (also off/on switch) + + The design patent was assigned to Hanzawa (Japan), so it's probably + manufactured by them. + +***************************************************************************/ + +class mmarvin_state : public hh_tms1k_state +{ +public: + mmarvin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_volume(*this, "volume"), + m_speed_timer(*this, "speed") + { } + + void mmarvin(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + required_device m_speed_timer; + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void mmarvin_state::machine_start() +{ + hh_tms1k_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(mmarvin_state::speaker_decay_sim) +{ + m_volume->flt_volume_set_volume(m_speaker_volume); + + // volume decays when speaker is off, decay scale is determined by tone dial + double step = (1.01 - 1.003) / 255.0; // approximation + m_speaker_volume /= 1.01 - (double)(u8)m_inputs[5]->read() * step; +} + +void mmarvin_state::update_display() +{ + u8 digit = bitswap<7>(m_o,6,2,1,0,5,4,3); // 7seg is upside-down + m_display->matrix(m_r, (m_o << 1 & 0x100) | (m_r & 0x80) | digit); +} + +void mmarvin_state::write_r(u16 data) +{ + // R2-R5: input mux + m_inp_mux = data >> 2 & 0xf; + + // R6: trigger speed dial timer + if (m_r & 0x40 && ~data & 0x40) + { + double step = (2100 - 130) / 255.0; // duration range is around 0.13s to 2.1s + m_speed_timer->adjust(attotime::from_msec(2100 - (u8)m_inputs[4]->read() * step)); + } + + // R10: speaker out + m_speaker->level_w(BIT(m_r, 10)); + + // R9: trigger speaker on + if (m_r & 0x200 && ~data & 0x200) + m_volume->flt_volume_set_volume(m_speaker_volume = 1.0); + + // R0,R1: digit/led select + // R7: digit DP + m_r = data; + update_display(); +} + +void mmarvin_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 mmarvin_state::read_k() +{ + // K1-K4: multiplexed inputs + // K8: speed dial state + return (read_inputs(4) & 7) | (m_speed_timer->enabled() ? 0 : 8); +} + +// config + +static INPUT_PORTS_START( mmarvin ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Mode") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button Do 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button Re") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button Mi") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button Fa") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button Sol") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Button La") + + PORT_START("IN.3") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Button Ti") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Button Do 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Space") + + PORT_START("IN.4") + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(1) PORT_NAME("Speed Dial") + + PORT_START("IN.5") + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(2) PORT_NAME("Tone Dial") +INPUT_PORTS_END + +void mmarvin_state::mmarvin(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=51K, C=47pF + m_maincpu->k().set(FUNC(mmarvin_state::read_k)); + m_maincpu->r().set(FUNC(mmarvin_state::write_r)); + m_maincpu->o().set(FUNC(mmarvin_state::write_o)); + + TIMER(config, "speed").configure_generic(nullptr); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 9); + m_display->set_segmask(1, 0xff); + config.set_default_layout(layout_mmarvin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(mmarvin_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( mmarvin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1228", 0x0000, 0x0800, CRC(68ce3ab6) SHA1(15f7fb3f438116bf6128f11c981bdc0852d5a4ec) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_mmarvin_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_mmarvin_output.bin", 0, 0x20, CRC(a274951f) SHA1(7e91ddd42c132942a32351649eaf1107b5b0285c) ) +ROM_END + + + + + +/*************************************************************************** + + Fonas 2 Player Baseball + * PCB label CA-014 (probably Cassia) + * TMS1000NLL MP0154 (die label 1000B, MP0154) + * 4 7seg LEDs, 37 other LEDs, 1-bit sound + + known releases: + - World: 2 Player Baseball, published by Fonas + - USA: 2 Player Baseball, published by Sears + - Canada: 2 Player Baseball, published by Talbot Electronics + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 2.2 20 = 4.0 30 = 4.4 + 1 = 2.3 11 = 3.3 21 = 2.7 31 = 3.7 + 2 = 0.4 12 = 1.2 22 = 0.0 32 = 4.3 + 3 = 3.2 13 = 2.4 23 = 4.1 33 = 4.6 + 4 = 0.5 14 = 1.0 24 = 3.1 34 = 3.5 + 5 = 0.3 15 = 2.1 25 = 0.2 35 = 4.5 + 6 = 3.4 16 = 1.1 26 = 0.1 + 7 = 1.3 17 = 4.7 27 = 4.2 + 8 = 1.4 18 = 2.0 28 = 3.0 + 9 = 1.7 19 = 0.7 29 = 1.5 + +***************************************************************************/ + +class f2pbball_state : public hh_tms1k_state +{ +public: + f2pbball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void f2pbball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void f2pbball_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void f2pbball_state::write_r(u16 data) +{ + // R4,R9,R10: input mux + m_inp_mux = (data >> 4 & 1) | (data >> 8 & 6); + + // R9,R10(ANDed together): speaker out + m_speaker->level_w(data >> 10 & data >> 9 & 1); + + // R0-R4: led select + // R5-R8: digit select + m_r = data; + update_display(); +} + +void f2pbball_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); + update_display(); +} + +u8 f2pbball_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( f2pbball ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pick Off") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "Practice" ) // middle switch + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pitch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Swing") + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast") + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) +INPUT_PORTS_END + +void f2pbball_state::f2pbball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=51K, C=39pF + m_maincpu->k().set(FUNC(f2pbball_state::read_k)); + m_maincpu->r().set(FUNC(f2pbball_state::write_r)); + m_maincpu->o().set(FUNC(f2pbball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1e0, 0x7f); + config.set_default_layout(layout_f2pbball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( f2pbball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) ) +ROM_END + + + + + +/*************************************************************************** + + Fonas 3 in 1: Football, Basketball, Soccer + * PCB label HP-801 + * 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 f3in1(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void f3in1_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +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_inputs[4]->read() & 1) ? 400000 : 300000); +} + +void f3in1_state::update_display() +{ + m_display->matrix(m_r & ~0x20, m_o); +} + +void f3in1_state::write_r(u16 data) +{ + // 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: led select + // R6-R9: digit select + m_r = data; + update_display(); +} + +void f3in1_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 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, 0) + PORT_CONFSETTING( 0x00, "1" ) // REG + PORT_CONFSETTING( 0x01, "2" ) // PROF +INPUT_PORTS_END + +void f3in1_state::f3in1(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // see set_clock + m_maincpu->k().set(FUNC(f3in1_state::read_k)); + m_maincpu->r().set(FUNC(f3in1_state::write_r)); + m_maincpu->o().set(FUNC(f3in1_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3c0, 0x7f); + m_display->set_bri_levels(0.003, 0.05); // player led is brighter + config.set_default_layout(layout_f3in1); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +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 + + + + + +/*************************************************************************** + + Gakken Poker + * PCB label POKER. gakken + * TMS1370 MP2105 (die label same) + * 11-digit cyan VFD display Itron FG1114B, oscillator sound + + known releases: + - Japan: Poker, published by Gakken + - USA: Electronic Poker, published by Entex + +***************************************************************************/ + +class gpoker_state : public hh_tms1k_state +{ +public: + gpoker_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_beeper(*this, "beeper") + { } + + void gpoker(machine_config &config); + +protected: + required_device m_beeper; + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void gpoker_state::update_display() +{ + u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; + m_display->matrix(m_r & 0x7ff, segs | (m_r >> 3 & 0xf00)); +} + +void gpoker_state::write_r(u16 data) +{ + // R15: enable beeper + m_beeper->set_state(data >> 15 & 1); + + // R0-R6: input mux + m_inp_mux = data & 0x7f; + + // R0-R10: select digit + // R11-R14: card symbols + m_r = data; + update_display(); +} + +void gpoker_state::write_o(u16 data) +{ + // O0-O7: digit segments A-G,H + m_o = data; + update_display(); +} + +u8 gpoker_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +/* physical button layout and labels are like this: + + [7] [8] [9] [DL] | (on/off switch) + [4] [5] [6] [BT] + [1] [2] [3] [CA] [CE] + [0] [GO] [T] [AC] +*/ + +static INPUT_PORTS_START( gpoker ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x06, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear All") // AC + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Call") // CA + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT + + PORT_START("FAKE") // 9/DL are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL +INPUT_PORTS_END + +void gpoker_state::gpoker(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(gpoker_state::read_k)); + m_maincpu->r().set(FUNC(gpoker_state::write_r)); + m_maincpu->o().set(FUNC(gpoker_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 14); + m_display->set_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal + config.set_default_layout(layout_gpoker); + + // sound hardware + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 2400); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gpoker ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) ) + + 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_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Jackpot: Gin Rummy & Black Jack + * PCB label gakken + * TMS1670 MPF553 (die label same) + * 11-digit cyan VFD display Itron FG1114B, oscillator sound + + known releases: + - Japan: Jackpot(?), published by Gakken + - USA: Electronic Jackpot: Gin Rummy & Black Jack, published by Entex + +***************************************************************************/ + +class gjackpot_state : public gpoker_state +{ +public: + gjackpot_state(const machine_config &mconfig, device_type type, const char *tag) : + gpoker_state(mconfig, type, tag) + { } + + void gjackpot(machine_config &config); + +private: + virtual void write_r(u16 data) override; +}; + +// handlers + +void gjackpot_state::write_r(u16 data) +{ + // same as gpoker, only input mux msb is R10 instead of R6 + gpoker_state::write_r(data); + m_inp_mux = (data & 0x3f) | (data >> 4 & 0x40); +} + +// config + +/* physical button layout and labels are like this: + (note: on dual-function buttons, upper label=Gin, lower label=Black Jack) + + BJ --o GIN + OFF + [7] [8] [9] [DL] + + [4] [5] [6] [ [KN + DB] SP] + [1] [2] [3] [DS] [DR] + BT] HT] + [10/0] [T] [MD [CH [AC] + GO] ST] +*/ + +static INPUT_PORTS_START( gjackpot ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10/0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Draw/Hit") // DR/HT + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Knock/Split") // KN/SP + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Display/Bet") // DS/BT + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Meld/Go") // MD/GO + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Double") // DB + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Change/Stand") // CH/ST + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R10 + PORT_CONFNAME( 0x06, 0x04, "Game Select" ) + PORT_CONFSETTING( 0x04, "Gin Rummy" ) + PORT_CONFSETTING( 0x02, "Black Jack" ) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gjackpot_state::gjackpot(machine_config &config) +{ + gpoker(config); + + // basic machine hardware + TMS1670(config.replace(), m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(gjackpot_state::read_k)); + m_maincpu->r().set(FUNC(gjackpot_state::write_r)); + m_maincpu->o().set(FUNC(gjackpot_state::write_o)); + + config.set_default_layout(layout_gjackpot); +} + +// roms + +ROM_START( gjackpot ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Invader + * PCB label GAKKEN, INVADER, KS-00779 + * TMS1370 MP2110 + * cyan VFD display Itron? CP5008A, 1-bit sound + + known releases: + - World: Invader, published by Gakken + - USA(1): Galaxy Invader, published by CGL + - USA(2): Fire Away, published by Tandy + - USA(3): Electron Blaster, published by Vanity Fair + + On the real thing, the joystick is "sticky"(it doesn't autocenter when you let go). + There's also a version with a cyan/red VFD, possibly the same ROM. + +***************************************************************************/ + +class ginv_state : public hh_tms1k_state +{ +public: + ginv_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ginv(machine_config &config); + +private: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ginv_state::write_r(u16 data) +{ + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R15: speaker out + m_speaker->level_w(data >> 15 & 1); + + // R0-R8: VFD grid + // R11-R14: VFD plate + m_grid = data & 0x1ff; + m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); + update_display(); +} + +void ginv_state::write_o(u16 data) +{ + // O0-O7: VFD plate + m_plate = (m_plate & ~0xff) | data; + update_display(); +} + +u8 ginv_state::read_k() +{ + // K1-K4: multiplexed inputs (K8 is fire button) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +static INPUT_PORTS_START( ginv ) + PORT_START("IN.0") // R9 + PORT_CONFNAME( 0x07, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x05, EQUALS, 0x00) // joystick centered + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) +INPUT_PORTS_END + +void ginv_state::ginv(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ginv_state::read_k)); + m_maincpu->r().set(FUNC(ginv_state::write_r)); + m_maincpu->o().set(FUNC(ginv_state::write_o)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(236, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ginv ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2110", 0x0000, 0x0800, CRC(f09c5588) SHA1(06eb8ed512eaf5367ea30c2b633219e105ddfd14) ) + + 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_ginv_output.pla", 0, 365, CRC(6e33a24e) SHA1(cdf7ecf12ddd3863e6301e20fe80f9737db429e5) ) + + ROM_REGION( 142959, "screen", 0) + ROM_LOAD( "ginv.svg", 0, 142959, CRC(b0dc9bac) SHA1(18f8cc51a432d14f08fdf766275222f3ed184d89) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Invader 1000 + * TMS1370 MP2139 (die label 1170 MP2139) + * cyan/red VFD display Futaba DM-25Z 2D, 1-bit sound + + known releases: + - World: Galaxy Invader 1000, published by Gakken + - Japan: Invader 1000, published by Gakken + - USA(1): Galaxy Invader 1000, published by CGL + - USA(2): Cosmic 1000 Fire Away, published by Tandy + +***************************************************************************/ + +class ginv1000_state : public hh_tms1k_state +{ +public: + ginv1000_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ginv1000(machine_config &config); + +private: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv1000_state::update_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); + m_display->matrix(grid, plate); +} + +void ginv1000_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R8,R15: input mux + m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2); + + // R1-R10: VFD grid + // R11-R14: VFD plate + m_grid = data >> 1 & 0x3ff; + m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); + update_display(); +} + +void ginv1000_state::write_o(u16 data) +{ + // O0-O7: VFD plate + m_plate = (m_plate & ~0xff) | data; + update_display(); +} + +u8 ginv1000_state::read_k() +{ + // K1,K2: multiplexed inputs (K8 is fire button) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +static INPUT_PORTS_START( ginv1000 ) + PORT_START("IN.0") // R8 + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFSETTING( 0x02, "3" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R15 + 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 ginv1000_state::ginv1000(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(ginv1000_state::read_k)); + m_maincpu->r().set(FUNC(ginv1000_state::write_r)); + m_maincpu->o().set(FUNC(ginv1000_state::write_o)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(226, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ginv1000 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) ) + + 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_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) ) + + ROM_REGION( 227224, "screen", 0) + ROM_LOAD( "ginv1000.svg", 0, 227224, CRC(f220711a) SHA1(729ad85fb9d9853a77c45b5ed072f10ede7649c4) ) +ROM_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, published by Gakken + - 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") + { } + + void ginv2000(machine_config &config); + +private: + required_device m_expander; + void expander_w(offs_t offset, u8 data); + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv2000_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ginv2000_state::expander_w(offs_t offset, u8 data) +{ + // TMS1024 port 4-7: VFD plate + int shift = (offset - tms1024_device::PORT4) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ginv2000_state::write_r(u16 data) +{ + // 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((data >> 12 & 1) | (data >> 10 & 2) | 4); + m_expander->write_std(data >> 13 & 1); + + // R1-R10: VFD grid + m_grid = data >> 1 & 0x3ff; + update_display(); +} + +void ginv2000_state::write_o(u16 data) +{ + // O4-O7: TMS1024 H1-H4 + m_expander->write_h(data >> 4 & 0xf); +} + +u8 ginv2000_state::read_k() +{ + // K1,K2: multiplexed inputs (K8 is fire button) + return m_inputs[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::ginv2000(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 425000); // approximation - RC osc. R=36K, C=47pF + m_maincpu->k().set(FUNC(ginv2000_state::read_k)); + m_maincpu->r().set(FUNC(ginv2000_state::write_r)); + m_maincpu->o().set(FUNC(ginv2000_state::write_o)); + + TMS1024(config, m_expander).set_ms(1); // MS tied high + m_expander->write_port4_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port5_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port6_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port7_callback().set(FUNC(ginv2000_state::expander_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(364, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +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, "screen", 0) + ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken FX-Micom R-165 + * TMS1100 MCU, label MP1312 (die label MP1312A) + * 1 7seg led, 6 other leds, 1-bit sound + + This is a simple educational home computer. Refer to the extensive manual + for more information. It was published later in the USA by Tandy(Radio Shack), + under their Science Fair series. Another 25 years later, Gakken re-released + the R-165 as GMC-4, obviously on modern hardware, but fully compatible. + + known releases: + - Japan: FX-Micom R-165, published by Gakken + - USA: Science Fair Microcomputer Trainer, published by Tandy. Of note is + the complete redesign of the case, adding more adjustable wiring + +***************************************************************************/ + +class fxmcr165_state : public hh_tms1k_state +{ +public: + fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void fxmcr165(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void fxmcr165_state::update_display() +{ + // 7seg digit from O0-O6 + m_display->write_row(0, bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f); + + // leds from R4-R10 + m_display->write_row(1, m_r >> 4 & 0x7f); +} + +void fxmcr165_state::write_r(u16 data) +{ + // R0-R3: input mux low + m_inp_mux = (m_inp_mux & 0x10) | (data & 0xf); + + // R7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // R4-R10: led data (direct) + m_r = data; + update_display(); +} + +void fxmcr165_state::write_o(u16 data) +{ + // O7: input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); + + // O0-O6: digit segments (direct) + m_o = data; + update_display(); +} + +u8 fxmcr165_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + [C] [D] [E] [F] [ADR SET] + [8] [9] [A] [B] [INCR] + [4] [5] [6] [7] [RUN] + [0] [1] [2] [3] [RESET] +*/ + +static INPUT_PORTS_START( fxmcr165 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") + + PORT_START("IN.4") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Reset") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Run") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Increment") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Address Set") +INPUT_PORTS_END + +void fxmcr165_state::fxmcr165(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->k().set(FUNC(fxmcr165_state::read_k)); + m_maincpu->r().set(FUNC(fxmcr165_state::write_r)); + m_maincpu->o().set(FUNC(fxmcr165_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1+1, 7); + m_display->set_segmask(1, 0x7f); + config.set_default_layout(layout_fxmcr165); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( fxmcr165 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Electronic Detective + * TMS0980NLL MP6100A (die label 0980B-00) + * 10-digit 7seg LED display, 2-level sound + + hardware (and concept) is very similar to Parker Brothers Stop Thief + + This is an electronic board game. It requires game cards with suspect info, + and good old pen and paper to record game progress. To start the game, enter + difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the + manual for more information. + +***************************************************************************/ + +class elecdet_state : public hh_tms1k_state +{ +public: + elecdet_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void elecdet(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void elecdet_state::write_r(u16 data) +{ + // R7,R8: speaker out + m_speaker->level_w((m_o & 0x80) ? (data >> 7 & 3) : 0); + + // R0-R6: select digit + m_display->matrix(data, bitswap<8>(m_o,7,5,2,1,4,0,6,3)); +} + +void elecdet_state::write_o(u16 data) +{ + // O0,O1,O4,O6: input mux + m_inp_mux = (data & 3) | (data >> 2 & 4) | (data >> 3 & 8); + + // O0-O6: digit segments A-G + // O7: speaker on -> write_r + m_o = data; +} + +u8 elecdet_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[4]->read() | read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + [1] [2] [3] [SUSPECT] + [4] [5] [6] [PRIVATE QUESTION] + [7] [8] [9] [I ACCUSE] + [0] [ENTER] + [ON] [OFF] [END TURN] +*/ + +static INPUT_PORTS_START( elecdet ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.3") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.4") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void elecdet_state::elecdet(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 425000); // approximation + m_maincpu->k().set(FUNC(elecdet_state::read_k)); + m_maincpu->r().set(FUNC(elecdet_state::write_r)); + m_maincpu->o().set(FUNC(elecdet_state::write_o)); + m_maincpu->power_off().set(FUNC(elecdet_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x7f, 0x7f); + config.set_default_layout(layout_elecdet); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 0.5, 0.5, 1.0}; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( elecdet ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + Kenner Star Wars - Electronic Battle Command + * TMS1100 MCU, label MP3438A (die label 1100B, MP3438A) + * 4x4 LED grid display + 2 separate LEDs and 2-digit 7segs, 1-bit sound + + This is a small tabletop space-dogfighting game. To start the game, + press BASIC/INTER/ADV and enter P#(number of players), then + START TURN. Refer to the official manual for more information. + +***************************************************************************/ + +class starwbc_state : public hh_tms1k_state +{ +public: + starwbc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void starwbc(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void starwbc_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void starwbc_state::write_r(u16 data) +{ + // R0,R1,R3,R5,R7: input mux + m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10); + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0,R2,R4: led select + // R6,R8: digit select + m_r = data & 0x155; + update_display(); +} + +void starwbc_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = (data << 4 & 0xf0) | (data >> 4 & 0x0f); + update_display(); +} + +u8 starwbc_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + (reconnnaissance=yellow) (tactical reaction=green) + [MAGNA] [ENEMY] [EM] [BS] [SCR] + + [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE] + [ADV] [P#] [<] [^] [>] [v] + (game=blue) (maneuvers=red) +*/ + +static INPUT_PORTS_START( starwbc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn") + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up") + + PORT_START("IN.3") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") +INPUT_PORTS_END + +void starwbc_state::starwbc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=51K, C=47pF + m_maincpu->k().set(FUNC(starwbc_state::read_k)); + m_maincpu->r().set(FUNC(starwbc_state::write_r)); + m_maincpu->o().set(FUNC(starwbc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x140, 0x7f); + config.set_default_layout(layout_starwbc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( starwbc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) +ROM_END + +ROM_START( starwbcp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) +ROM_END + + + + + +/*************************************************************************** + + Kenner Live Action Football + * TMS1100NLL MCU, label MP3489-N2 (die label 1100E, MP3489) + * 6-digit 7seg LED display, other LEDs under overlay, 1-bit sound + + The LEDs are inside reflective domes, with an overlay mask on top of that. + It is done with an SVG screen on MAME. In reality, the display is not as + sharp or as evenly lit as MAME suggests it to be. + + It has a 1-bit roller controller. Half of the axis connects to the input + (eg. 1 rising edge per full rotation), so there's no difference between + rotating left or right. + +***************************************************************************/ + +class liveafb_state : public hh_tms1k_state +{ +public: + liveafb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void liveafb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void liveafb_state::update_display() +{ + u8 d = (~m_r & 0x100) ? (m_r & 0x3f) : 0; // digit select + u8 l = (m_r & 0x100) ? (m_r & 0xf) : 0; // led select + m_display->matrix(d | l << 6 | BIT(m_r, 6) << 10 | BIT(m_r, 8, 3) << 11, m_o | (m_r << 4 & 0x300)); +} + +void liveafb_state::write_r(u16 data) +{ + // R0-R3: input mux + m_inp_mux = data & 0xf; + + // R7(+R8): speaker out + m_speaker->level_w(BIT(data, 7) & BIT(data, 8)); + + // R8: enable digit or led select + // R0-R3: led select + // R0-R5: digit select + // R4,R5: led data high + // R6,R8-R10: direct leds + m_r = data & ~0x80; + update_display(); +} + +void liveafb_state::write_o(u16 data) +{ + // O0-O7: led data low + m_o = data; + update_display(); +} + +u8 liveafb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( liveafb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("ROLLER", 0x7f, LESSTHAN, 0x40) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Tackle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punt") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Field Goal") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Skill / Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Action") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("ROLLER") + PORT_BIT( 0x7f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) +INPUT_PORTS_END + +void liveafb_state::liveafb(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(liveafb_state::read_k)); + m_maincpu->r().set(FUNC(liveafb_state::write_r)); + m_maincpu->o().set(FUNC(liveafb_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1834, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6+4+4, 8+2); + m_display->set_segmask(0x3f, 0x7f); + m_display->set_segmask(0x20, 0xff); // only one digit has DP + config.set_default_layout(layout_liveafb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( liveafb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3489", 0x0000, 0x0800, CRC(1fe05ab3) SHA1(a8d7dfed61a6397b7af1d3fcf17b26d5d917b4f0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_liveafb_output.pla", 0, 365, CRC(a7bc9384) SHA1(fab458de394eeddbf5ba0830853a915e51f909c6) ) + + ROM_REGION( 162058, "mask", 0) + ROM_LOAD( "liveafb.svg", 0, 162058, CRC(046078d0) SHA1(68a5775f4f9a1258c06b76839e1cfdab69b61920) ) +ROM_END + + + + + +/*************************************************************************** + + Kosmos Astro + * TMS1470NLHL MP1133 (die label TMS1400 MP1133) + * 9-digit 7seg VFD display + 8 LEDs(4 green, 4 yellow), no sound + + This is an astrological calculator, and also supports 4-function + calculations. Refer to the official manual on how to use this device. + +***************************************************************************/ + +class astro_state : public hh_tms1k_state +{ +public: + astro_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void astro(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void astro_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void astro_state::write_r(u16 data) +{ + // R0-R7: input mux + m_inp_mux = data & 0xff; + + // R0-R9: led select + m_r = data; + update_display(); +} + +void astro_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 astro_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +static INPUT_PORTS_START( astro ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE"/Sun") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY"/Mercury") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-/Venus") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+/Mars") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=/Astro") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("B1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("B2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, "Mode" ) + PORT_CONFSETTING( 0x00, "Calculator" ) + PORT_CONFSETTING( 0x08, "Astro" ) +INPUT_PORTS_END + +void astro_state::astro(machine_config &config) +{ + // basic machine hardware + TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=4.7K, C=33pF + m_maincpu->k().set(FUNC(astro_state::read_k)); + m_maincpu->r().set(FUNC(astro_state::write_r)); + m_maincpu->o().set(FUNC(astro_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3ff, 0xff); + config.set_default_layout(layout_astro); + + // no sound! +} + +// roms + +ROM_START( astro ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) ) +ROM_END + + + + + +/*************************************************************************** + + Marx Series 300 Electronic Bowling Game + * TMS1100NLL MP3403 DBS 7836 SINGAPORE (no decap) + * 4*SN75492 quad segment driver, 2*SN74259 8-line demultiplexer, + 2*CD4043 quad r/s input latch + * 5 7seg LEDs, 15 lamps(10 lamps projected to bowling pins reflection), + 1bit-sound with crude volume control + * edge connector to sensors(switches trigger when ball rolls over) + and other inputs + + lamp translation table: SN74259.u5(mux 1) goes to MAME output 5.x, + SN74259.u6(mux 2) goes to MAME output 6.*. u1-u3 are SN75492 ICs, + where other: u1 A2 is N/C, u3 A1 is from O2 and goes to digits seg C. + + u5 Q0 -> u1 A4 -> L2 (pin #2) u6 Q0 -> u3 A4 -> L1 (pin #1) + u5 Q1 -> u1 A5 -> L4 (pin #4) u6 Q1 -> u3 A5 -> L5 (pin #5) + u5 Q2 -> u1 A6 -> L7 (pin #7) u6 Q2 -> u2 A3 -> L11 (player 1) + u5 Q3 -> u1 A1 -> L8 (pin #8) u6 Q3 -> u2 A2 -> L12 (player 2) + u5 Q4 -> u3 A2 -> L3 (pin #3) u6 Q4 -> u2 A1 -> L15 (?) + u5 Q5 -> u2 A6 -> L6 (pin #6) u6 Q5 -> u3 A6 -> L14 (?) + u5 Q6 -> u2 A5 -> L10 (pin #10) u6 Q6 -> u1 A3 -> L13 (spare) + u5 Q7 -> u2 A4 -> L9 (pin #9) u6 Q7 -> u3 A3 -> digit 4 B+C + +***************************************************************************/ + +class elecbowl_state : public hh_tms1k_state +{ +public: + elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void elecbowl(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void elecbowl_state::update_display() +{ + // standard 7segs + m_display->matrix_partial(0, 4, m_r >> 4, m_o); + + // lamp muxes + u8 sel = m_o & 7; + u8 state = m_r >> 1 & 1; + if (~m_r & 1) + m_display->write_element(5, sel, state); + if (~m_r & 4) + m_display->write_element(6, sel, state); + + // digit 4 is from mux2 Q7 + m_display->write_row(4, m_display->read_element(6, 7) ? 6 : 0); +} + +void elecbowl_state::write_r(u16 data) +{ + // R5-R7,R10: input mux + m_inp_mux = (data >> 5 & 7) | (data >> 7 & 8); + + // R9: speaker out + // R3,R8: speaker volume.. + m_speaker->level_w(data >> 9 & 1); + + // R4-R7: select digit + // R0,R2: lamp mux1,2 _enable + // R1: lamp muxes state + m_r = data; + update_display(); +} + +void elecbowl_state::write_o(u16 data) +{ + //if (data & 0x80) printf("%X ",data&0x7f); + + // O0-O2: lamp muxes select + // O0-O6: digit segments A-G + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 elecbowl_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( elecbowl ) + PORT_START("IN.0") // R5 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) + + PORT_START("IN.1") // R6 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // reset/test? + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // reset/test? + + PORT_START("IN.2") // R7 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.3") // R10 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw? +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 elecbowl_output_pla[0x20] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9 + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // ? + 0, 1, 2, 3, 4, 5, 6, 7, // lamp muxes select + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f // ? +}; + +void elecbowl_state::elecbowl(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->set_output_pla(elecbowl_output_pla); + m_maincpu->k().set(FUNC(elecbowl_state::read_k)); + m_maincpu->r().set(FUNC(elecbowl_state::write_r)); + m_maincpu->o().set(FUNC(elecbowl_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 8); + m_display->set_segmask(0xf, 0x7f); + m_display->set_segmask(0x10, 0x06); // 1 + config.set_default_layout(layout_elecbowl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( elecbowl ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Thoroughbred Horse Race Analyzer + * PCB label 1670-4619D + * TMS1100NLL MP3491-N2 (die label 1100E MP3491) + * HLCD0569, 67-segment LCD panel, no sound + + This handheld is not a toy, read the manual for more information. In short, + it is a device for predicting the winning chance of a gambling horserace. + + It was rereleased in 1994 in China/Canada by AHTI(Advanced Handicapping + Technologies, Inc.), on a Hitachi HD613901. + +***************************************************************************/ + +class horseran_state : public hh_tms1k_state +{ +public: + horseran_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_lcd(*this, "lcd") + { } + + void horseran(machine_config &config); + +private: + required_device m_lcd; + + void lcd_output_w(offs_t offset, u32 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void horseran_state::lcd_output_w(offs_t offset, u32 data) +{ + // only 3 rows used + if (offset > 2) + return; + + // update lcd segments + m_display->matrix_partial(0, 3, 1 << offset, data); + + // col5-11 and col13-19 are 7segs + for (int i = 0; i < 2; i++) + m_display->write_row(3 + (offset << 1 | i), bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f); +} + +void horseran_state::write_r(u16 data) +{ + // R0: HLCD0569 clock + // R1: HLCD0569 data in + // R2: HLCD0569 _CS + m_lcd->cs_w(data >> 2 & 1); + m_lcd->data_w(data >> 1 & 1); + m_lcd->clock_w(data & 1); + + // R3-R10: input mux + m_inp_mux = data >> 3 & 0xff; +} + +u8 horseran_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +/* physical button layout and labels are like this: + + [PURSE] [DIST.] [P. POSN.] [DAYS] [R.S.L.] [7] [8] [9] + [RACES] [WINS] [PLACES] [SHOWS] [EARNINGS] [4] [5] [6] + [DISTANCE] [L.E.B. 1st] [L.E.B. 2nd] [L.E.B. 3rd] [FIN. POSN.] [1] [2] [3] + [L.E.B. Fin] [SPD. RTG.] [SPD. RTG.] [ANALYZE] [NEXT] [C/H] [C/E] [0] + + R.S.L. = Races Since (Last) Layoff + L.E.B. = Last Race / Lengths Back +*/ + +static INPUT_PORTS_START( horseran ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Next") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Final Position") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Earnings") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("R.S.L.") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Analyze") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("L.E.B. 3rd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Shows") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Days") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Speed Rating (right)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("L.E.B. 2nd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Places") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Post Position") + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Speed Rating (left)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("L.E.B. 1st") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wins") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Distance (L.E.B.)") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("L.E.B. Finish") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Distance") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Races") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Purse") + + PORT_START("IN.5") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.6") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("C/E") // Clear Entry + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.7") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("C/H") // Clear Horse Information + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") +INPUT_PORTS_END + +void horseran_state::horseran(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF + m_maincpu->k().set(FUNC(horseran_state::read_k)); + m_maincpu->r().set(FUNC(horseran_state::write_r)); + + // video hardware + HLCD0569(config, m_lcd, 1100); // C=0.022uF + m_lcd->write_cols().set(FUNC(horseran_state::lcd_output_w)); + + PWM_DISPLAY(config, m_display).set_size(3+6, 24); + m_display->set_segmask(0x3f<<3, 0x7f); + config.set_default_layout(layout_horseran); + + // no sound! +} + +// roms + +ROM_START( horseran ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Dungeons & Dragons - Computer Labyrinth Game + * TMS1100 M34012-N2LL (die label M34012) + * 72 buttons, no LEDs, 1-bit sound + + This is an electronic board game. It requires markers and wall pieces to play. + Refer to the official manual for more information. + +***************************************************************************/ + +class mdndclab_state : public hh_tms1k_state +{ +public: + mdndclab_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void mdndclab(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void mdndclab_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: input mux part + m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x3ff00); +} + +void mdndclab_state::write_o(u16 data) +{ + // O0-O7: input mux part + m_inp_mux = (m_inp_mux & ~0xff) | data; +} + +u8 mdndclab_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(18); +} + +// config + +static INPUT_PORTS_START( mdndclab ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.6") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.7") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.8") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Wall / Door") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Illegal Move / Warrior Moves") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Warrior 1 / Winner") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Warrior 2 / Treasure") + + PORT_START("IN.9") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.10") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.11") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.12") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.13") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.14") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.15") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.16") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.17") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Switch Key") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Next Turn / Level 1/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Dragon Flying / Defeat Tune") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Dragon Attacks / Dragon Wakes") +INPUT_PORTS_END + +void mdndclab_state::mdndclab(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 475000); // approximation - RC osc. R=27K, C=100pF + m_maincpu->k().set(FUNC(mdndclab_state::read_k)); + m_maincpu->r().set(FUNC(mdndclab_state::write_r)); + m_maincpu->o().set(FUNC(mdndclab_state::write_o)); + + config.set_default_layout(layout_mdndclab); // playing board + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mdndclab ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Comp IV + * TMC0904NL CP0904A (die label 4A0970D-04A) + * 10 LEDs behind bezel, no sound + + This is small tabletop Mastermind game; a code-breaking game where the player + needs to find out the correct sequence of colours (numbers in our case). + Press the R key to start, followed by a set of unique numbers and E. + Refer to the official manual for more information. + + known releases: + - USA: Comp IV (two versions, different case), published by MB + - Europe: Logic 5, published by MB + - Japan: Pythaligoras, published by Takara + +***************************************************************************/ + +class comp4_state : public hh_tms1k_state +{ +public: + comp4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void comp4(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void comp4_state::write_r(u16 data) +{ + // leds: + // R4 R9 + // R10! R8 + // R2 R7 + // R1 R6 + // R0 R5 + m_display->matrix(m_o, data); +} + +void comp4_state::write_o(u16 data) +{ + // O1-O3: input mux + m_inp_mux = data >> 1 & 7; + + // O0: leds common + // other bits: N/C + m_o = data; +} + +u8 comp4_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( comp4 ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("R") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("E") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") +INPUT_PORTS_END + +void comp4_state::comp4(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(comp4_state::read_k)); + m_maincpu->r().set(FUNC(comp4_state::write_r)); + m_maincpu->o().set(FUNC(comp4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_comp4); + + // no sound! +} + +// roms + +ROM_START( comp4 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1977 version, model 4750A) + * PCB label 4750A + * TMS1000NL MP3201 (die label 1000C, MP3201) + * LM324N, MC14016CP/TP4016AN, NE555P, discrete sound + * 4 sliding buttons, light bulb + + This is a 2-player electronic board game. It still needs game pieces like the + original Battleship board game. + + It went through at least 5 hardware revisions (not counting Talking Battleship): + 1977: model 4750A, TMS1000 discrete sound, see notes above + 1977: model 4750B, TMS1000 SN76477 sound, see notes at bshipb (driver below this) + 1979: model 4750C: cost-reduced single-chip design, lesser quality game board. + The chip is assumed to be custom, no MCU: 28-pin DIP, label 4750, SCUS 0462 + 1982: similar custom single-chip hardware, chip label MB4750 SCUS 0562 + 1982: back to MCU, COP420 instead of choosing TI, emulated in hh_cop400.cpp + +***************************************************************************/ + +class bship_state : public hh_tms1k_state +{ +public: + bship_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void bship(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bship_state::write_r(u16 data) +{ + // R0-R10: input mux + m_inp_mux = data; +} + +void bship_state::write_o(u16 data) +{ + // O4: explosion light bulb + m_display->matrix(1, data >> 4 & 1); + + // other: sound +} + +u8 bship_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[11]->read() | read_inputs(11); +} + +// config + +static INPUT_PORTS_START( bship ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 A") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 B") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 C") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 D") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 E") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 F") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 G") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 H") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 I") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 J") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch + + PORT_START("IN.11") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") +INPUT_PORTS_END + +void bship_state::bship(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set(FUNC(bship_state::read_k)); + m_maincpu->r().set(FUNC(bship_state::write_r)); + m_maincpu->o().set(FUNC(bship_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship); + + // sound hardware + // TODO +} + +// roms + +ROM_START( bship ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1977 version, model 4750B) + * PCB label MB 4750B + * TMS1000NLL MP3208 (die label 1000C, MP3208) + * SN75494N (acting as inverters), SN76477 sound + * 4 sliding buttons, light bulb + + This is the 2nd version. The sound hardware was changed to a SN76477. + +***************************************************************************/ + +class bshipb_state : public hh_tms1k_state +{ +public: + bshipb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_sn(*this, "sn76477") + { } + + void bshipb(machine_config &config); + +private: + required_device m_sn; + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bshipb_state::write_r(u16 data) +{ + // R0-R10: input mux + m_inp_mux = data; + + // R4: 75494 to R12 33K to SN76477 pin 20 + m_sn->slf_res_w((data & 0x10) ? RES_INF : RES_K(33)); +} + +void bshipb_state::write_o(u16 data) +{ + //printf("%X ", m_maincpu->debug_peek_o_index() & 0xf); + + // O0: SN76477 pin 9 + m_sn->enable_w(data & 1); + + // O1: 75494 to R4 100K to SN76477 pin 18 + // O2: 75494 to R3 150K to SN76477 pin 18 + double o12 = RES_INF; + switch (~data >> 1 & 3) + { + case 0: o12 = RES_INF; break; + case 1: o12 = RES_K(100); break; + case 2: o12 = RES_K(150); break; + case 3: o12 = RES_2_PARALLEL(RES_K(100), RES_K(150)); break; + } + m_sn->vco_res_w(o12); + + // O2,O6: (TODO) to SN76477 pin 21 + //m_sn->slf_cap_w(x); + + // O4: SN76477 pin 22 + m_sn->vco_w(data >> 4 & 1); + + // O5: R11 27K to SN76477 pin 23 + m_sn->one_shot_cap_w((data & 0x20) ? RES_K(27) : 0); + + // O6: SN76477 pin 25 + m_sn->mixer_b_w(data >> 6 & 1); + + // O7: 75494 to light bulb + m_display->matrix(1, data >> 7 & 1); +} + +u8 bshipb_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[11]->read() | read_inputs(11); +} + +// config + +// buttons are same as bship set + +void bshipb_state::bshipb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set(FUNC(bshipb_state::read_k)); + m_maincpu->r().set(FUNC(bshipb_state::write_r)); + m_maincpu->o().set(FUNC(bshipb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SN76477(config, m_sn); + m_sn->set_noise_params(RES_K(47), RES_K(100), CAP_P(47)); // R18, R17, C8 + m_sn->set_decay_res(RES_M(3.3)); // R16 + m_sn->set_attack_params(CAP_U(0.47), RES_K(15)); // C7, R20 + m_sn->set_amp_res(RES_K(100)); // R19 + m_sn->set_feedback_res(RES_K(39)); // R7 + m_sn->set_vco_params(5.0 * RES_VOLTAGE_DIVIDER(RES_K(47), RES_K(33)), CAP_U(0.01), RES_K(270)); // R15/R14, C5, switchable R5/R3/R4 + m_sn->set_pitch_voltage(5.0); + m_sn->set_slf_params(CAP_U(22), RES_K(750)); // switchable C4, switchable R13/R12 + m_sn->set_oneshot_params(0, RES_INF); // NC, switchable R11 + m_sn->set_vco_mode(0); // switchable + m_sn->set_mixer_params(0, 0, 0); // switchable, GND, GND + m_sn->set_envelope_params(1, 0); // Vreg, GND + m_sn->set_enable(0); // switchable + m_sn->add_route(ALL_OUTPUTS, "mono", 0.35); +} + +// roms + +ROM_START( bshipb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Simon (model 4850), created by Ralph Baer + * TMS1000 (die label MP3226), or MP3300 (die label 1000C, MP3300) + * DS75494 Hex digit LED driver, 4 big lamps, 1-bit sound + + known revisions: + - 1978: Rev A: TMS1000(no label) + - 198?: Rev B: MB4850 SCUS0640(16-pin custom ASIC), PCB label REV.B, + cost-reduced, same hardware as Pocket Simon + - 1979: Rev F: TMS1000(MP3300), PCB label 4850 Rev F + + The semi-sequel Super Simon uses a TMS1100 (see next minidriver). + +***************************************************************************/ + +class simon_state : public hh_tms1k_state +{ +public: + simon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void simon(machine_config &config); + +private: + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void simon_state::write_r(u16 data) +{ + // R4-R8 go through an 75494 IC first: + // R4 -> 75494 IN6 -> green lamp + // R5 -> 75494 IN3 -> red lamp + // R6 -> 75494 IN5 -> yellow lamp + // R7 -> 75494 IN2 -> blue lamp + m_display->matrix(1, data >> 4); + + // R8 -> 75494 IN0 -> speaker out + m_speaker->level_w(data >> 8 & 1); + + // R0-R2,R9: input mux + // R3: GND + // other bits: N/C + m_inp_mux = (data & 7) | (data >> 6 & 8); +} + +u8 simon_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( simon ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x07, 0x02, "Game Select") + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Green Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Blue Button") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R9 + PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x01, "4" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x07) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x07) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) +INPUT_PORTS_END + +void simon_state::simon(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(simon_state::read_k)); + m_maincpu->r().set(FUNC(simon_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_simon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( simon ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) +ROM_END + +ROM_START( simonf ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Super Simon + * TMS1100 MP3476NLL (die label MP3476) + * 8 big lamps(2 turn on at same time), 1-bit sound + + The semi-squel to Simon, not as popular. It includes more game variations + and a 2-player head-to-head mode. + +***************************************************************************/ + +class ssimon_state : public hh_tms1k_state +{ +public: + ssimon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ssimon(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void write_r(u16 data); + u8 read_k(); +}; + +void ssimon_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void ssimon_state::set_clock() +{ + // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch: + // 0 Simple: R=51K -> ~200kHz + // 1 Normal: R=37K -> ~275kHz + // 2 Super: R=22K -> ~400kHz + u8 inp = m_inputs[6]->read(); + m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000)); +} + +void ssimon_state::write_r(u16 data) +{ + // R0-R3,R9,R10: input mux + m_inp_mux = (data & 0xf) | (data >> 5 & 0x30); + + // R4: yellow lamps + // R5: green lamps + // R6: blue lamps + // R7: red lamps + m_display->matrix(1, data >> 4); + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); +} + +u8 ssimon_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ssimon ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x0f, 0x01, "Game Select") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x00, "5" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Green Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Blue Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Red Button") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Decision") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Green Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Blue Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Red Button") + + PORT_START("IN.4") // R9 + PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Head-to-Head" ) // this sets R10 K2, see below + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x01, "4" ) + + PORT_START("IN.5") // R10 + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.4", 0x0f, EQUALS, 0x00) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // fake + PORT_CONFNAME( 0x03, 0x01, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ssimon_state, speed_switch, 0) + PORT_CONFSETTING( 0x00, "Simple" ) + PORT_CONFSETTING( 0x01, "Normal" ) + PORT_CONFSETTING( 0x02, "Super" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x0f) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x0f) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<4>, 0x0f) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<4>, 0x0f) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<6>, 0x03) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03) +INPUT_PORTS_END + +void ssimon_state::ssimon(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 275000); // see set_clock + m_maincpu->k().set(FUNC(ssimon_state::read_k)); + m_maincpu->r().set(FUNC(ssimon_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ssimon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssimon ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Big Trak + * TMS1000NLL MP3301A or MP3301ANLL E (rev. E!) (die label 1000E MP3301) + * SN75494N Hex digit LED driver, 1 lamp, 3-level sound + * gearbox with magnetic clutch, 1 IR led+sensor, 2 motors(middle wheels) + * 24-button keypad, ext in/out ports + + Big Trak is a programmable toy car, up to 16 steps. Supported commands include + driving and turning, firing a photon cannon(hey, have some imagination!), + and I/O ports. The output port was used for powering the dump truck accessory. + + The In command was canceled midst production, it is basically a nop. Newer + releases and the European version removed the button completely. + +***************************************************************************/ + +class bigtrak_state : public hh_tms1k_state +{ +public: + bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_left_motor_forward(*this, "left_motor_forward"), + m_left_motor_reverse(*this, "left_motor_reverse"), + m_right_motor_forward(*this, "right_motor_forward"), + m_right_motor_reverse(*this, "right_motor_reverse"), + m_ext_out(*this, "ext_out") + { } + + void bigtrak(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + int m_gearbox_pos = 0; + bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } + TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); + + output_finder<> m_left_motor_forward; + output_finder<> m_left_motor_reverse; + output_finder<> m_right_motor_forward; + output_finder<> m_right_motor_reverse; + output_finder<> m_ext_out; +}; + +void bigtrak_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // resolve handlers + m_left_motor_forward.resolve(); + m_left_motor_reverse.resolve(); + m_right_motor_forward.resolve(); + m_right_motor_reverse.resolve(); + m_ext_out.resolve(); + + // register for savestates + save_item(NAME(m_gearbox_pos)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(bigtrak_state::gearbox_sim_tick) +{ + // the last gear in the gearbox has 12 evenly spaced holes, it is located + // between an IR emitter and receiver + static const int speed = 17; + if (m_gearbox_pos >= speed) + m_gearbox_pos = -speed; + + if (m_o & 0x1e) + m_gearbox_pos++; +} + +void bigtrak_state::write_r(u16 data) +{ + // R0-R5,R8: input mux (keypad, ext in enable) + m_inp_mux = (data & 0x3f) | (data >> 2 & 0x40); + + // R6: N/C + // R7: IR led on + // R9: lamp on + m_display->matrix(1, (data >> 7 & 1) | (data >> 8 & 2)); + + // (O0,O7,)R10(tied together): speaker out + m_speaker->level_w((m_o & 1) | (m_o >> 6 & 2) | (data >> 8 & 4)); + m_r = data; +} + +void bigtrak_state::write_o(u16 data) +{ + // O1: left motor forward + // O2: left motor reverse + // O3: right motor reverse + // O4: right motor reverse + // O5: ext out + // O6: N/C + m_left_motor_forward = data >> 1 & 1; + m_left_motor_reverse = data >> 2 & 1; + m_right_motor_forward = data >> 3 & 1; + m_right_motor_reverse = data >> 4 & 1; + m_ext_out = data >> 5 & 1; + + // O0,O7(,R10)(tied together): speaker out + m_speaker->level_w((data & 1) | (data >> 6 & 2) | (m_r >> 8 & 4)); + m_o = data; +} + +u8 bigtrak_state::read_k() +{ + // K: multiplexed inputs + // K8: IR sensor + return read_inputs(7) | (sensor_state() ? 8 : 0); +} + +// config + +/* physical button layout and labels are like this: + + USA version: UK version: + + [^] [CLR] [^] [CM] + [<] [HOLD] [>] [FIRE] [<] [P] [>] [\|/] + [v] [CLS] [v] [CE] + [7] [8] [9] [RPT] [7] [8] [9] [x2] + [4] [5] [6] [TEST] [4] [5] [6] [TEST] + [1] [2] [3] [CK] [1] [2] [3] [checkmark] + [IN] [0] [OUT] [GO] [0] [OUT] [GO] +*/ + +static INPUT_PORTS_START( bigtrak ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hold") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear Memory") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Backward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Last Step") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Test") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Check") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("In") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Out") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.6") // R8 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("Input Port") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bigtrak_state::bigtrak(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=83K, C=100pF + m_maincpu->k().set(FUNC(bigtrak_state::read_k)); + m_maincpu->r().set(FUNC(bigtrak_state::write_r)); + m_maincpu->o().set(FUNC(bigtrak_state::write_o)); + + TIMER(config, "gearbox").configure_periodic(FUNC(bigtrak_state::gearbox_sim_tick), attotime::from_msec(1)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 2); + config.set_default_layout(layout_bigtrak); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bigtrak ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Dark Tower + * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label MP7332) + (assume same ROM contents between revisions) + * SN75494N MOS-to-LED digit driver + * motorized rotating reel + lightsensor, 1bit-sound + + This is a board game, it obviously requires game pieces and the board. + The emulated part is the centerpiece, a black tower with a rotating card + panel and LED digits for displaying health, amount of gold, etc. As far + as MAME is concerned, the game works fine. + + To start up the game, first press [MOVE], the machine now does a self-test. + Then select level and number of players and the game will start. Read the + official manual on how to play the game. + +***************************************************************************/ + +class mbdtower_state : public hh_tms1k_state +{ +public: + mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_motor_pos_out(*this, "motor_pos"), + m_card_pos_out(*this, "card_pos"), + m_motor_on_out(*this, "motor_on") + { } + + void mbdtower(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void update_display(); + bool sensor_led_on() { return m_display->element_on(0, 0); } + + output_finder<> m_motor_pos_out; + output_finder<> m_card_pos_out; + output_finder<> m_motor_on_out; + + int m_motor_pos = 0; + int m_motor_pos_prev = -1; + int m_motor_decay = 0; + bool m_motor_on = false; + bool m_sensor_blind = false; + + TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void mbdtower_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + m_motor_pos_out.resolve(); + m_card_pos_out.resolve(); + m_motor_on_out.resolve(); + + // register for savestates + save_item(NAME(m_motor_pos)); + /* save_item(NAME(m_motor_pos_prev)); */ // don't save! + save_item(NAME(m_motor_decay)); + save_item(NAME(m_motor_on)); + save_item(NAME(m_sensor_blind)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) +{ + // it rotates counter-clockwise (when viewed from above) + if (m_motor_on) + { + m_motor_pos = (m_motor_pos - 1) & 0x7f; + + // give it some time to spin out when it's turned off + if (m_r & 0x200) + m_motor_decay += (m_motor_decay < 4); + else if (m_motor_decay > 0) + m_motor_decay--; + else + m_motor_on = false; + } + + // 8 evenly spaced holes in the rotation disc for the sensor to 'see' through. + // The first hole is much bigger, enabling the game to determine the position. + if ((m_motor_pos & 0xf) < 4 || m_motor_pos < 0xc) + m_sensor_blind = false; + else + m_sensor_blind = true; + + // on change, output info + if (m_motor_pos != m_motor_pos_prev) + m_motor_pos_out = 100 * (m_motor_pos / (float)0x80); + + /* 3 display cards per hole, like this: + + (0) <---- display increments this way <---- (7) + + CURSED VICTORY WIZARD DRAGON GOLD KEY SCOUT WARRIOR (void) + LOST WARRIORS BAZAAR CLOSED SWORD SILVER KEY HEALER FOOD (void) + PLAGUE BRIGANDS KEY MISSING PEGASUS BRASS KEY GOLD BEAST (void) + */ + int card_pos = m_motor_pos >> 4 & 7; + if (card_pos != (m_motor_pos_prev >> 4 & 7)) + m_card_pos_out = card_pos; + + m_motor_pos_prev = m_motor_pos; +} + +void mbdtower_state::update_display() +{ + // update current state + if (~m_r & 0x10) + { + u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; + m_display->write_row(2, (m_o & 0x80) ? o : 0); + m_display->write_row(1, (m_o & 0x80) ? 0 : o); + m_display->write_row(0, (m_r >> 8 & 1) | (m_r >> 4 & 0xe)); + } + else + { + // display items turned off + m_display->clear(); + } +} + +void mbdtower_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R9: motor on + if ((m_r ^ data) & 0x200) + m_motor_on_out = data >> 9 & 1; + if (data & 0x200) + m_motor_on = true; + + // R3: N/C + // R4: 75494 /EN (speaker, lamps, digit select go through that IC) + // R5-R7: tower lamps + // R8: rotation sensor led + m_r = data; + update_display(); + + // R10: speaker out + m_speaker->level_w(~data >> 4 & data >> 10 & 1); +} + +void mbdtower_state::write_o(u16 data) +{ + // O0-O6: led segments A-G + // O7: digit select + m_o = data; + update_display(); +} + +u8 mbdtower_state::read_k() +{ + // K: multiplexed inputs + // K8: rotation sensor + return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0); +} + +// config + +/* physical button layout and labels are like this: + + (green) (l.blue) (red) + [YES/ [REPEAT] [NO/ + BUY] END] + + (yellow) (blue) (white) + [HAGGLE] [BAZAAR] [CLEAR] + + (blue) (blue) (blue) + [TOMB/ [MOVE] [SANCTUARY/ + RUIN] CITADEL] + + (orange) (blue) (d.yellow) + [DARK [FRONTIER] [INVENTORY] + TOWER] +*/ + +static INPUT_PORTS_START( mbdtower ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") +INPUT_PORTS_END + +void mbdtower_state::mbdtower(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=43K, C=56pF + m_maincpu->k().set(FUNC(mbdtower_state::read_k)); + m_maincpu->r().set(FUNC(mbdtower_state::write_r)); + m_maincpu->o().set(FUNC(mbdtower_state::write_o)); + + TIMER(config, "tower_motor").configure_periodic(FUNC(mbdtower_state::motor_sim_tick), attotime::from_msec(3500/0x80)); // ~3.5sec for a full rotation + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(6, 0x7f); + config.set_default_layout(layout_mbdtower); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mbdtower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Arcade Mania + * TMS1100 M34078A-N2LL (die label 1100G, M34078A) + * 9 LEDs, 3-bit sound + + This is a board game. The mini arcade machine is the emulated part here. + External artwork is needed for the game overlays. + +***************************************************************************/ + +class arcmania_state : public hh_tms1k_state +{ +public: + arcmania_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void arcmania(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void arcmania_state::write_r(u16 data) +{ + // R1-R9: leds + m_display->matrix(1, data >> 1); +} + +void arcmania_state::write_o(u16 data) +{ + // O0-O2(tied together): speaker out + m_speaker->level_w(data & 7); + + // O3,O4,O6: input mux + m_inp_mux = (data >> 3 & 3) | (data >> 4 & 4); + + // O5: power off when low (turn back on with button row 1) + if (~data & 0x20) + power_off(); +} + +u8 arcmania_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +/* physical button layout and labels are like this: + + (orange) (orange) (orange) + [1] [2] [3] + + (red) (yellow) (blue) + [RUN] [SNEAK + AMUK] ATTACK] + + (green) (yellow) (purple) + [Alien [Rattler] + Raiders] +*/ + +static INPUT_PORTS_START( arcmania ) + PORT_START("IN.0") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Alien Raiders") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Yellow Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Rattler") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Run Amuk") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Yellow Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Sneak Attack") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // O6 (also O5 to power) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void arcmania_state::arcmania(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=100pF + m_maincpu->k().set(FUNC(arcmania_state::read_k)); + m_maincpu->r().set(FUNC(arcmania_state::write_r)); + m_maincpu->o().set(FUNC(arcmania_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 9); + config.set_default_layout(layout_arcmania); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( arcmania ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Code Name: Sector, by Bob Doyle + * TMS0970 MCU, MP0905BNL ZA0379 (die label 0970F-05B) + * 6-digit 7seg LED display + 4 LEDs for compass, no sound + + This is a tabletop submarine pursuit game. A grid board and small toy + boats are used to remember your locations (a Paint app should be ok too). + Refer to the official manual for more information, it is not a simple game. + +***************************************************************************/ + +class cnsector_state : public hh_tms1k_state +{ +public: + cnsector_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnsector(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnsector_state::write_r(u16 data) +{ + // R0-R5: select digit + // R6-R9: direction leds + m_display->matrix(data, m_o); +} + +void cnsector_state::write_o(u16 data) +{ + // O0-O4: input mux + m_inp_mux = data & 0x1f; + + // O0-O7: digit segments + m_o = data; +} + +u8 cnsector_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + COMBAT INFORMATION CENTER + [NEXT SHIP] [RECALL] [MOVE SHIP] + + [LEFT] [RIGHT] o [SLOWER] [FASTER] + STEERING EVASIVE SUB SPEED o (on/off switch) + NAVIGATIONAL PROGRAMMING | + + [RANGE] [AIM] [FIRE] o [TEACH MODE] + SONAR CONTROL SUB FINDER +*/ + +static INPUT_PORTS_START( cnsector ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode") +INPUT_PORTS_END + +void cnsector_state::cnsector(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(cnsector_state::read_k)); + m_maincpu->r().set(FUNC(cnsector_state::write_r)); + m_maincpu->o().set(FUNC(cnsector_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3f, 0xff); + config.set_default_layout(layout_cnsector); + + // no sound! +} + +// roms + +ROM_START( cnsector ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Merlin handheld game, by Bob Doyle + * TMS1100NLL MP3404 or MP3404A-N2 + * 11 LEDs behind buttons, 3-level sound + + Also published in Japan by Tomy as "Dr. Smith", white case instead of red. + The one with dark-blue case is the rare sequel Master Merlin, see below. + More sequels followed too, but on other hardware. + + To start a game, press NEW GAME, followed by a number: + 1: Tic-Tac-Toe + 2: Music Machine + 3: Echo + 4: Blackjack 13 + 5: Magic Square + 6: Mindbender + + Refer to the official manual for more information on the games. + +***************************************************************************/ + +class merlin_state : public hh_tms1k_state +{ +public: + merlin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void merlin(machine_config &config); + +protected: + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void merlin_state::write_r(u16 data) +{ + /* leds: + + R0 + R1 R2 R3 + R4 R5 R6 + R7 R8 R9 + R10 + */ + m_display->matrix(1, data); +} + +void merlin_state::write_o(u16 data) +{ + // O4-O6(tied together): speaker out + m_speaker->level_w(data >> 4 & 7); + + // O0-O3: input mux + // O7: N/C + m_inp_mux = data & 0xf; +} + +u8 merlin_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( merlin ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Same Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game") +INPUT_PORTS_END + +void merlin_state::merlin(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(merlin_state::read_k)); + m_maincpu->r().set(FUNC(merlin_state::write_r)); + m_maincpu->o().set(FUNC(merlin_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_merlin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( merlin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3404a", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) +ROM_END + +ROM_START( merlina ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(9362d9f9) SHA1(266d2a4a98cc33944a4fc7ed073ba9321bba8e05) ) // 1 bit different + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Master Merlin + * TMS1400 MP7351-N2LL (die label 1400CR MP7351) + * 11 LEDs behind buttons, 3-level sound + + The TMS1400CR MCU has the same pinout as a standard TMS1100. The hardware + outside of the MCU is exactly the same as Merlin. + + The included minigames are: + 1: Three Shells + 2: Hi/Lo + 3: Match It + 4: Hit or Miss + 5: Pair Off + 6: Tempo + 7: Musical Ladder + 8: Patterns + 9: Hot Potato + +***************************************************************************/ + +class mmerlin_state : public merlin_state +{ +public: + mmerlin_state(const machine_config &mconfig, device_type type, const char *tag) : + merlin_state(mconfig, type, tag) + { } + + void mmerlin(machine_config &config); +}; + +// handlers: uses the ones in merlin_state + +// config + +static INPUT_PORTS_START( mmerlin ) + PORT_INCLUDE( merlin ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") // instead of Hit Me +INPUT_PORTS_END + +void mmerlin_state::mmerlin(machine_config &config) +{ + merlin(config); + + // basic machine hardware + TMS1400(config.replace(), m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF + m_maincpu->k().set(FUNC(mmerlin_state::read_k)); + m_maincpu->r().set(FUNC(mmerlin_state::write_r)); + m_maincpu->o().set(FUNC(mmerlin_state::write_o)); + + config.set_default_layout(layout_mmerlin); +} + +// roms + +ROM_START( mmerlin ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Electronic Master Mind + * TMS1000NLL MP3200 (die label 1000E, MP3200) + * 5 red leds, 5 green leds + + This is a board game, it came with 4 plug boards and a lot of colored pegs. + It's not related to the equally named Electronic Master Mind by Invicta, + that one is on a Rockwell MM75. + +***************************************************************************/ + +class pbmastm_state : public hh_tms1k_state +{ +public: + pbmastm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void pbmastm(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void pbmastm_state::write_r(u16 data) +{ + // R1-R10: leds (direct) + m_display->matrix(1, data >> 1); +} + +void pbmastm_state::write_o(u16 data) +{ + // O0-O5: input mux + m_inp_mux = data & 0x3f; +} + +u8 pbmastm_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( pbmastm ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("D") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Blue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Brown") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Black") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Yellow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("White") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Pink") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Gray") + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Green") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Orange") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Blank") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Delete") + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Battery Test") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Code") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Check") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pbmastm_state::pbmastm(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF + m_maincpu->k().set(FUNC(pbmastm_state::read_k)); + m_maincpu->r().set(FUNC(pbmastm_state::write_r)); + m_maincpu->o().set(FUNC(pbmastm_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 10); + config.set_default_layout(layout_pbmastm); + + // no sound! +} + +// roms + +ROM_START( pbmastm ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3200", 0x0000, 0x0400, CRC(059dbb88) SHA1(20e3f6aeecce167371bda914f263daf53c50c839) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_pbmastm_output.pla", 0, 365, CRC(b355c4d9) SHA1(43cc971a4feacfddfe810c8983c65d9eef3ed57b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Stop Thief, by Bob Doyle + * TMS0980NLL MP6101B (die label 0980B-01A) + * 3-digit 7seg LED display, 6-level sound + + Stop Thief is actually a board game, the electronic device emulated here + (called Electronic Crime Scanner) is an accessory. To start a game, press + the ON button. Otherwise, it is in test-mode where you can hear all sounds. + For the patent romset, it needs to be turned off and on to exit test mode. + +***************************************************************************/ + +class stopthief_state : public hh_tms1k_state +{ +public: + stopthief_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void stopthief(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void stopthief_state::write_r(u16 data) +{ + // R0-R2: select digit + m_display->matrix(data & 7, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f); + + // R3-R8(tied together): speaker out + int level = 0; + for (int i = 0; m_o & 8 && i < 6; i++) + level += (data >> (i+3) & 1); + m_speaker->level_w(level); +} + +void stopthief_state::write_o(u16 data) +{ + // O0,O6: input mux + m_inp_mux = (data & 1) | (data >> 5 & 2); + + // O3: speaker on + // O0-O2,O4-O7: led segments A-G + m_o = data; +} + +u8 stopthief_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + [1] [2] [OFF] + [3] [4] [ON] + [5] [6] [T, TIP] + [7] [8] [A, ARREST] + [9] [0] [C, CLUE] +*/ + +static INPUT_PORTS_START( stopthief ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.1") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.2") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void stopthief_state::stopthief(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 425000); // approximation + m_maincpu->k().set(FUNC(stopthief_state::read_k)); + m_maincpu->r().set(FUNC(stopthief_state::write_r)); + m_maincpu->o().set(FUNC(stopthief_state::write_o)); + m_maincpu->power_off().set(FUNC(stopthief_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_stopthief); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[7] = { 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; + m_speaker->set_levels(7, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( stopthief ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( stopthiefp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen + * TMS1400NLL MP7313-N2 (die label MP7313) + * LED grid display, 1-bit sound + + Bank Shot is an electronic pool game. To select a game, repeatedly press + the [SELECT] button, then press [CUE UP] to start. Refer to the official + manual for more information. The game selections are: + 1: Straight Pool (1 player) + 2: Straight Pool (2 players) + 3: Poison Pool + 4: Trick Shots + + BTANB: Some of the other (not cue) balls temporarily flash brighter sometimes, + eg. the bottom one when they're placed. This happens on the real device. + +***************************************************************************/ + +class bankshot_state : public hh_tms1k_state +{ +public: + bankshot_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void bankshot(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bankshot_state::update_display() +{ + m_display->matrix(m_r & ~3, m_o); +} + +void bankshot_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R2,R3: input mux + m_inp_mux = data >> 2 & 3; + + // R2-R10: led select + m_r = data; + update_display(); +} + +void bankshot_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 bankshot_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + (note: remember that you can rotate the display in MAME) + + [SELECT [BALL UP] [BALL OVER] + SCORE] + + ------ led display ------ + + [ANGLE] [AIM] [CUE UP + SHOOT] +*/ + +static INPUT_PORTS_START( bankshot ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up/Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select/Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bankshot_state::bankshot(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF + m_maincpu->k().set(FUNC(bankshot_state::read_k)); + m_maincpu->r().set(FUNC(bankshot_state::write_r)); + m_maincpu->o().set(FUNC(bankshot_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_bri_levels(0.01, 0.08); // cue ball is brigher + config.set_default_layout(layout_bankshot); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bankshot ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Split Second + * TMS1400NLL MP7314-N2 (die label MP7314) + * LED grid display(default round LEDs, and rectangular shape ones), 1-bit sound + + This is an electronic handheld reflex gaming device, it's straightforward + to use. The included mini-games are: + 1, 2, 3: Mad Maze* + 4, 5: Space Attack* + 6: Auto Cross + 7: Stomp + 8: Speedball + + *: higher number indicates higher difficulty + + display layout, where number yx is lamp R(y).O(x) + + 00 02 04 + 10 01 12 03 14 05 16 + 11 13 15 + 20 21 22 23 24 25 26 + 31 33 35 + 30 41 32 43 34 45 36 + 51 53 55 + 40 61 42 63 44 65 46 + 71 73 75 + 50 60 52 62 54 64 56 + 70 72 74 + +***************************************************************************/ + +class splitsec_state : public hh_tms1k_state +{ +public: + splitsec_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void splitsec(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void splitsec_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void splitsec_state::write_r(u16 data) +{ + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R0-R7: led select + m_r = data; + update_display(); +} + +void splitsec_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 splitsec_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( splitsec ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void splitsec_state::splitsec(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF + m_maincpu->k().set(FUNC(splitsec_state::read_k)); + m_maincpu->r().set(FUNC(splitsec_state::write_r)); + m_maincpu->o().set(FUNC(splitsec_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + config.set_default_layout(layout_splitsec); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( splitsec ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Lost Treasure - The Electronic Deep-Sea Diving Game, + Featuring The Electronic Dive-Control Center + * TMS1100 M34038-NLL (die label 1100E, M34038) + * 11 LEDs, 4-bit sound + + This is a board game. The electronic accessory is the emulated part here. + +***************************************************************************/ + +class lostreas_state : public hh_tms1k_state +{ +public: + lostreas_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void lostreas(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void lostreas_state::write_r(u16 data) +{ + // R0-R10: leds + m_display->matrix(1, data); +} + +void lostreas_state::write_o(u16 data) +{ + // O0-O3: input mux + m_inp_mux = data & 0xf; + + // O4: 330 ohm resistor - speaker out + // O5: 220 ohm resistor - speaker out + // O6: 180 ohm resistor - speaker out + // O7: 68 ohm resistor - speaker out + m_speaker->level_w(data >> 4 & 0xf); +} + +u8 lostreas_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + (note: Canadian version differs slightly to accomodoate dual-language) + + [N-S(gold)] [1] [2] [3] [AIR] + [E-W(gold)] [4] [5] [6] [UP] + [N-S(silv)] [7] [8] [9] [$ VALUE] + [E-W(silv)] [CLEAR] +*/ + +static INPUT_PORTS_START( lostreas ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // air/up + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("$ Value") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("E-W (silver)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("N-S (silver)") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("E-W (gold)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("N-S (gold)") + + PORT_START("FAKE") // Air/Up buttons share the same position on the matrix + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Air") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up") +INPUT_PORTS_END + +void lostreas_state::lostreas(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 425000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(lostreas_state::read_k)); + m_maincpu->r().set(FUNC(lostreas_state::write_r)); + m_maincpu->o().set(FUNC(lostreas_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_lostreas); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // set volume levels + static const double speaker_levels[0x10] = + { 1.0/16.0, 1.0/15.0, 1.0/14.0, 1.0/13.0, 1.0/12.0, 1.0/11.0, 1.0/10.0, 1.0/9.0, 1.0/8.0, 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; + m_speaker->set_levels(16, speaker_levels); +} + +// roms + +ROM_START( lostreas ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) ) +ROM_END + + + + + +/*************************************************************************** + + Playskool Alphie + * TMS1000 (label not known yet) + * 5 LEDs, 1-bit sound + + This is an educational toy robot for young kids. It has 2 sliding arms: + the left arm(Alphie's right arm) is for questions, the other for answers. + Cardboard inlays are used for arm position labels. + + There are 4 play modes: + - S symbol: Alphie answers questions. The answers are always the same, + no matter the inlay: Q1=A3, Q2=A5, Q3=A4, Q4=A1, Q5=A2. + - * symbol: used with Lunar Landing board game + - X symbol: used with Robot Land board game + - music note: play a selection of 5 tunes + +***************************************************************************/ + +class alphie_state : public hh_tms1k_state +{ +public: + alphie_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void alphie(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void alphie_state::write_r(u16 data) +{ + // R1-R5, input mux (using d5 for Vss) + m_inp_mux = (data >> 1 & 0x1f) | 0x20; + + // R6-R10: leds + m_display->matrix(1, data >> 6); + + // R0: power off on falling edge (turn back on with button) + if (~data & m_r & 1) + power_off(); + + m_r = data; +} + +void alphie_state::write_o(u16 data) +{ + // O?: speaker out + m_speaker->level_w(data & 1); +} + +u8 alphie_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(6); +} + +// config + +static INPUT_PORTS_START( alphie ) + PORT_START("IN.0") // K1 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + + PORT_START("IN.1") // K2 + PORT_CONFNAME( 0x1f, 0x01, "Question" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x10, "5" ) + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x1f, 0x01, "Answer" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x10, "5" ) + + PORT_START("IN.3") // K8 + PORT_CONFNAME( 0x0f, 0x01, "Activity" ) + PORT_CONFSETTING( 0x01, "Questions" ) + PORT_CONFSETTING( 0x02, "Lunar Landing" ) + PORT_CONFSETTING( 0x04, "Robot Land" ) + PORT_CONFSETTING( 0x08, "Tunes" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<1>, 0x1f) PORT_NAME("Question Arm Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<1>, 0x1f) PORT_NAME("Question Arm Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<2>, 0x1f) PORT_NAME("Answer Arm Up") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<2>, 0x1f) PORT_NAME("Answer Arm Down") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) PORT_NAME("Activity Selector Left") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) PORT_NAME("Activity Selector Right") +INPUT_PORTS_END + +// output PLA is guessed +static const u16 alphie_output_pla[0x20] = +{ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 +}; + +void alphie_state::alphie(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation + m_maincpu->set_output_pla(alphie_output_pla); + m_maincpu->k().set(FUNC(alphie_state::read_k)); + m_maincpu->r().set(FUNC(alphie_state::write_r)); + m_maincpu->o().set(FUNC(alphie_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 5); + config.set_default_layout(layout_alphie); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alphie ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // " +ROM_END + + + + + +/*************************************************************************** + + Tandy Championship Football (model 60-2150) + * PCB label CYG-316 + * TMS1100NLL MP1193 (die label 1100B, MP1193) + * 7-digit 7seg LED display + LED grid, 1-bit sound + + Another clone of Mattel Football II. The original manufacturer is unknown, but + suspected to be Conic/E.R.S.(Electronic Readout Systems). + +***************************************************************************/ + +class tcfball_state : public hh_tms1k_state +{ +public: + tcfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tcfball(machine_config &config); + +protected: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void tcfball_state::update_display() +{ + // R8 enables leds, R9 enables digits + u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780); + u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask; + + m_display->matrix(sel, m_o); +} + +void tcfball_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R5-R7: input mux + m_inp_mux = data >> 5 & 7; + + // R8+R0-R3: select led + // R9+R0-R6: select digit + m_r = data; + update_display(); +} + +void tcfball_state::write_o(u16 data) +{ + // O0-O7: digit segments/led data + m_o = data; + update_display(); +} + +u8 tcfball_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( tcfball ) + PORT_START("IN.0") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.2") // R7 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // college + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void tcfball_state::tcfball(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=56K, C=24pF + m_maincpu->k().set(FUNC(tcfball_state::read_k)); + m_maincpu->r().set(FUNC(tcfball_state::write_r)); + m_maincpu->o().set(FUNC(tcfball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_segmask(0x77, 0x7f); + m_display->set_segmask(0x08, 0xff); // R3 has DP + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_tcfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tcfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) ) + + 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_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy Championship Football (model 60-2151) + * TMS1100NLL MP1183 (no decap) + * 7-digit 7seg LED display + LED grid, 1-bit sound + + The hardware is almost the same as the MP1193 one, they added an extra row of leds. + + known releases: + - World(1): Superbowl XV Football, published by E.R.S.(Electronic Readout Systems) + - World(2): Super-Pro Football, no brand + - USA: Championship Football (model 60-2151), published by Tandy + +***************************************************************************/ + +class tcfballa_state : public tcfball_state +{ +public: + tcfballa_state(const machine_config &mconfig, device_type type, const char *tag) : + tcfball_state(mconfig, type, tag) + { } + + void tcfballa(machine_config &config); +}; + +// handlers: uses the ones in tcfball_state + +// config + +static INPUT_PORTS_START( tcfballa ) + PORT_INCLUDE( tcfball ) + + PORT_MODIFY("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Display") +INPUT_PORTS_END + +void tcfballa_state::tcfballa(machine_config &config) +{ + tcfball(config); + + // basic machine hardware + m_maincpu->set_clock(375000); // approximation - RC osc. R=47K, C=50pF + + config.set_default_layout(layout_tcfballa); +} + +// roms + +ROM_START( tcfballa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_tcfballa_output.bin", 0, 0x20, CRC(887ad9a5) SHA1(a2bac48f555df098c1f1f0fa663e5bcb989b8987) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy Computerized Arcade (model 60-2159 or 60-2159A) + * TMS1100 MCU, label CD7282SL + * 12 lamps behind buttons, 1-bit sound + + known releases: + - World: Tandy-12: Computerized Arcade, published by Tandy + - World: Computerized Arcade, published by Tandy, Radio Shack brand. + This one is model 60-2495 from the mid-90s, perhaps different hardware! + - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as + 9-button version, a clone of Mego Fabulous Fred) + + This handheld contains 12 minigames. It looks and plays like Game Robot 9 by + Takatoku Toys (aka Mego's Fabulous Fred) from 1980, which in turn is a mix of + Merlin and Simon. Unlike Merlin and Simon, spin-offs were not as successful in + the USA. There were releases with and without the prefix "Tandy-12", I don't + know which name was more common. Also not worth noting is that it needed five + batteries; four C-cells and a 9-volt. + + Some of the games require accessories included with the toy (eg. the Baseball + game is played with a board representing the playing field). To start a game, + hold the [SELECT] button, then press [START] when the game button lights up. + As always, refer to the official manual for more information. + + See below at the input defs for a list of the games. + +***************************************************************************/ + +class tandy12_state : public hh_tms1k_state +{ +public: + tandy12_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tandy12(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tandy12_state::update_display() +{ + m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00)); +} + +void tandy12_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R5-R9: input mux + m_inp_mux = data >> 5 & 0x1f; + + // R0-R3: button lamps 9-12 + m_r = data; + update_display(); +} + +void tandy12_state::write_o(u16 data) +{ + // O0-O7: button lamps 1-8 + m_o = data; + update_display(); +} + +u8 tandy12_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + REPEAT-2 SPACE-2 + [O] OFF--ON [O] + + [purple]1 [blue]5 [l-green]9 + ORGAN TAG-IT TREASURE HUNT + + [l-orange]2 [turquoise]6 [red]10 + SONG WRITER ROULETTE COMPETE + + [pink]3 [yellow]7 [violet]11 + REPEAT BASEBALL FIRE AWAY + + [green]4 [orange]8 [brown]12 + TORPEDO REPEAT PLUS HIDE 'N SEEK + + [O] [O] [O] + START SELECT PLAY-2/HIT-7 +*/ + +static INPUT_PORTS_START( tandy12 ) + PORT_START("IN.0") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Button 12") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Button 11") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 9") + + PORT_START("IN.1") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start") + + PORT_START("IN.2") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 1") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 tandy12_output_pla[0x20] = +{ + // these are certain + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, + 0x80, 0x00, 0x00, 0x00, 0x00, + + // rest is unused? + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void tandy12_state::tandy12(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->set_output_pla(tandy12_output_pla); + m_maincpu->k().set(FUNC(tandy12_state::read_k)); + m_maincpu->r().set(FUNC(tandy12_state::write_r)); + m_maincpu->o().set(FUNC(tandy12_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 13); + config.set_default_layout(layout_tandy12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tandy12 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Tandy(Radio Shack division) Monkey See (1982 version) + * TMS1000 MP0271 (die label 1000E, MP0271), only half of ROM space used + * 2 LEDs(one red, one green), 1-bit sound + + This is the TMS1000 version, the one from 1977 has a MM5780. + To play, enter an equation followed by the ?-key, and the calculator will + tell you if it was right(green) or wrong(red). For example 1+2=3? + + known releases: + - USA(1): Monkey See, published by Tandy + - USA(2): Heathcliff, published by McNaught Syndicate in 1983 + +***************************************************************************/ + +class monkeysee_state : public hh_tms1k_state +{ +public: + monkeysee_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void monkeysee(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void monkeysee_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R5: speaker out + m_speaker->level_w(data >> 5 & 1); +} + +void monkeysee_state::write_o(u16 data) +{ + // O6,O7: leds + // other: N/C + m_display->matrix(1, data >> 6); +} + +u8 monkeysee_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( monkeysee ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") +INPUT_PORTS_END + +void monkeysee_state::monkeysee(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 250000); // approximation - RC osc. R=68K, C=47pF + m_maincpu->k().set(FUNC(monkeysee_state::read_k)); + m_maincpu->r().set(FUNC(monkeysee_state::write_r)); + m_maincpu->o().set(FUNC(monkeysee_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 2); + config.set_default_layout(layout_monkeysee); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( monkeysee ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy 3 in 1 Sports Arena (model 60-2178) + * PCB label HP-804 + * TMS1100 (just a datestamp label (8331), die label 1100B MP1231) + * 2x2-digit 7seg LED display + 47 other LEDs, 1-bit sound + + For Tandy Sports Arena (model 60-2158), see cmsport, this is a different game. + This version is very similar to ssports4 released a few years earlier. + + 3 overlays were included for the games (Tandy calls them graphic sheets), + MAME external artwork is needed for those. + + It is always in 2-player head-to-head mode, the Player switch is just meant + for allowing the other player to have full control over 2 defense spots. + +***************************************************************************/ + +class t3in1sa_state : public hh_tms1k_state +{ +public: + t3in1sa_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void t3in1sa(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void t3in1sa_state::update_display() +{ + m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); +} + +void t3in1sa_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1,R5,R7-R9: input mux + m_inp_mux = (data & 3) | (data >> 3 & 4) | (data >> 4 & 0x38); + + // R2: led data high + // R3-R7: led select + // R0,R1,R8,R9: digit select + m_r = data; + update_display(); +} + +void t3in1sa_state::write_o(u16 data) +{ + // O0-O7: led data low + m_o = data; + update_display(); +} + +u8 t3in1sa_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* physical button layout and labels are like this: + + ↑ + [ ] [ ] [ ] + TEAM-MATE PASS + ←[ ] [ ]→ shoot + ↗ ↖ + [ ] [ ] [ ] + STATUS ↓ KICK + pass + shoot + +Game and difficulty switches are under the yellow buttons, +player switch is under the red buttons. P1 is yellow, P2 is red. + +*/ + +static INPUT_PORTS_START( t3in1sa ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R5 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // AMATEUR + PORT_CONFSETTING( 0x01, "2" ) // PRO + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0e, 0x08, "Game Select" ) + PORT_CONFSETTING( 0x08, "Football" ) // F + PORT_CONFSETTING( 0x04, "Basketball" ) // B + PORT_CONFSETTING( 0x02, "Soccer" ) // S + + PORT_START("IN.4") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Up-Right / Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Team-Mate") + + PORT_START("IN.5") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Up-Right / Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass / Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Team-Mate") +INPUT_PORTS_END + +void t3in1sa_state::t3in1sa(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(t3in1sa_state::read_k)); + m_maincpu->r().set(FUNC(t3in1sa_state::write_r)); + m_maincpu->o().set(FUNC(t3in1sa_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x303, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_t3in1sa); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( t3in1sa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1231", 0x0000, 0x0800, CRC(1c24e5c2) SHA1(0b6c2edea27eba15e890d82475b91a5e9ef6c4b9) ) + + 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_t3in1sa_output.pla", 0, 365, CRC(de82a294) SHA1(7187666a510919b90798b92b9104ac5d6820d559) ) +ROM_END + + + + + +/*************************************************************************** + + Telesensory Systems, Inc.(TSI) Speech+ + * TMS1000 MCU, label TMS1007NL (die label 1000B, 1007A) + * TSI S14001A speech chip, GI S14007-A 2KB maskrom for samples + * 9-digit 7seg LED display + + This is a speaking calculator for the blind, the instructions that came + with it were on audio cassette. It was also released in 1978 by APH + (American Printing House for the Blind). + +***************************************************************************/ + +class speechp_state : public hh_tms1k_state +{ +public: + speechp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_speech(*this, "speech") + { } + + void speechp(machine_config &config); + +private: + required_device m_speech; + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void speechp_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void speechp_state::write_r(u16 data) +{ + // R5-R9: TSI C0-C5 + m_speech->data_w(data >> 5 & 0x3f); + + // R10: TSI START line + m_speech->start_w(data >> 10 & 1); + + // R0-R9: input mux + m_inp_mux = data & 0x3ff; + + // R0-R8: select digit + m_r = data; + update_display(); +} + +void speechp_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 speechp_state::read_k() +{ + // K: multiplexed inputs + return m_inputs[10]->read() | (read_inputs(10) & 7); +} + +// config + +static INPUT_PORTS_START( speechp ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") // Swap + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") // Clear + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speak") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") // Memory + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.9") // R9 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x00, "Verbose" ) + PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN.10") // K8 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x08, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) +INPUT_PORTS_END + +void speechp_state::speechp(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(speechp_state::read_k)); + m_maincpu->r().set(FUNC(speechp_state::write_r)); + m_maincpu->o().set(FUNC(speechp_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_speechp); + + // sound hardware + SPEAKER(config, "mono").front_center(); + S14001A(config, m_speech, 25000); // approximation + m_speech->add_route(ALL_OUTPUTS, "mono", 0.75); +} + +// roms + +ROM_START( speechp ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) ) + + ROM_REGION( 0x0800, "speech", 0 ) + ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) ) +ROM_END + + + + + +/*************************************************************************** + + TI SR-16 (1974, first consumer product with TMS1000 series MCU) + * TMS1000 MCU label TMS1001NL (die label 1000, 1001A) + * 12-digit 7seg LED display + + TI SR-16 II (1975 version) + * TMS1000 MCU label TMS1016NL (die label 1000B, 1016A) + * notes: cost-reduced 'sequel', [10^x] was removed, and [pi] was added. + +***************************************************************************/ + +class tisr16_state : public hh_tms1k_state +{ +public: + tisr16_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tisr16(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void tisr16_state::update_display() +{ + m_display->matrix(m_r, m_o); + + // exponent sign is from R10 O1, and R10 itself only uses segment G + u8 r10 = m_display->read_row(10); + m_display->write_row(11, r10 << 5 & 0x40); + m_display->write_row(10, r10 & 0x40); +} + +void tisr16_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void tisr16_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 tisr16_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( tisr16 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("10" UTF8_POW_X) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( tisr16ii ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CD") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") +INPUT_PORTS_END + +void tisr16_state::tisr16(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq) + m_maincpu->k().set(FUNC(tisr16_state::read_k)); + m_maincpu->o().set(FUNC(tisr16_state::write_o)); + m_maincpu->r().set(FUNC(tisr16_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(0xfff, 0xff); + config.set_default_layout(layout_tisr16); + + // no sound! +} + +// roms + +ROM_START( tisr16 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) ) +ROM_END + +ROM_START( tisr16ii ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1250/TI-1200 (1975 version), Spirit of '76 + * TMS0950 MCU label TMC0952NL, K0952 (die label 0950A 0952) + * 9-digit 7seg LED display + + TI-1250/TI-1200 (1976 version), TI-1400, TI-1450, TI-1205, TI-1255, LADY 1200, ABLE + * TMS0970 MCU label TMS0972NL ZA0348, JP0972A (die label 0970D-72A) + * 8-digit 7seg LED display, or 9 digits with leftmost unused + + As seen listed above, the basic 4-function TMS0972 calculator MCU was used + in many calculators. It was licensed to other manufacturers too, one funny + example being a Mattel Barbie handheld calculator. + + Some cheaper models lacked the memory buttons (the function itself still works). + The ABLE series was for educational purposes, with each having a small subset of + available buttons. + + TI-1270 + * TMS0970 MCU label TMC0974NL ZA0355, DP0974A (die label 0970D-74A) + * 8-digit 7seg LED display + * notes: almost same hardware as TMS0972 TI-1250, minor scientific functions + +***************************************************************************/ + +class ti1250_state : public hh_tms1k_state +{ +public: + ti1250_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti1270(machine_config &config); + void ti1250(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti1250_state::write_r(u16 data) +{ + // R0-R8: select digit + m_display->matrix(data, m_o); +} + +void ti1250_state::write_o(u16 data) +{ + // O1-O5,O7: input mux + // O0-O7: digit segments + m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); + m_o = data; +} + +u8 ti1250_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ti1250 ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("CS") // named either CS(Change Sign) or +/- + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("MC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") +INPUT_PORTS_END + +static INPUT_PORTS_START( ti1270 ) + PORT_INCLUDE( ti1250 ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") +INPUT_PORTS_END + +void ti1250_state::ti1250(machine_config &config) +{ + // basic machine hardware + TMS0950(config, m_maincpu, 200000); // approximation - RC osc. R=68K, C=68pf + m_maincpu->k().set(FUNC(ti1250_state::read_k)); + m_maincpu->o().set(FUNC(ti1250_state::write_o)); + m_maincpu->r().set(FUNC(ti1250_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xff, 0xff); + m_display->set_segmask(0x100, 0x40); // R8 only has segment G connected + config.set_default_layout(layout_ti1250); + + // no sound! +} + +void ti1250_state::ti1270(machine_config &config) +{ + ti1250(config); + + // basic machine hardware + TMS0970(config.replace(), m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti1250_state::read_k)); + m_maincpu->o().set(FUNC(ti1250_state::write_o)); + m_maincpu->r().set(FUNC(ti1250_state::write_r)); + + config.set_default_layout(layout_ti1270); +} + +// roms + +ROM_START( ti1250 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) ) + ROM_REGION( 195, "maincpu:opla", 0 ) + ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + +ROM_START( ti125076 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + +ROM_START( ti1270 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI-2550 III, TI-1650/TI-1600, TI-1265 (they have the same chip) + * TMS1040 MCU label TMS1043NL ZA0352 (die label 1040A, 1043A) + * 9-digit cyan VFD display + + Only the TI-2550 III has the top button row (RV, SQRT, etc). + TI-1600 doesn't have the memory buttons. + +***************************************************************************/ + +class ti25503_state : public hh_tms1k_state +{ +public: + ti25503_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti25503(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti25503_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void ti25503_state::write_r(u16 data) +{ + // R0-R6: input mux + // R0-R8: select digit + m_r = m_inp_mux = data; + update_display(); +} + +void ti25503_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 ti25503_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +static INPUT_PORTS_START( ti25503 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") +INPUT_PORTS_END + +void ti25503_state::ti25503(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti25503_state::read_k)); + m_maincpu->o().set(FUNC(ti25503_state::write_o)); + m_maincpu->r().set(FUNC(ti25503_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_ti25503); + + // no sound! +} + +// roms + +ROM_START( ti25503 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) ) +ROM_END + + + + + +/*************************************************************************** + + TI-5100, more (see below) + * TMS1070 MCU label TMS1073NL or TMC1073NL (die label 1070B, 1073) + * 11-digit 7seg VFD (1 custom digit) + + This chip was also used in 3rd-party calculators, such as Toshiba BC-1015, + Panasonic JE1601U, Radio Shack EC2001, Triumph-Adler D100. The original + TI version did not have the 3 buttons at R4. + +***************************************************************************/ + +class ti5100_state : public hh_tms1k_state +{ +public: + ti5100_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti5100(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti5100_state::update_display() +{ + // extra segment on R10 + m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o); +} + +void ti5100_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void ti5100_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 ti5100_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( ti5100 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "K" ) // constant mode + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "DP" ) // display point + PORT_CONFSETTING( 0x00, "F" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // clear all? + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("EX") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("GPM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(UTF8_CAPITAL_DELTA"%") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R8 0x01 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R9 0x02 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("RM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) +INPUT_PORTS_END + +void ti5100_state::ti5100(machine_config &config) +{ + // basic machine hardware + TMS1070(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti5100_state::read_k)); + m_maincpu->o().set(FUNC(ti5100_state::write_o)); + m_maincpu->r().set(FUNC(ti5100_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 9); + m_display->set_segmask(0x7ff, 0xff); + config.set_default_layout(layout_ti5100); + + // no sound! +} + +// roms + +ROM_START( ti5100 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1073nl", 0x0000, 0x0400, CRC(94185933) SHA1(d2d9432f857b8530ac399f5097c6d412f06d8814) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti5100_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ti5100_output.pla", 0, 365, CRC(11f6f0f4) SHA1(f25cf6bd284ab4614746b2e3f98d42d2585e425a) ) +ROM_END + + + + + +/*************************************************************************** + + TMC098x series Majestic-line calculators + + TI-30, SR-40, TI-15(less buttons) and several by Koh-I-Noor + * TMS0980 MCU label TMC0981NL (die label 0980B-81F) + * 9-digit 7seg LED display + + Of note is a peripheral by Schoenherr, called the Braillotron. It acts as + a docking station to the TI-30, with an additional display made of magnetic + refreshable Braille cells. The TI-30 itself is slightly modified to wire + the original LED display to a 25-pin D-Sub connector. + + TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 + * TMS0980 MCU label TMC0982NL (die label 0980B-82F) + + TI Programmer + * TMS0980 MCU label ZA0675NL, JP0983AT (die label 0980B-83) + +***************************************************************************/ + +class ti30_state : public hh_tms1k_state +{ +public: + ti30_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti30(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti30_state::write_r(u16 data) +{ + // R0-R8: select digit + m_display->matrix(data, m_o); +} + +void ti30_state::write_o(u16 data) +{ + // O0-O2,O4-O7: input mux + // O0-O7: digit segments + m_inp_mux = (data & 7) | (data >> 1 & 0x78); + m_o = bitswap<8>(data,7,5,2,1,4,0,6,3); +} + +u8 ti30_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[7]->read() | read_inputs(7); +} + +// config + +static INPUT_PORTS_START( ti30 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE" UTF8_DOWN) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("DRG") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("INV") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("cos") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("sin") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("tan") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +static INPUT_PORTS_START( tiprog ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +static INPUT_PORTS_START( tibusan ) + // PORT_NAME lists functions under [2nd] as secondaries. + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X" " UTF8_POW_X"" UTF8_SQUAREROOT"y") // 2nd one implies xth root of y + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% " UTF8_CAPITAL_DELTA"%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("CST") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("MAR") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO m") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL b") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA"+ " UTF8_CAPITAL_SIGMA"-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("( AN-CI\"") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("x<>y L.R.") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(") 1/x") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("SUM x" UTF8_PRIME) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("FV") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("PMT") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("%i") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("PV") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC x" UTF8_PRIME) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void ti30_state::ti30(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 400000); // guessed + m_maincpu->k().set(FUNC(ti30_state::read_k)); + m_maincpu->o().set(FUNC(ti30_state::write_o)); + m_maincpu->r().set(FUNC(ti30_state::write_r)); + m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1fe, 0xff); + m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP + config.set_default_layout(layout_ti30); + + // no sound! +} + +// roms + +ROM_START( ti30 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( tibusan ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( tiprog ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_tiprog_micro.pla", 0, 1982, CRC(57043284) SHA1(0fa06d5865830ecdb3d870271cb92ac917bed3ca) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_tiprog_output.pla", 0, 352, BAD_DUMP CRC(125c4ee6) SHA1(b8d865c42fd37c3d9b92c5edbecfc831be558597) ) // corrected by hand + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1000 (1977 version) + * TMS1990 MCU label TMC1991NL (die label 1991-91A) + * 8-digit 7seg LED display + + TI-1000 (1978 version) + * TMS1990 MCU label TMC1992-4NL **not dumped yet + +***************************************************************************/ + +class ti1000_state : public hh_tms1k_state +{ +public: + ti1000_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti1000(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti1000_state::write_r(u16 data) +{ + // R0-R7: select digit + m_display->matrix(data, m_o); +} + +void ti1000_state::write_o(u16 data) +{ + // O0-O3,O5(?): input mux + // O0-O7: digit segments + m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); + m_o = bitswap<8>(data,7,4,3,2,1,0,6,5); +} + +u8 ti1000_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( ti1000 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.3") // O3 or O4? + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void ti1000_state::ti1000(machine_config &config) +{ + // basic machine hardware + TMS1990(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti1000_state::read_k)); + m_maincpu->o().set(FUNC(ti1000_state::write_o)); + m_maincpu->r().set(FUNC(ti1000_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_ti1270); + + // no sound! +} + +// roms + +ROM_START( ti1000 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) +ROM_END + + + + + +/*************************************************************************** + + TI WIZ-A-TRON + * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label 0970F-07B) + * 9-digit 7seg LED display(one custom digit) + +***************************************************************************/ + +class wizatron_state : public hh_tms1k_state +{ +public: + wizatron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void wizatron(machine_config &config); + +protected: + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void wizatron_state::write_r(u16 data) +{ + // R0-R8: select digit + + // 3rd digit only has A and G for =, though some newer hardware revisions + // (goes for both wizatron and lilprof) use a custom equals-sign digit here + + // 6th digit is custom(not 7seg), for math symbols, like this: + // \./ GAB + // --- F + // /.\ EDC + m_display->matrix(data, m_o); +} + +void wizatron_state::write_o(u16 data) +{ + // O1-O4: input mux + // O0-O6: digit segments A-G + // O7: N/C + m_inp_mux = data >> 1 & 0xf; + m_o = data & 0x7f; +} + +u8 wizatron_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( wizatron ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) +INPUT_PORTS_END + +void wizatron_state::wizatron(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(wizatron_state::read_k)); + m_maincpu->o().set(FUNC(wizatron_state::write_o)); + m_maincpu->r().set(FUNC(wizatron_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff^8, 0x7f); + m_display->set_segmask(8, 0x41); // equals sign + config.set_default_layout(layout_wizatron); + + // no sound! +} + +// roms + +ROM_START( wizatron ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI Little Professor (1976 version) + * TMS0970 MCU label TMS0975NL ZA0356, GP0975CS (die label 0970D-75C) + * 9-digit 7seg LED display(one custom digit) + + The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this + one is older). + +***************************************************************************/ + +class lilprof_state : public wizatron_state +{ +public: + lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : + wizatron_state(mconfig, type, tag) + { } + + void lilprof(machine_config &config); + +private: + virtual void write_o(u16 data) override; + virtual u8 read_k() override; +}; + +// handlers + +void lilprof_state::write_o(u16 data) +{ + // O1-O4,O7: input mux + // O0-O6: digit segments A-G + m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); + m_o = data; +} + +u8 lilprof_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( lilprof ) + PORT_INCLUDE( wizatron ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.4") // O7 + PORT_CONFNAME( 0x0f, 0x01, "Level") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) +INPUT_PORTS_END + +void lilprof_state::lilprof(machine_config &config) +{ + wizatron(config); + + // basic machine hardware + m_maincpu->k().set(FUNC(lilprof_state::read_k)); + m_maincpu->o().set(FUNC(lilprof_state::write_o)); +} + +// roms + +ROM_START( lilprof ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI Little Professor (1978 version) + * TMS1990 MCU label TMC1993NL (die label 1990C-c3C) + * 9-digit 7seg LED display(one custom digit) + + 1978 re-release, with on/off and level select on buttons instead of + switches. The casing was slightly revised in 1980 again, but same rom. + +***************************************************************************/ + +class lilprof78_state : public hh_tms1k_state +{ +public: + lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void lilprof78(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void lilprof78_state::write_r(u16 data) +{ + // update leds state + u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; + u16 r = (data & 7) | (data << 1 & 0x1f0); + m_display->matrix(r, seg); + + // 3rd digit A/G(equals sign) is from O7 + m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); + + // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) + m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); +} + +void lilprof78_state::write_o(u16 data) +{ + // O0-O3,O5(?): input mux + // O0-O6: digit segments A-G + // O7: 6th digit + m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); + m_o = data; +} + +u8 lilprof78_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( lilprof78 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.3") // O3 or O4? + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void lilprof78_state::lilprof78(machine_config &config) +{ + // basic machine hardware + TMS1990(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(lilprof78_state::read_k)); + m_maincpu->o().set(FUNC(lilprof78_state::write_o)); + m_maincpu->r().set(FUNC(lilprof78_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_wizatron); + + // no sound! +} + +// roms + +ROM_START( lilprof78 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1680, TI-2550-IV + * TMS1980 MCU label TMC1981NL (die label 1980A 81F) + * TMC0999NL 256x4 RAM (die label 0999B) + * 9-digit cyan VFD display(leftmost digit is custom) + + The extra RAM is for scrolling back through calculations. For some reason, + TI-2550-IV has the same hardware, this makes it very different from II and III. + +***************************************************************************/ + +class ti1680_state : public hh_tms1k_state +{ +public: + ti1680_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_ram(*this, "ram") + { } + + void ti1680(machine_config &config); + +private: + required_device m_ram; + + virtual void update_display(); + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ti1680_state::update_display() +{ + // note the extra segments on R9 and R3 + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80) | (m_r << 5 & 0x100)); +} + +void ti1680_state::write_r(u16 data) +{ + // R8,R0,R5,R6: TMC0999 data inputs + // R2,R4+R1/R7: TMC0999 control pins + m_ram->di_w(bitswap<4>(data,8,0,5,6)); + m_ram->adr_w(BIT(data, 2)); + m_ram->wr_w(BIT(data, 4) & BIT(data, 7)); + m_ram->rd_w(BIT(data, 4) & BIT(data, 1)); + + // R3-R8: input mux + m_inp_mux = data >> 3 & 0x3f; + + // R0-R8: select digit + // R9: digit DP segment + m_r = data; + update_display(); +} + +void ti1680_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; + update_display(); +} + +u8 ti1680_state::read_k() +{ + // K: multiplexed inputs, RAM data + return read_inputs(6) | m_ram->do_r(); +} + +// config + +static INPUT_PORTS_START( ti1680 ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("BST") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("RPL") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.5") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void ti1680_state::ti1680(machine_config &config) +{ + // basic machine hardware + TMS1980(config, m_maincpu, 300000); // approximation + m_maincpu->k().set(FUNC(ti1680_state::read_k)); + m_maincpu->o().set(FUNC(ti1680_state::write_o)); + m_maincpu->r().set(FUNC(ti1680_state::write_r)); + m_maincpu->power_off().set(FUNC(ti1680_state::auto_power_off)); + + TMC0999(config, m_ram); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1fe, 0xff); + config.set_default_layout(layout_ti1680); + + // no sound! +} + +// roms + +ROM_START( ti1680 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1981nl", 0x0000, 0x1000, CRC(8467c5a1) SHA1(d3a48f6c9dd41e2dc0e0cfafa84dac8d21aacaa3) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_ti1680_output.pla", 0, 525, CRC(188af340) SHA1(eaf707266dde0d708870ef5d8f985ce88d35b43e) ) +ROM_END + + + + + +/*************************************************************************** + + TI DataMan + * TMS1980 MCU label TMC1982NL (die label 1980A 82B) + * 10-digit cyan VFD display(3 digits are custom) + +***************************************************************************/ + +class dataman_state : public hh_tms1k_state +{ +public: + dataman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void dataman(machine_config &config); + +protected: + virtual void update_display(); + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void dataman_state::update_display() +{ + // note the extra segment on R9 + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80)); +} + +void dataman_state::write_r(u16 data) +{ + // R0-R4: input mux + // R0-R8: select digit + // R9: =(equals sign) segment + m_r = m_inp_mux = data; + update_display(); +} + +void dataman_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; + update_display(); +} + +u8 dataman_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[5]->read() | read_inputs(5); +} + +// config + +static INPUT_PORTS_START( dataman ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Memory Bank") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Go") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Force Out") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Number Guesser") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wipe Out") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.5") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Electro Flash") +INPUT_PORTS_END + +void dataman_state::dataman(machine_config &config) +{ + // basic machine hardware + TMS1980(config, m_maincpu, 300000); // patent says 300kHz + m_maincpu->k().set(FUNC(dataman_state::read_k)); + m_maincpu->o().set(FUNC(dataman_state::write_o)); + m_maincpu->r().set(FUNC(dataman_state::write_r)); + m_maincpu->power_off().set(FUNC(dataman_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_dataman); + + // no sound! +} + +// roms + +ROM_START( dataman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) +ROM_END + + + + + +/*************************************************************************** + + TI Math Marvel + * TMS1980 MCU label TMC1986A-NL (die label 1980A 86A) + * 9-digit cyan VFD display(2 digits are custom), 1-bit sound + + This is the same hardware as DataMan, with R8 connected to a piezo. + +***************************************************************************/ + +class mathmarv_state : public dataman_state +{ +public: + mathmarv_state(const machine_config &mconfig, device_type type, const char *tag) : + dataman_state(mconfig, type, tag) + { } + + void mathmarv(machine_config &config); + +private: + virtual void write_r(u16 data) override; +}; + +// handlers + +void mathmarv_state::write_r(u16 data) +{ + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // rest is same as dataman + dataman_state::write_r(data); +} + +// config + +static INPUT_PORTS_START( mathmarv ) + PORT_INCLUDE( dataman ) + + PORT_MODIFY("IN.4") // R4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Quest") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Checker") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Review") + + PORT_MODIFY("IN.5") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Zap") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Flash") +INPUT_PORTS_END + +void mathmarv_state::mathmarv(machine_config &config) +{ + dataman(config); + + // basic machine hardware + m_maincpu->r().set(FUNC(mathmarv_state::write_r)); + + config.set_default_layout(layout_mathmarv); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mathmarv ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) +ROM_END + + + + + +/*************************************************************************** + + Texas Instruments maze game (unreleased, from patent GB2040172A) + * TMS1000 (development version) + * 1 7seg LED digit, no sound + + The title of this game is unknown, the patent describes it simply as a maze game. + Several electronic maze game concepts are listed in the patent. The PCB schematic + and program source code is included for one of them: A predefined 12*8 maze, + walls close to the player are displayed on a 7seg digit. + + In the end Texas Instruments didn't release any electronic maze game. This version + is too simple and obviously unfinished, start and goal positions are always the same + and there is a lot of ROM space left for more levels. + +***************************************************************************/ + +class timaze_state : public hh_tms1k_state +{ +public: + timaze_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void timaze(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void timaze_state::write_r(u16 data) +{ + // R0: input mux + m_inp_mux = data & 1; +} + +void timaze_state::write_o(u16 data) +{ + // O3210: 7seg EGCD? + m_display->matrix(1, bitswap<8>(data, 7,1,6,0,3,2,5,4)); +} + +u8 timaze_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( timaze ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY +INPUT_PORTS_END + +void timaze_state::timaze(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=80K, C=27pF + m_maincpu->k().set(FUNC(timaze_state::read_k)); + m_maincpu->r().set(FUNC(timaze_state::write_r)); + m_maincpu->o().set(FUNC(timaze_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 8); + m_display->set_segmask(1, 0x5c); + config.set_default_layout(layout_timaze); + + // no sound! +} + +// roms + +ROM_START( timaze ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order +ROM_END + + + + + +/*************************************************************************** + + Texas Instruments Electronic Digital Thermostat + * TMS0970 MCU, label TMS0970NLL TMC0910B (die label 0970F-10E) + * 9-digit 7seg LED display, only 4 used + * temperature sensor, heat/cool/fan outputs + + This is a thermostat and digital clock. It's the 2nd one described in + patents US4388692 and US4298946. + +***************************************************************************/ + +class tithermos_state : public hh_tms1k_state +{ +public: + tithermos_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_60hz(*this, "ac_line") + { } + + void tithermos(machine_config &config); + +private: + required_device m_60hz; + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tithermos_state::write_r(u16 data) +{ + // D1-D4: select digit + m_display->matrix(data, m_o); + + // D6: heat/cool + // D8: A/D reset + m_r = data; +} + +void tithermos_state::write_o(u16 data) +{ + // SA-SP: input mux + // SA-SG: digit segments + m_o = m_inp_mux = data; +} + +u8 tithermos_state::read_k() +{ + // K: multiplexed inputs + u8 data = read_inputs(8); + + // when SB/SD/SP is high: + if (m_inp_mux & 0x8a) + { + // K1: 60hz from AC line + // K2: battery low? + // K8: A/D output (TODO) + data |= (m_60hz->signal_r()) ? 1 : 0; + } + + return data; +} + +// config + +static INPUT_PORTS_START( tithermos ) + PORT_START("IN.0") // SA + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Temp Row PM 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Time Row PM 2") + + PORT_START("IN.1") // SB + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // SC + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Temp Row PM 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Time Row PM 1") + + PORT_START("IN.3") // SD + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line + PORT_CONFNAME( 0x06, 0x04, "System") + PORT_CONFSETTING( 0x04, "Heat" ) + PORT_CONFSETTING( 0x00, "Off" ) + PORT_CONFSETTING( 0x02, "Cool" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output + + PORT_START("IN.4") // SE + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Temp Row AM 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Time Row AM 2") + + PORT_START("IN.5") // SF + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Temp Row AM 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Time Row AM 1") + + PORT_START("IN.6") // SG + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Temp / Actual") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Time / Clock") + + PORT_START("IN.7") // SP + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line + PORT_CONFNAME( 0x06, 0x04, "Mode") + PORT_CONFSETTING( 0x04, "Constant" ) + PORT_CONFSETTING( 0x00, "Day/Night" ) + PORT_CONFSETTING( 0x02, "Night" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output + + PORT_START("IN.8") + PORT_CONFNAME( 0x01, 0x00, "Fan") + PORT_CONFSETTING( 0x00, "On" ) + PORT_CONFSETTING( 0x01, "Auto" ) // same output as heat/cool +INPUT_PORTS_END + +void tithermos_state::tithermos(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(tithermos_state::read_k)); + m_maincpu->r().set(FUNC(tithermos_state::write_r)); + m_maincpu->o().set(FUNC(tithermos_state::write_o)); + + CLOCK(config, "ac_line", 60); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_tithermos); + + // no sound! +} + +// roms + +ROM_START( tithermos ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0910b", 0x0000, 0x0400, CRC(232011cf) SHA1(598ae8cecd98226fb5056c99ce9f47fd23785fd7) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_tithermos_micro.pla", 0, 860, CRC(a3bb8ca5) SHA1(006ea733440001c37a77d4ffbc4bd2a8fee212ac) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_tithermos_output.pla", 0, 352, CRC(eb3598fd) SHA1(2372ae17fb982cae2710bf8c348bf02b767daabd) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sub Wars (model 7-490) + * PCB label CSG201A(main), CSG201B(leds) + * TMS1200N2LL MP3352 (die label 1000C, MP3352) + * 4-digit 7seg LED display + 55 other LEDs, 1-bit sound + + Tiger/Yeno also published an LCD handheld called Sub Wars, it's not related. + + This handheld was modified and used as a prop in the 1981 movie Escape from + New York, Snake Plissken uses it as a homing device. + +***************************************************************************/ + +class subwars_state : public hh_tms1k_state +{ +public: + subwars_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void subwars(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void subwars_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void subwars_state::write_r(u16 data) +{ + // R0-R3: digit select + // R4-R12: led select + m_r = data; + update_display(); +} + +void subwars_state::write_o(u16 data) +{ + // O0-O6: led data + m_o = data; + update_display(); + + // O7: speaker out + m_speaker->level_w(BIT(data, 7)); +} + +// config + +static INPUT_PORTS_START( subwars ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void subwars_state::subwars(machine_config &config) +{ + // basic machine hardware + TMS1200(config, m_maincpu, 550000); // approximation - RC osc. R=24K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(subwars_state::write_r)); + m_maincpu->o().set(FUNC(subwars_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(13, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_subwars); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( subwars ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3352", 0x0000, 0x0400, CRC(5dece1e4) SHA1(65ef77b063c94ff4b6c83dace54ea2f75bd3d6a9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_subwars_output.pla", 0, 365, CRC(372b9bbc) SHA1(06a875e114b7757c6f4f1727416d1739ebe60931) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A) + * TMS1100 MP1215 (die label 1100B MP1215) + * 2-digit 7seg LED display + 40 other LEDs, 1-bit sound + + The games are on playcards(Tiger calls them that), the hardware detects which + game is inserted from a notch at the lower-right. The playcards also function + as an overlay. MAME external artwork is needed for those. + + Booting the handheld with no playcard inserted will initiate a halftime show. + + "Playmaker" is actually Tiger's trademark for the d-pad controller, this + controller term was also used in for example Deluxe Football, and 7 in 1 Sports + Stadium. The d-pad has a ball shape at the bottom that sits on a concave base. + It is patented under US4256931 (mid-1979, a couple of years before Nintendo's + Game & Watch d-pad with US4687200). + +***************************************************************************/ + +class playmaker_state : public hh_tms1k_state +{ +public: + playmaker_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void playmaker(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u8 m_notch = 0; // cartridge K1/K2 + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void playmaker_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_notch)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(playmaker_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge notch + const char *notch = image.get_feature("notch"); + m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0; + + return image_init_result::PASS; +} + +void playmaker_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void playmaker_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R3: input mux + m_inp_mux = data & 0xf; + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void playmaker_state::write_o(u16 data) +{ + // O0-O6: led data + m_o = data; + update_display(); +} + +u8 playmaker_state::read_k() +{ + // K: multiplexed inputs, cartridge notch from R3 + return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0); +} + +// config + +static INPUT_PORTS_START( playmaker ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot / P1 Skill") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill") +INPUT_PORTS_END + +void playmaker_state::playmaker(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=20K, C=250pF + m_maincpu->k().set(FUNC(playmaker_state::read_k)); + m_maincpu->r().set(FUNC(playmaker_state::write_r)); + m_maincpu->o().set(FUNC(playmaker_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x300, 0x7f); + m_display->set_bri_levels(0.004, 0.04); // player 1 leds are brighter + config.set_default_layout(layout_playmaker); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "playmaker_cart")); + cartslot.set_must_be_loaded(false); + cartslot.set_device_load(FUNC(playmaker_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("playmaker"); +} + +// roms + +ROM_START( playmaker ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1215", 0x0000, 0x0800, CRC(bfc7b6c8) SHA1(33f6e2b86fae2fd9e4b0a4b8dc842c257ca3047d) ) + + 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_playmaker_output.pla", 0, 365, CRC(0cd484d6) SHA1(4a9af9f3d18af504145690cb0f6444ff1aef26ca) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Deluxe Football with Instant Replay (model 7-550) + * TMS1400NLL MP7302 (die label TMS1400 MP7302) + * 4-digit 7seg LED display, 80 red/green LEDs, 1-bit sound + + According to the manual, player 1 is green, player 2 is red. But when + playing a 1-player game, the CPU controls green, so on MAME, player 1 + is the red side. + + Booting the handheld with the Score and Replay buttons held down will + initiate a halftime show. + +***************************************************************************/ + +class dxfootb_state : public hh_tms1k_state +{ +public: + dxfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void dxfootb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void dxfootb_state::update_display() +{ + // 2 led groups (double multiplexed) + u16 g1 = (m_r & 0x100) ? 0x7f : 0; + u16 g2 = (m_r & 0x80) ? 0x7f << 7 : 0; + m_display->matrix((m_r & g1) | (m_r << 7 & g2), m_o); +} + +void dxfootb_state::write_r(u16 data) +{ + // R9,R10: speaker out + m_speaker->level_w(data >> 9 & 3); + + // R3-R6: input mux + m_inp_mux = data >> 3 & 0xf; + + // R0-R6: led select + // R7,R8: group select + m_r = data; + update_display(); +} + +void dxfootb_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 dxfootb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( dxfootb ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Replay / Skill (Green)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score / Skill (Red)") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) +INPUT_PORTS_END + +void dxfootb_state::dxfootb(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(dxfootb_state::read_k)); + m_maincpu->r().set(FUNC(dxfootb_state::write_r)); + m_maincpu->o().set(FUNC(dxfootb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7+7, 8); + m_display->set_segmask(0x3c00, 0x7f); + config.set_default_layout(layout_dxfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( dxfootb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7302", 0x0000, 0x1000, CRC(a8077062) SHA1(c1318fe5c8f2db021d7d1264fc70158944045fa3) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_dxfootb_output.pla", 0, 557, CRC(a1b3d2c0) SHA1(8030e6dcd3878b58668c98cff36d93b764e1d67f) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Copy Cat (model 7-520) + * PCB label CC REV B + * TMS1000 MCU, label 69-11513 MP0919 (die label MP0919) + * 4 LEDs, 1-bit sound + + known releases: + - World: Copy Cat, published by Tiger + - USA(1): Follow Me, published by Sears + - USA(2): Electronic Repeat, published by Tandy + +***************************************************************************/ + +class copycat_state : public hh_tms1k_state +{ +public: + copycat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void copycat(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void copycat_state::write_r(u16 data) +{ + // R0-R3: leds + m_display->matrix(1, data & 0xf); + + // R4-R7: input mux + // R8-R10: N/C + m_inp_mux = data >> 4 & 0xf; +} + +void copycat_state::write_o(u16 data) +{ + // O0,O1: speaker out + // O2,O7: N/C, O3-O6: tied together but unused + m_speaker->level_w(data & 3); +} + +u8 copycat_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( copycat ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + + PORT_START("IN.1") // R5 + PORT_CONFNAME( 0x0f, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + + PORT_START("IN.2") // R6 + PORT_CONFNAME( 0x07, 0x01, "Game Select") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Best Play") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Play") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Replay") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void copycat_state::copycat(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 320000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(copycat_state::read_k)); + m_maincpu->r().set(FUNC(copycat_state::write_r)); + m_maincpu->o().set(FUNC(copycat_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_copycat); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( copycat ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Copy Cat (model 7-522) + * PCB label WS 8107-1 + * TMS1730 MCU, label MP3005N (die label 1700 MP3005) + * 4 LEDs, 1-bit sound + + This is a simplified rerelease of Copy Cat, 10(!) years later. The gameplay + is identical to Ditto. + + 3 variations exist, each with a different colored case. Let's assume that + they're on the same hardware. + - white case, yellow orange green red buttons and leds (same as model 7-520) + - yellow case, purple orange blue pink buttons, leds are same as older version + - transparent case, transparent purple orange blue red buttons, leds same as before + +***************************************************************************/ + +class copycatm2_state : public hh_tms1k_state +{ +public: + copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void copycatm2(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void copycatm2_state::write_r(u16 data) +{ + // R1-R4: leds + m_display->matrix(1, data >> 1 & 0xf); +} + +void copycatm2_state::write_o(u16 data) +{ + // O0,O6: speaker out + m_speaker->level_w((data & 1) | (data >> 5 & 2)); +} + +// config + +static INPUT_PORTS_START( copycatm2 ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") +INPUT_PORTS_END + +void copycatm2_state::copycatm2(machine_config &config) +{ + // basic machine hardware + TMS1730(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(copycatm2_state::write_r)); + m_maincpu->o().set(FUNC(copycatm2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_copycatm2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( copycatm2 ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Ditto (model 7-530) + * TMS1700 MCU, label MP1801-N2LL (die label 1700 MP1801) + * 4 LEDs, 1-bit sound + + known releases: + - World: Ditto, published by Tiger + - USA: Electronic Pocket Repeat (model 60-2152/60-2468A), published by Tandy + note: 1996 model 60-2482 MCU is a Z8, and is assumed to be a clone of Tiger Copycat Jr. + +***************************************************************************/ + +class ditto_state : public hh_tms1k_state +{ +public: + ditto_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ditto(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void ditto_state::write_r(u16 data) +{ + // R0-R3: leds + m_display->matrix(1, data & 0xf); +} + +void ditto_state::write_o(u16 data) +{ + // O5,O6: speaker out + m_speaker->level_w(data >> 5 & 3); +} + +// config + +static INPUT_PORTS_START( ditto ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Orange Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Red Button") +INPUT_PORTS_END + +void ditto_state::ditto(machine_config &config) +{ + // basic machine hardware + TMS1700(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(ditto_state::write_r)); + m_maincpu->o().set(FUNC(ditto_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ditto); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ditto ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger 7 in 1 Sports Stadium (model 7-555) + * TMS1400 MP7304 (die label TMS1400 MP7304A) + * 2x2-digit 7seg LED display + 39 other LEDs, 1-bit sound + + This handheld includes 7 games: 1: Basketball, 2: Hockey, 3: Soccer, + 4: Maze, 5: Baseball, 6: Football, 7: Raquetball. + MAME external artwork is needed for the switchable overlays. + + known releases: + - World: 7 in 1 Sports Stadium, published by Tiger + - USA: 7 in 1 Sports, published by Sears + +***************************************************************************/ + +class t7in1ss_state : public hh_tms1k_state +{ +public: + t7in1ss_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void t7in1ss(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void t7in1ss_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void t7in1ss_state::write_r(u16 data) +{ + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0-R2,R10: input mux + m_inp_mux = (data & 7) | (data >> 7 & 8); + + // R0-R3: digit select + // R4-R8: led select + m_r = data; + update_display(); +} + +void t7in1ss_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 t7in1ss_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( t7in1ss ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // R10 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void t7in1ss_state::t7in1ss(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(t7in1ss_state::read_k)); + m_maincpu->r().set(FUNC(t7in1ss_state::write_r)); + m_maincpu->o().set(FUNC(t7in1ss_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xf, 0x7f); + m_display->set_bri_levels(0.004, 0.04); // player led is brighter + config.set_default_layout(layout_t7in1ss); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( t7in1ss ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_t7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronics) Break Up (manufactured in Japan) + * PCB label TOMY B.O. + * TMS1040 MP2726 TOMY WIPE (die label MP2726A) + * TMS1025N2LL I/O expander + * 2-digit 7seg display, 46 other leds, 1-bit sound + + known releases: + - USA: Break Up, published by Tomy + - Japan: Block Attack, published by Tomy + - UK: Break-In, published by Tomy + + led translation table: led zz from game PCB = MAME y.x: + + 00 = - 10 = 5.0 20 = 4.2 + 01 = 7.0 11 = 5.1 21 = 3.3 + 02 = 7.1 12 = 5.2 22 = 2.2 + 03 = 7.2 13 = 5.3 + 04 = 7.3 14 = 4.3 + 05 = 6.0 15 = 3.1 + 06 = 6.1 16 = 3.2 + 07 = 6.2 17 = 3.0 + 08 = 6.3 18 = 4.1 + 09 = 4.0 19 = 2.1 + + the 7seg panel is 0.* and 1.*(aka digit0/1), + and the 8(2*4) * 3 rectangular leds panel, where x=0,1,2,3: + + 9.* 11.* + 8.* 13.* + 10.* 12.* + +***************************************************************************/ + +class tbreakup_state : public hh_tms1k_state +{ +public: + tbreakup_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_expander(*this, "expander") + { } + + void tbreakup(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + virtual void machine_start() override; + +private: + required_device m_expander; + u8 m_exp_port[7] = { }; + void expander_w(offs_t offset, u8 data); + + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void tbreakup_state::machine_start() +{ + hh_tms1k_state::machine_start(); + save_item(NAME(m_exp_port)); +} + +void tbreakup_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void tbreakup_state::set_clock() +{ + // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 500000 : 325000); +} + +void tbreakup_state::update_display() +{ + // 7seg leds from R0,R1 and O0-O6 + m_display->matrix_partial(0, 2, m_r, m_o & 0x7f); + + // 22 round leds from O2-O7 and expander port 7 + m_display->matrix_partial(2, 6, m_o >> 2, m_exp_port[6]); + + // 24 rectangular leds from expander ports 1-6 (not strobed) + for (int y = 0; y < 6; y++) + m_display->write_row(y+8, m_exp_port[y]); +} + +void tbreakup_state::expander_w(offs_t offset, u8 data) +{ + // TMS1025 port 1-7 data + m_exp_port[offset] = data; +} + +void tbreakup_state::write_r(u16 data) +{ + // R6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // R7,R8: input mux + m_inp_mux = data >> 7 & 3; + + // R3-R5: TMS1025 port S + // R2: TMS1025 STD pin + m_expander->write_s(data >> 3 & 7); + m_expander->write_std(data >> 2 & 1); + + // R0,R1: select digit + m_r = ~data; + update_display(); +} + +void tbreakup_state::write_o(u16 data) +{ + // O0-O3: TMS1025 port H + m_expander->write_h(data & 0xf); + + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 tbreakup_state::read_k() +{ + // K4: fixed input + // K8: multiplexed inputs + return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8); +} + +// config + +static INPUT_PORTS_START( tbreakup ) + PORT_START("IN.0") // R7 K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Ball") + + PORT_START("IN.1") // R8 K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Lives ) ) + PORT_CONFSETTING( 0x00, "3" ) + PORT_CONFSETTING( 0x04, "5" ) + + PORT_START("IN.3") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tbreakup_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "Pro 1" ) + PORT_CONFSETTING( 0x01, "Pro 2" ) +INPUT_PORTS_END + +void tbreakup_state::tbreakup(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 325000); // see set_clock + m_maincpu->k().set(FUNC(tbreakup_state::read_k)); + m_maincpu->r().set(FUNC(tbreakup_state::write_r)); + m_maincpu->o().set(FUNC(tbreakup_state::write_o)); + + TMS1025(config, m_expander).set_ms(1); // MS tied high + m_expander->write_port1_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port2_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port3_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port4_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port5_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port6_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port7_callback().set(FUNC(tbreakup_state::expander_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2+6+6, 8); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_tbreakup); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tbreakup ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Power House Pinball + * PCB label TOMY P-B + * TMS1100 MP1180 TOMY PINB (die label MP1180) + * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + known releases: + - USA: Power House Pinball, published by Tomy + - Japan: Pinball, published by Tomy + - Europe: Flipper, published by Tomy + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 5.0 20 = 6.4 A = 3.0 + 1 = 3.3 11 = 5.5 21 = 6.5 B = 3.4 + 2 = 3.1 12 = 5.1 22 = 7.0 C = 3.5 + 3 = 3.2 13 = 5.2 23 = 7.1 D = 8.0 + 4 = 4.0 14 = 5.3 24 = 7.2 E = 8.1 + 5 = 4.1 15 = 6.0 25 = 7.3 F = 8.2 + 6 = 4.2 16 = 5.4 26 = 7.4 G = 8.3 + 7 = 4.3 17 = 6.1 + 8 = 4.4 18 = 6.2 + 9 = 4.5 19 = 6.3 + + NOTE!: MAME external artwork is required + +***************************************************************************/ + +class phpball_state : public hh_tms1k_state +{ +public: + phpball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void phpball(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(flipper_button) { update_display(); } + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void phpball_state::update_display() +{ + // rectangular LEDs under LEDs D,F and E,G are directly connected + // to the left and right flipper buttons - output them to 10.a and 9.a + u16 in1 = m_inputs[1]->read() << 7 & 0x600; + m_display->matrix((m_r & 0x1ff) | in1, m_o); +} + +void phpball_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R9: input mux + m_inp_mux = data >> 9 & 1; + + // R0-R2: digit select + // R0-R8: led select + m_r = data; + update_display(); +} + +void phpball_state::write_o(u16 data) +{ + // O0-O6: digit segment/led data + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 phpball_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[1]->read() | read_inputs(1); +} + +// config + +static INPUT_PORTS_START( phpball ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Plunger") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // Vss! + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) +INPUT_PORTS_END + +void phpball_state::phpball(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(phpball_state::read_k)); + m_maincpu->r().set(FUNC(phpball_state::write_r)); + m_maincpu->o().set(FUNC(phpball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_phpball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( phpball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) ) + + 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_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Super Sports-4 + * TMS1100 MP1219 (no decap) + * 4 7seg LEDs, 49 other LEDs, 1-bit sound + + The game is very similar to t3in1sa, even parts of the ROM match. But by + the time that one was released (in 1983 or 1984), U.S. Games did not exist + anymore. I suspect t3in1sa was programmed by the same (Hong Kong) company. + + This handheld includes 4 games: Basketball, Football, Soccer, Hockey. + MAME external artwork is needed for the switchable overlays. + +***************************************************************************/ + +class ssports4_state : public hh_tms1k_state +{ +public: + ssports4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ssports4(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ssports4_state::update_display() +{ + // note: R2 is an extra column + m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); +} + +void ssports4_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: led select/data + // R0,R1 and R8,R9 are 7segs + m_r = data; + update_display(); +} + +void ssports4_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 ssports4_state::read_k() +{ + // input mux is from R0,1,5,8,9 and O7 + m_inp_mux = (m_r & 3) | (m_r >> 3 & 4) | (m_r >> 5 & 0x18) | (m_o >> 2 & 0x20); + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ssports4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_16WAY PORT_NAME("P1 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_16WAY PORT_NAME("P1 Up-Right / Info") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_16WAY PORT_NAME("P1 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_16WAY PORT_NAME("P1 O.P.") // offensive player (modifier button) + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Right / Info") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 O.P.") + + PORT_START("IN.5") // O7 + PORT_CONFNAME( 0x03, 0x00, "Game Select" ) + PORT_CONFSETTING( 0x02, "Basketball" ) + PORT_CONFSETTING( 0x00, "Football" ) + PORT_CONFSETTING( 0x01, "Soccer" ) + PORT_CONFSETTING( 0x03, "Hockey" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ssports4_state::ssports4(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ssports4_state::read_k)); + m_maincpu->r().set(FUNC(ssports4_state::write_r)); + m_maincpu->o().set(FUNC(ssports4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x303, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_ssports4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssports4 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_ssports4_output.bin", 0, 0x20, CRC(cd6f162f) SHA1(3348edb697e996b5ab82be54076b9cd444e0f2b1) ) +ROM_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 xl25(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(k4_button) { update_halt(); } + +protected: + virtual void machine_reset() override; + +private: + void update_halt(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void xl25_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + update_halt(); +} + +// 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() & 4)); + m_maincpu->set_input_line(INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE); +} + +void xl25_state::update_display() +{ + m_display->matrix(m_r, m_o >> 1); +} + +void xl25_state::write_r(u16 data) +{ + // R0-R9: input mux, led select + m_inp_mux = data; + m_r = data; + update_display(); +} + +void xl25_state::write_o(u16 data) +{ + // O1-O3: led data + m_o = data; + update_display(); + + // O6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // O5(+K4): MCU halt + update_halt(); +} + +u8 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + 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, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void xl25_state::xl25(machine_config &config) +{ + // basic machine hardware + TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=5.6K, C=47pF + m_maincpu->k().set(FUNC(xl25_state::read_k)); + m_maincpu->r().set(FUNC(xl25_state::write_r)); + m_maincpu->o().set(FUNC(xl25_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 3); + config.set_default_layout(layout_xl25); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( xl25 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp4486a", 0x0000, 0x0400, CRC(bd84b515) SHA1(377fcc68a517260acd51eb9746cd62914a75d739) ) + + ROM_REGION( 922, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000c_xl25_micro.pla", 0, 922, CRC(8823e7f2) SHA1(676b0eace9d8730f2caa9087e8c51e540c7fabf8) ) + ROM_REGION( 558, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000c_xl25_output.pla", 0, 558, CRC(06ecc6e0) SHA1(e0fa1b9388948197b4de2edd3cd02fbde1dbabbb) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE ) + +COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // *** +CONS( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE ) + +COMP( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8 (Multi 8)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** +COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // *** +CONS( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ebball2, 0, 0, ebball2, ebball2, ebball2_state, empty_init, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ebball3, 0, 0, ebball3, ebball3, ebball3_state, empty_init, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, esbattle, 0, 0, esbattle, esbattle, esbattle_state, empty_init, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, blastit, 0, 0, blastit, blastit, blastit_state, empty_init, "Entex", "Blast It", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, einvader, 0, 0, einvader, einvader, einvader_state, empty_init, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, empty_init, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE ) +COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE ) + +COMP( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, elecbowl_state, empty_init, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // *** + +COMP( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons - Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** + +CONS( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +CONS( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // *** +CONS( 1977, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** +CONS( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** +CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** +CONS( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // *** + +CONS( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // *** +CONS( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, merlina, merlin, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** +CONS( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +CONS( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +CONS( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot - Electronic Pool", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure - The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie - The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, tandy12, 0, 0, tandy12, tandy12, tandy12_state, empty_init, "Tandy Corporation", "Tandy-12: Computerized Arcade", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** +CONS( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1976, speechp, 0, 0, speechp, speechp, speechp_state, empty_init, "Telesensory Systems, Inc.", "Speech+", MACHINE_SUPPORTS_SAVE ) + +COMP( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1975 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti125076, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, wizatron, 0, 0, wizatron, wizatron, wizatron_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1978, lilprof78, lilprof, 0, lilprof78, lilprof78, lilprof78_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, timaze, 0, 0, timaze, timaze, timaze_state, empty_init, "Texas Instruments", "unknown electronic maze game (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state, empty_init, "Texas Instruments", "Electronic Digital Thermostat", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) + +CONS( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1989, copycatm2, copycat, 0, copycatm2, copycatm2, copycatm2_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "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, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_tms1k.h b/src/mame/misc_handheld/hh_tms1k.h new file mode 100644 index 00000000000..7d9904e4377 --- /dev/null +++ b/src/mame/misc_handheld/hh_tms1k.h @@ -0,0 +1,73 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + TMS1000 MCU series tabletops/handhelds or other simple devices. + +*/ + +#ifndef MAME_INCLUDES_HH_TMS1K_H +#define MAME_INCLUDES_HH_TMS1K_H + +#pragma once + +#include "cpu/tms1000/tms1000.h" +#include "cpu/tms1000/tms1000c.h" +#include "cpu/tms1000/tms1100.h" +#include "cpu/tms1000/tms1400.h" +#include "cpu/tms1000/tms0970.h" +#include "cpu/tms1000/tms0980.h" +#include "cpu/tms1000/tms0270.h" +#include "cpu/tms1000/tp0320.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + + +class hh_tms1k_state : public driver_device +{ +public: + hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), + m_out_power(*this, "power") + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + virtual DECLARE_INPUT_CHANGED_MEMBER(power_button); + + template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } + template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<18> m_inputs; // max 18 + output_finder<> m_out_power; // power state, eg. led + + // misc common + u16 m_r = 0U; // MCU R-pins data + u16 m_o = 0U; // MCU O-pins data + u32 m_inp_mux = 0U; // multiplexed inputs mask + bool m_power_on = false; + + u32 m_grid = 0U; // VFD/LED current row data + u32 m_plate = 0U; // VFD/LED current column data + + u8 read_inputs(int columns); + u8 read_rotated_inputs(int columns, u8 rowmask = 0xf); + virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off); + virtual void power_off(); + void set_power(bool state); + void switch_change(int sel, u32 mask, bool next); +}; + + +#endif // MAME_INCLUDES_HH_TMS1K_H diff --git a/src/mame/misc_handheld/hh_ucom4.cpp b/src/mame/misc_handheld/hh_ucom4.cpp new file mode 100644 index 00000000000..d270d5ce7c2 --- /dev/null +++ b/src/mame/misc_handheld/hh_ucom4.cpp @@ -0,0 +1,3060 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton, Sean Riddle +/*************************************************************************** + +NEC uCOM4 MCU tabletops/handhelds or other simple devices, +most of them (emulated ones) are VFD electronic games/toys. + +known chips: + + serial device etc. +---------------------------------------------------------------- + 055 uPD546C 1978, Fidelity Checker Challenger (CR) -> fidel_checkc2.cpp + + @017 uPD552C 1979, Bambino UFO Master-Blaster Station (ET-02) + @042 uPD552C 1980, Tomy Cosmic Combat (TN-??) + @043 uPD552C 1979, Bambino Kick The Goal Soccer (ET-10) + *044 uPD552C 1979, Bambino Lucky Puck Ice Hockey (ET-08) + @048 uPD552C 1980, Tomy Tennis (TN-04) + @049 uPD552C 1981, Bambino Safari (ET-11) + @054 uPD552C 1980, Epoch Invader From Space + + @031 uPD553C 1979, Bambino Superstar Football (ET-03) + @049 uPD553C 1979, Mego Mini-Vid: Break Free + @055 uPD553C 1980, Bambino Space Laser Fight (ET-12) + *073 uPD553C 1980, Sony ST-J75 FM Stereo Tuner + @080 uPD553C 1980, Epoch Electronic Football + *102 uPD553C 1981, Bandai Block Out + @153 uPD553C 1981, Epoch Galaxy II + @160 uPD553C 1982, Tomy Pac Man (TN-08) + *167 uPD553C 1982, Sony SL models (betamax) (have dump) + @170 uPD553C 1982, Bandai Crazy Climber + @192 uPD553C 1982, Tomy Scramble (TN-10) + @202 uPD553C 1982, Epoch Astro Command + @206 uPD553C 1982, Epoch Dracula + *207 uPD553C 1982, Sony SL-J30 (tape/cd deck) + @209 uPD553C 1982, Tomy Caveman (TN-12) + @258 uPD553C 1984, Tomy Alien Chase (TN-16) + *296 uPD553C 1984, Epoch Computer Beam Gun Professional + + @511 uPD557LC 1980, Takatoku Toys Game Robot 9/Mego Fabulous Fred + @512 uPD557LC 1980, Castle Toy Tactix + @513 uPD557LC 1980, Castle Toy Name That Tune + + @060 uPD650C 1979, Mattel Computer Gin + 085 uPD650C 1980, Roland TR-808 -> roland_tr808.cpp + *127 uPD650C 198?, Sony OA-S1100 Typecorder (subcpu, have dump) + 128 uPD650C 1981, Roland TR-606 -> roland_tr606.cpp + 133 uPD650C 1982, Roland TB-303 -> roland_tb303.cpp + + (* means undumped unless noted, @ denotes it's in this driver) + + +Commonly used VFD(vacuum fluorescent display) are by NEC or Futaba. + +NEC FIP9AM20T (example, Epoch Astro Command) + grcss + +FIP = fluorescent indicator panel +g = number of grids +r = revision of the VFD +c = custom display +s = unique display part number + +============================================================================ + +ROM source notes when dumped from another publisher, but confident it's the same: +- astrocmd: Tandy Astro Command +- caveman: Tandy Caveman +- grobot9: Mego Fabulous Fred + +TODO: +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/ucom4/ucom4.h" +#include "video/pwm.h" +#include "video/hlcd0515.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork (complete) +#include "ctntune.lh" // clickable +#include "efball.lh" +#include "grobot9.lh" // clickable +#include "mcompgin.lh" +#include "mvbfree.lh" +#include "tactix.lh" // clickable + +// internal artwork (bezel overlay) +#include "tmtennis.lh" + +//#include "hh_ucom4_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_ucom4_state : public driver_device +{ +public: + hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_port[9] = { }; // MCU port A-I write data (optional) + u8 m_int = 0; // MCU INT pin state + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u32 m_plate = 0; // VFD current column data + + u8 read_inputs(int columns); + void refresh_interrupts(void); + void set_interrupt(int state); + + enum + { + PORTA = 0, + PORTB, + PORTC, + PORTD, + PORTE, + PORTF, + PORTG, + PORTH, + PORTI + }; +}; + + +// machine start/reset + +void hh_ucom4_state::machine_start() +{ + // register for savestates + save_item(NAME(m_port)); + save_item(NAME(m_int)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_ucom4_state::machine_reset() +{ + refresh_interrupts(); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_ucom4_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + +// interrupt handling + +void hh_ucom4_state::refresh_interrupts() +{ + m_maincpu->set_input_line(0, m_int ? ASSERT_LINE : CLEAR_LINE); +} + +void hh_ucom4_state::set_interrupt(int state) +{ + state = state ? 1 : 0; + + if (state != m_int) + { + if (machine().phase() >= machine_phase::RESET) + m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); + m_int = state; + } +} + +INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line) +{ + set_interrupt(newval); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Bambino UFO Master-Blaster Station (manufactured in Japan) + * PCB label Emix Corp. ET-02 + * NEC uCOM-44 MCU, label EMIX D552C 017 + * cyan VFD display Emix-101, with blue color overlay + + This is Bambino's first game, it is not known if ET-01 exists. Emix Corp. + wasn't initially a toy company, the first release was through Tomy. Emix + created the Bambino brand afterwards. It is claimed to be the first + computerized VFD game (true, unless TI Speak & Spell or M.E.M. Memoquiz + from 1978 are considered VFD games) + + known releases: + - Japan: "Missile Guerilla Warfare Maneuvers", published by Tomy + - World: UFO Master-Blaster Station, published by Bambino + +***************************************************************************/ + +class ufombs_state : public hh_ucom4_state +{ +public: + ufombs_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ufombs(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void ufombs_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3); + m_display->matrix(grid, plate); +} + +void ufombs_state::grid_w(offs_t offset, u8 data) +{ + // F,G,H0: vfd grid + int shift = (offset - PORTF) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ufombs_state::plate_w(offs_t offset, u8 data) +{ + // C,D012,I: vfd plate + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ufombs_state::speaker_w(u8 data) +{ + // E01: speaker out + m_speaker->level_w(data & 3); +} + +// config + +static INPUT_PORTS_START( ufombs ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("IN.0", 0x0a, EQUALS, 0x00) // pad in the middle, pressed when joystick is centered + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + + PORT_START("IN.1") // port B + PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ufombs_state::ufombs(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(ufombs_state::plate_w)); + m_maincpu->write_d().set(FUNC(ufombs_state::plate_w)); + m_maincpu->write_e().set(FUNC(ufombs_state::speaker_w)); + m_maincpu->write_f().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_g().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_h().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_i().set(FUNC(ufombs_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(243, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 10); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ufombs ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) ) + + ROM_REGION( 222395, "screen", 0) + ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Superstar Football (manufactured in Japan) + * PCB label Emix Corp. ET-03 + * NEC uCOM-43 MCU, label D553C 031 + * cyan VFD display Emix-102, with bezel + + The game was rereleased in 1982 as Classic Football (ET-0351), with an + improved cyan/green/red VFD. + + Press the Kick button to start the game, an automatic sequence follows. + Then choose a formation(A,B,C) and either pass the ball, and/or start + running. For more information, refer to the official manual. + +***************************************************************************/ + +class ssfball_state : public hh_ucom4_state +{ +public: + ssfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ssfball(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_b_r(); +}; + +// handlers + +void ssfball_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); + m_display->matrix(m_grid, plate); +} + +void ssfball_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid 0-7(,8) + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ssfball_state::plate_w(offs_t offset, u8 data) +{ + m_port[offset] = data; + + // E,F,G,H,I(not all!): vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // F3,G3: input mux + speaker + m_inp_mux = (m_port[PORTF] >> 3 & 1) | (m_port[PORTG] >> 2 & 2); + m_speaker->level_w(m_inp_mux); + + // E3: vfd grid 8 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +u8 ssfball_state::input_b_r() +{ + // B: input port 2, where B3 is multiplexed + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + [A] [B] [C] [PASS] [KICK/ + ^FORMATION^ DISPLAY] + + [^] + [<>] + (game lvl sw) [v] + 1<---OFF--->2 +*/ + +static INPUT_PORTS_START( ssfball ) + PORT_START("IN.0") // F3 port B3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Formation A") + + PORT_START("IN.1") // G3 port B3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Game Level" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.2") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Kick/Display") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Formation C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Formation B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed, handled in input_b_r + + PORT_START("IN.3") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pass") +INPUT_PORTS_END + +void ssfball_state::ssfball(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.3"); + m_maincpu->read_b().set(FUNC(ssfball_state::input_b_r)); + m_maincpu->write_c().set(FUNC(ssfball_state::grid_w)); + m_maincpu->write_d().set(FUNC(ssfball_state::grid_w)); + m_maincpu->write_e().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_f().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_g().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_h().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_i().set(FUNC(ssfball_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 482); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) + + ROM_REGION( 331352, "screen", 0) + ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) ) +ROM_END + +ROM_START( bmcfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) + + ROM_REGION( 331352, "screen", 0) + ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Kick The Goal Soccer + * PCB label Emix Corp. ET-10/08 (PCB is for 2 possible games) + * NEC uCOM-44 MCU, label D552C 043 + * cyan VFD display Emix-105, with bezel overlay + + Press the Display button twice to start the game. Action won't start until + player 1 presses one of the directional keys. In 2-player mode, player 2 + controls the goalkeeper, defensive players are still controlled by the CPU. + +***************************************************************************/ + +class bmsoccer_state : public hh_ucom4_state +{ +public: + bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bmsoccer(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_a_r(); +}; + +// handlers + +void bmsoccer_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2); + m_display->matrix(m_grid, plate); +} + +void bmsoccer_state::grid_w(offs_t offset, u8 data) +{ + // C01: input mux + if (offset == PORTC) + m_inp_mux = data & 3; + + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmsoccer_state::plate_w(offs_t offset, u8 data) +{ + // G3: speaker out + if (offset == PORTG) + m_speaker->level_w(data >> 3 & 1); + + // E012,F012,G012,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // E3: grid 8 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +u8 bmsoccer_state::input_a_r() +{ + // port A: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( bmsoccer ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Ball-carrier Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("Ball-carrier Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Ball-carrier Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Ball-carrier Up") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Left") // note: swap buttons if viewed from the same angle as player 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // port B + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Display/Banana Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") +INPUT_PORTS_END + +void bmsoccer_state::bmsoccer(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set(FUNC(bmsoccer_state::input_a_r)); + m_maincpu->read_b().set_ioport("IN.2"); + m_maincpu->write_c().set(FUNC(bmsoccer_state::grid_w)); + m_maincpu->write_d().set(FUNC(bmsoccer_state::grid_w)); + m_maincpu->write_e().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_f().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_g().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_h().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_i().set(FUNC(bmsoccer_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(271, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmsoccer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) ) + + ROM_REGION( 273796, "screen", 0) + ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Safari (manufactured in Japan) + * PCB label Emix Corp. ET-11 + * NEC uCOM-44 MCU, label EMIX D552C 049 + * cyan VFD display Emix-108 + +***************************************************************************/ + +class bmsafari_state : public hh_ucom4_state +{ +public: + bmsafari_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bmsafari(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void bmsafari_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3); + m_display->matrix(grid, plate); +} + +void bmsafari_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmsafari_state::plate_w(offs_t offset, u8 data) +{ + // E012,H,I: vfd plate + int shift = (offset == PORTE) ? 8 : (offset - PORTH) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // E3: grid 0 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +void bmsafari_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +// config + +static INPUT_PORTS_START( bmsafari ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x01, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY +INPUT_PORTS_END + +void bmsafari_state::bmsafari(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(bmsafari_state::grid_w)); + m_maincpu->write_d().set(FUNC(bmsafari_state::grid_w)); + m_maincpu->write_e().set(FUNC(bmsafari_state::plate_w)); + m_maincpu->write_g().set(FUNC(bmsafari_state::speaker_w)); + m_maincpu->write_h().set(FUNC(bmsafari_state::plate_w)); + m_maincpu->write_i().set(FUNC(bmsafari_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(248, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 10); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmsafari ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) ) + + ROM_REGION( 275386, "screen", 0) + ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Space Laser Fight (manufactured in Japan) + * PCB label Emix Corp. ET-12 + * NEC uCOM-43 MCU, label D553C 055 + * cyan VFD display Emix-104, with blue or green color overlay + + This is basically a revamp of their earlier Boxing game (ET-06), case and + buttons are exactly the same. + +***************************************************************************/ + +class splasfgt_state : public hh_ucom4_state +{ +public: + splasfgt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void splasfgt(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_b_r(); +}; + +// handlers + +void splasfgt_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); + m_display->matrix(m_grid, plate); +} + +void splasfgt_state::grid_w(offs_t offset, u8 data) +{ + // G,H,I0: vfd grid + int shift = (offset - PORTG) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // G(grid 0-3): input mux + m_inp_mux = m_grid & 0xf; + + // I2: vfd plate 6 + if (offset == PORTI) + plate_w(4 + PORTC, data >> 2 & 1); + else + update_display(); +} + +void splasfgt_state::plate_w(offs_t offset, u8 data) +{ + // F01: speaker out + if (offset == PORTF) + m_speaker->level_w(data & 3); + + // C,D,E,F23(,I2): vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +u8 splasfgt_state::input_b_r() +{ + // B: multiplexed buttons + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + * left = P1 side * * right = P2 side * (note: in 1P mode, switch sides between turns) + + [ JUMP ] [ HIGH ] (players sw) [ HIGH ] [ JUMP ] + 1<--->2 [START/ + [STRAIGHT] [MEDIUM] RESET] [MEDIUM] [STRAIGHT] + 1<---OFF--->2 + [ STOOP ] [ LOW ] (skill lvl sw) [ LOW ] [ STOOP ] +*/ + +static INPUT_PORTS_START( splasfgt ) + PORT_START("IN.0") // G0 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Position Straight") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Position Jump") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Position Stoop") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // G1 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Beam High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Beam Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Beam Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Position Straight") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Position Jump") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Position Stoop") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // G3 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Beam High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Beam Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Beam Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void splasfgt_state::splasfgt(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.4"); + m_maincpu->read_b().set(FUNC(splasfgt_state::input_b_r)); + m_maincpu->write_c().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_d().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_e().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_f().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_g().set(FUNC(splasfgt_state::grid_w)); + m_maincpu->write_h().set(FUNC(splasfgt_state::grid_w)); + m_maincpu->write_i().set(FUNC(splasfgt_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 476); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( splasfgt ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) ) + + ROM_REGION( 246609, "screen", 0) + ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Crazy Climber (manufactured in Japan) + * PCB labels SM-020/SM-021 + * NEC uCOM-43 MCU, label D553C 170 + * cyan/red/green VFD display NEC FIP6AM2-T no. 1-8 2, with partial color overlay and bezel + + known releases: + - Japan: FL Crazy Climbing, published by Bandai + - USA: Crazy Climber, published by Bandai + +***************************************************************************/ + +class bcclimbr_state : public hh_ucom4_state +{ +public: + bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bcclimbr(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void bcclimbr_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); + u32 plate = bitswap<24>(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bcclimbr_state::grid_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // H,I01: vfd grid + int shift = (offset - PORTH) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bcclimbr_state::plate_w(offs_t offset, u8 data) +{ + // C,D,E,F: vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( bcclimbr ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) +INPUT_PORTS_END + +void bcclimbr_state::bcclimbr(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_d().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_e().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_f().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_g().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_h().set(FUNC(bcclimbr_state::grid_w)); + m_maincpu->write_i().set(FUNC(bcclimbr_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(310, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bcclimbr ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) ) + + ROM_REGION( 219971, "screen", 0) + ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) ) +ROM_END + + + + + +/*************************************************************************** + + Castle Toy Tactix + * NEC uCOM-43 MCU, label D557LC 512 + * 16 LEDs behind buttons + + Tactix is similar to Merlin, for 1 or 2 players. In 2-player mode, simply + don't press the Comp Turn button. The four included minigames are: + 1: Capture (reversi) + 2: Jump-Off (peg solitaire) + 3: Triple Play (3 in a row) + 4: Concentration (memory) + +***************************************************************************/ + +class tactix_state : public hh_ucom4_state +{ +public: + tactix_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tactix(machine_config &config); + +private: + void leds_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void tactix_state::leds_w(offs_t offset, u8 data) +{ + // D,F: 4*4 led matrix + m_port[offset] = data; + m_display->matrix(m_port[PORTF], m_port[PORTD]); +} + +void tactix_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +void tactix_state::input_w(offs_t offset, u8 data) +{ + // C,E0: input mux + m_port[offset] = data; + m_inp_mux = (m_port[PORTE] << 4 & 0x10) | m_port[PORTC]; +} + +u8 tactix_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( tactix ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 13") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 14") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button 11") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 15") + + PORT_START("IN.3") // C3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 12") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 16") + + PORT_START("IN.4") // E0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("New Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Comp Turn") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tactix_state::tactix(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 200000); // approximation + m_maincpu->read_a().set(FUNC(tactix_state::input_r)); + m_maincpu->write_c().set(FUNC(tactix_state::input_w)); + m_maincpu->write_d().set(FUNC(tactix_state::leds_w)); + m_maincpu->write_e().set(FUNC(tactix_state::input_w)); + m_maincpu->write_f().set(FUNC(tactix_state::leds_w)); + m_maincpu->write_g().set(FUNC(tactix_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 4); + config.set_default_layout(layout_tactix); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tactix ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) ) +ROM_END + + + + + +/*************************************************************************** + + Castle Toy Name That Tune + * NEC uCOM-43 MCU, label D557LC 513 + * 2 lamps, 1 7seg(+2 fake 7segs above a power-on lamp, showing "0") + + This is a tabletop multiplayer game. Players are meant to place a bid, + and guess the song (by announcing it to everyone). + +***************************************************************************/ + +class ctntune_state : public hh_ucom4_state +{ +public: + ctntune_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ctntune(machine_config &config); + + // start button powers unit back on + DECLARE_INPUT_CHANGED_MEMBER(start_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } + +private: + void update_display(); + void _7seg_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void ctntune_state::update_display() +{ + u8 sel = m_port[PORTD] >> 3 & 1; // turn off display when power is off + u8 lamps = m_port[PORTD] & 3; + u8 digit = (m_port[PORTF] << 4 | m_port[PORTE]) & 0x7f; + + m_display->matrix(sel, lamps << 7 | digit); +} + +void ctntune_state::_7seg_w(offs_t offset, u8 data) +{ + // E,F012: 7seg data, F3: N/C + m_port[offset] = data; + update_display(); +} + +void ctntune_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +void ctntune_state::input_w(offs_t offset, u8 data) +{ + // D3: trigger power-off on falling edge + if (offset == PORTD && ~data & m_port[PORTD] & 8) + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + + // C,D23: input mux + // D0,D1: yellow, red lamp + m_port[offset] = data; + m_inp_mux = (m_port[PORTD] << 2 & 0x30) | m_port[PORTC]; + update_display(); +} + +u8 ctntune_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ctntune ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Button 1") // defaults to keyboard Z row + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Button 5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Button 9") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Button 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("Button 10") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + + PORT_START("IN.3") // C3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Button 4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Button 8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") + + PORT_START("IN.4") // D2 port A + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Play Button") + + PORT_START("IN.5") // D3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, ctntune_state, start_button, 0) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ctntune_state::ctntune(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 200000); // approximation + m_maincpu->read_a().set(FUNC(ctntune_state::input_r)); + m_maincpu->write_c().set(FUNC(ctntune_state::input_w)); + m_maincpu->write_d().set(FUNC(ctntune_state::input_w)); + m_maincpu->write_e().set(FUNC(ctntune_state::_7seg_w)); + m_maincpu->write_f().set(FUNC(ctntune_state::_7seg_w)); + m_maincpu->write_g().set(FUNC(ctntune_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 7+2); + m_display->set_segmask(1, 0x7f); + config.set_default_layout(layout_ctntune); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ctntune ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d557lc-513", 0x0000, 0x0800, CRC(cd85ee23) SHA1(32b8fc8cb92fc1fd27da9148788a09d3bcd46a92) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Invader From Space (manufactured in Japan) + * PCB labels 36010(A/B) + * NEC uCOM-44 MCU, label D552C 054 + * cyan VFD display NEC FIP9AM18T tube no. 0D, with color overlay + + known releases: + - USA: Invader From Space, published by Epoch + - UK: Invader From Space, published by Grandstand + +***************************************************************************/ + +class invspace_state : public hh_ucom4_state +{ +public: + invspace_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void invspace(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void invspace_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8); + m_display->matrix(grid, plate); +} + +void invspace_state::grid_w(offs_t offset, u8 data) +{ + // I0: speaker out + if (offset == PORTI) + m_speaker->level_w(data & 1); + + // C,D,I1: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void invspace_state::plate_w(offs_t offset, u8 data) +{ + // E,F,G,H123: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( invspace ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void invspace_state::invspace(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(invspace_state::grid_w)); + m_maincpu->write_d().set(FUNC(invspace_state::grid_w)); + m_maincpu->write_e().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_f().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_g().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_h().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_i().set(FUNC(invspace_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(289, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( invspace ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) ) + + ROM_REGION( 110899, "screen", 0) + ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Electronic Football (manufactured in Japan) + * PCB labels 36020(A/B/C) + * NEC uCOM-43 MCU, label D553C 080 + * cyan VFD display NEC FIP10AM15T tube no. 0F, with bezel overlay + + known releases: + - USA: Electronic Football (aka Pro-Bowl Football), published by Epoch + - Japan: American Football, published by Epoch + +***************************************************************************/ + +class efball_state : public hh_ucom4_state +{ +public: + efball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void efball(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void efball_state::update_display() +{ + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7); + m_display->matrix(m_grid, plate); +} + +void efball_state::grid_w(offs_t offset, u8 data) +{ + // H2: speaker out + if (offset == PORTH) + m_speaker->level_w(data >> 2 & 1); + + // F,G,H01: vfd grid + int shift = (offset - PORTF) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void efball_state::plate_w(offs_t offset, u8 data) +{ + // D,E,I: vfd plate + int shift = (offset == PORTI) ? 8 : (offset - PORTD) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( efball ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Down-Field") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P1 Score-Time") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") + + PORT_START("IN.2") // port C + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Kick Return") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") +INPUT_PORTS_END + +void efball_state::efball(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->read_c().set_ioport("IN.2"); + m_maincpu->write_d().set(FUNC(efball_state::plate_w)); + m_maincpu->write_e().set(FUNC(efball_state::plate_w)); + m_maincpu->write_f().set(FUNC(efball_state::grid_w)); + m_maincpu->write_g().set(FUNC(efball_state::grid_w)); + m_maincpu->write_h().set(FUNC(efball_state::grid_w)); + m_maincpu->write_i().set(FUNC(efball_state::plate_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 11); + config.set_default_layout(layout_efball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( efball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Galaxy II (manufactured in Japan) + * PCB labels 19096/96062 + * NEC uCOM-43 MCU, label D553C 153 + * cyan/red VFD display NEC FIP10xM20T, with color overlay. x = multiple VFD + revisions exist, with different graphics: rev B no. 1-8, rev. D no. 2-21. + + known releases: + - USA: Galaxy II, published by Epoch + - Japan: Astro Wars, published by Epoch + - UK: Astro Wars, published by Grandstand + +***************************************************************************/ + +class galaxy2_state : public hh_ucom4_state +{ +public: + galaxy2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void galaxy2b(machine_config &config); + void galaxy2(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void galaxy2_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + u16 plate = bitswap<16>(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9); + m_display->matrix(grid, plate); +} + +void galaxy2_state::grid_w(offs_t offset, u8 data) +{ + // E3: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 3 & 1); + + // C,D,E01: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void galaxy2_state::plate_w(offs_t offset, u8 data) +{ + // F,G,H,I: vfd plate + int shift = (offset - PORTF) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( galaxy2 ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void galaxy2_state::galaxy2(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_d().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_e().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_f().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_g().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_h().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_i().set(FUNC(galaxy2_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(304, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 15); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void galaxy2_state::galaxy2b(machine_config &config) +{ + galaxy2(config); + + // video hardware + screen_device *screen = subdevice("screen"); + screen->set_size(306, 1080); + screen->set_visarea_full(); +} + +// roms + +ROM_START( galaxy2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) + + ROM_REGION( 325057, "screen", 0) + ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) ) +ROM_END + +ROM_START( galaxy2b ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) + + ROM_REGION( 266377, "screen", 0) + ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Astro Command (manufactured in Japan) + * PCB labels 96111/96112 + * NEC uCOM-43 MCU, label D553C 202 + * cyan/red VFD display NEC FIP9AM20T no. 42-42, with color overlay + bezel + + known releases: + - Japan: Astro Command, published by Epoch + - USA: Astro Command, published by Tandy + - UK: Scramble, published by Grandstand + +***************************************************************************/ + +class astrocmd_state : public hh_ucom4_state +{ +public: + astrocmd_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void astrocmd(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void astrocmd_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); + m_display->matrix(grid, plate); +} + +void astrocmd_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void astrocmd_state::plate_w(offs_t offset, u8 data) +{ + // E01,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + if (offset == PORTE) + { + // E2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // E3: vfd grid 8 + grid_w(offset, data >> 3 & 1); + } + else + update_display(); +} + +// config + +static INPUT_PORTS_START( astrocmd ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Missile") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void astrocmd_state::astrocmd(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(astrocmd_state::grid_w)); + m_maincpu->write_d().set(FUNC(astrocmd_state::grid_w)); + m_maincpu->write_e().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_f().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_g().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_h().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_i().set(FUNC(astrocmd_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 525); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( astrocmd ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) ) + + ROM_REGION( 335362, "screen", 0) + ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Dracula (manufactured in Japan) + * PCB label 96121 + * NEC uCOM-43 MCU, label D553C 206 + * cyan/red/green VFD display NEC FIP8BM20T no. 2-42 + + known releases: + - Japan: Dracula House, yellow case, published by Epoch + - USA: Dracula, red case, published by Epoch + - Other: Dracula, yellow case, published by Hales + +***************************************************************************/ + +class edracula_state : public hh_ucom4_state +{ +public: + edracula_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void edracula(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void edracula_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void edracula_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void edracula_state::plate_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // E,F,G,H,I01: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( edracula ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void edracula_state::edracula(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(edracula_state::grid_w)); + m_maincpu->write_d().set(FUNC(edracula_state::grid_w)); + m_maincpu->write_e().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_f().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_g().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_h().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_i().set(FUNC(edracula_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 526); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( edracula ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) + + ROM_REGION( 794532, "screen", 0) + ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Computer Gin + * NEC uCOM-43 MCU, label D650C 060 (die label same) + * Hughes HLCD0530 LCD driver, 5 by 14 segments LCD panel, no sound + +***************************************************************************/ + +class mcompgin_state : public hh_ucom4_state +{ +public: + mcompgin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag), + m_lcd(*this, "lcd") + { } + + void mcompgin(machine_config &config); + +private: + required_device m_lcd; + + void lcd_output_w(offs_t offset, u32 data); + void lcd_w(u8 data); +}; + +// handlers + +void mcompgin_state::lcd_output_w(offs_t offset, u32 data) +{ + // uses ROW0-4, COL11-24 + m_display->matrix(1 << offset, data); +} + +void mcompgin_state::lcd_w(u8 data) +{ + // E0: HLCD0530 _CS + // E1: HLCD0530 clock + // E2: HLCD0530 data in + m_lcd->cs_w(data & 1); + m_lcd->data_w(data >> 2 & 1); + m_lcd->clock_w(data >> 1 & 1); +} + +// config + +static INPUT_PORTS_START( mcompgin ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Deal / Gin") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Discard") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Draw") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Compare") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Score") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void mcompgin_state::mcompgin(machine_config &config) +{ + // basic machine hardware + NEC_D650(config, m_maincpu, 400_kHz_XTAL); // TDK FCR400K + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_e().set(FUNC(mcompgin_state::lcd_w)); + + // video hardware + HLCD0530(config, m_lcd, 500); // C=0.01uF + m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); + + PWM_DISPLAY(config, m_display).set_size(8, 24); + + config.set_default_layout(layout_mcompgin); + + // no sound! +} + +// roms + +ROM_START( mcompgin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) ) +ROM_END + + + + + +/*************************************************************************** + + Mego Mini-Vid: Break Free (manufactured in Japan) + * PCB label Mego 79 rev F + * NEC uCOM-43 MCU, label D553C 049 + * cyan VFD display Futaba DM-4.5 91 + +***************************************************************************/ + +class mvbfree_state : public hh_ucom4_state +{ +public: + mvbfree_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void mvbfree(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void mvbfree_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + m_display->matrix(grid, plate); +} + +void mvbfree_state::grid_w(offs_t offset, u8 data) +{ + // E23,F,G,H: vfd grid + int shift = (offset - PORTE) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // E01: plate 0,1 + if (offset == PORTE) + plate_w(2 + PORTC, data & 3); + else + update_display(); +} + +void mvbfree_state::plate_w(offs_t offset, u8 data) +{ + // C,D(,E01): vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void mvbfree_state::speaker_w(u8 data) +{ + // I0: speaker out + m_speaker->level_w(data & 1); +} + +// config + +static INPUT_PORTS_START( mvbfree ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // port B + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) // unimplemented p1/p2 buttons + PORT_CONFNAME( 0x0c, 0x04, "Game Select") + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFSETTING( 0x08, "3" ) +INPUT_PORTS_END + +void mvbfree_state::mvbfree(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(mvbfree_state::plate_w)); + m_maincpu->write_d().set(FUNC(mvbfree_state::plate_w)); + m_maincpu->write_e().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_f().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_g().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_h().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(14, 10); + config.set_default_layout(layout_mvbfree); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mvbfree ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) ) +ROM_END + + + + + +/*************************************************************************** + + Takatoku Toys(T.T) Game Robot 9 「ゲームロボット九」 + * PCB label GAME ROBOT 7520 + * NEC uCOM-43 MCU, label TTGR-512 (die label NEC D557 511) + * 9 lamps behind buttons + + known releases: + - Japan: Game Robot 9, published by Takatoku Toys + - USA: Fabulous Fred - The Ultimate Electronic Game, published by Mego + - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as + 12-button version, a clone of Tandy-12) + + Accessories were included for some of the minigames. + +***************************************************************************/ + +class grobot9_state : public hh_ucom4_state +{ +public: + grobot9_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void grobot9(machine_config &config); + +private: + void lamps_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(u8 data); + u8 input_r(); +}; + +// handlers + +void grobot9_state::lamps_w(offs_t offset, u8 data) +{ + if (offset == PORTE) + { + // E1: speaker out + m_speaker->level_w(data >> 1 & 1); + + // E3: input mux high bit + m_inp_mux = (m_inp_mux & 7) | (data & 8); + } + + // D,F,E0: lamps + m_port[offset] = data; + m_display->matrix(1, m_port[PORTD] | m_port[PORTF] << 4 | m_port[PORTE] << 8); +} + +void grobot9_state::input_w(u8 data) +{ + // C012: input mux low + m_inp_mux = (m_inp_mux & 8) | (data & 7); +} + +u8 grobot9_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( grobot9 ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_W) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_E) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_D) PORT_NAME("Button 4") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_C) PORT_NAME("Button 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_X) PORT_NAME("Button 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_A) PORT_NAME("Button 8") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_S) PORT_NAME("Button 9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Rest") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Eighth Note") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // E3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Hit") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") + + PORT_START("IN.4") // INT + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_ucom4_state, single_interrupt_line, 0) PORT_NAME("Start-Pitch") +INPUT_PORTS_END + +void grobot9_state::grobot9(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 160000); // approximation + m_maincpu->read_a().set(FUNC(grobot9_state::input_r)); + m_maincpu->write_c().set(FUNC(grobot9_state::input_w)); + m_maincpu->write_d().set(FUNC(grobot9_state::lamps_w)); + m_maincpu->write_e().set(FUNC(grobot9_state::lamps_w)); + m_maincpu->write_f().set(FUNC(grobot9_state::lamps_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 9); + config.set_default_layout(layout_grobot9); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( grobot9 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Cosmic Combat (manufactured in Japan) + * PCB label 2E1019-E01 + * NEC uCOM-44 MCU, label D552C 042 + * cyan VFD display NEC FIP32AM18Y tube no. 0E, with color overlay + + known releases: + - USA: Cosmic Combat, published by Tomy + - Japan: Space Attack, published by Tomy + +***************************************************************************/ + +class tccombat_state : public hh_ucom4_state +{ +public: + tccombat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tccombat(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tccombat_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4); + u32 plate = bitswap<24>(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6); + m_display->matrix(grid, plate); +} + +void tccombat_state::grid_w(offs_t offset, u8 data) +{ + // I1: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 1 & 1); + + // C,D,I0: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tccombat_state::plate_w(offs_t offset, u8 data) +{ + // E,F123,G,H: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tccombat ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY +INPUT_PORTS_END + +void tccombat_state::tccombat(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_c().set(FUNC(tccombat_state::grid_w)); + m_maincpu->write_d().set(FUNC(tccombat_state::grid_w)); + m_maincpu->write_e().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_f().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_g().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_h().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_i().set(FUNC(tccombat_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(300, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tccombat ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) ) + + ROM_REGION( 210960, "screen", 0) + ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Tennis (manufactured in Japan) + * PCB label TOMY TN-04 TENNIS + * NEC uCOM-44 MCU, label D552C 048 + * cyan VFD display NEC FIP11AM15T tube no. 0F, with overlay + + The initial release of this game was in 1979, known as Pro-Tennis, + it has a D553 instead of D552, with just a little over 50% ROM used. + + Press the Serve button to start, then hit the ball by pressing one of the + positional buttons when the ball flies over it. + +***************************************************************************/ + +class tmtennis_state : public hh_ucom4_state +{ +public: + tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmtennis(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void port_e_w(u8 data); + u8 input_r(offs_t offset); +}; + +void tmtennis_state::machine_reset() +{ + hh_ucom4_state::machine_reset(); + set_clock(); +} + +// handlers + +void tmtennis_state::set_clock() +{ + // MCU clock is from an LC circuit oscillating by default at ~360kHz, + // but on PRO1, the difficulty switch puts a capacitor across the LC circuit + // to slow it down to ~260kHz. + m_maincpu->set_unscaled_clock((m_inputs[1]->read() & 0x100) ? 260000 : 360000); +} + +void tmtennis_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void tmtennis_state::grid_w(offs_t offset, u8 data) +{ + // G,H,I: vfd grid + int shift = (offset - PORTG) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtennis_state::plate_w(offs_t offset, u8 data) +{ + // C,D,F: vfd plate + int shift = (offset == PORTF) ? 8 : (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtennis_state::port_e_w(u8 data) +{ + // E01: input mux + // E2: speaker out + // E3: N/C + m_inp_mux = data & 3; + m_speaker->level_w(data >> 2 & 1); +} + +u8 tmtennis_state::input_r(offs_t offset) +{ + // A,B: multiplexed buttons + return ~read_inputs(2) >> (offset*4); +} + +// config + +/* Pro-Tennis physical button layout and labels are like this: + + * left = P2/CPU side * * right = P1 side * + + [SERVE] [1] [2] [3] [3] [2] [1] [SERVE] + [4] [5] [6] [6] [5] [4] + + PRACTICE<--PRO1-->PRO2 1PLAYER<--OFF-->2PLAYER +*/ + +static INPUT_PORTS_START( tmtennis ) + PORT_START("IN.0") // E0 port A/B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Serve") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Serve") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("P1 Button 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("P1 Button 4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Button 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Button 5") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Button 3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Button 6") + + PORT_START("IN.1") // E1 port A/B + PORT_CONFNAME( 0x101, 0x100, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tmtennis_state, difficulty_switch, 0) + PORT_CONFSETTING( 0x001, "Practice" ) + PORT_CONFSETTING( 0x100, "Pro 1" ) // -> difficulty_switch + PORT_CONFSETTING( 0x000, "Pro 2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Button 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Button 4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Button 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Button 5") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P2 Button 3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 6") +INPUT_PORTS_END + +void tmtennis_state::tmtennis(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 360000); // see set_clock + m_maincpu->read_a().set(FUNC(tmtennis_state::input_r)); + m_maincpu->read_b().set(FUNC(tmtennis_state::input_r)); + m_maincpu->write_c().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_d().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_e().set(FUNC(tmtennis_state::port_e_w)); + m_maincpu->write_f().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmtennis_state::grid_w)); + m_maincpu->write_h().set(FUNC(tmtennis_state::grid_w)); + m_maincpu->write_i().set(FUNC(tmtennis_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 417); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 12); + config.set_default_layout(layout_tmtennis); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmtennis ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) ) + + ROM_REGION( 204490, "screen", 0) + ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Pac-Man (manufactured in Japan) + * PCB label TN-08 2E108E01 + * NEC uCOM-43 MCU, label D553C 160 + * cyan/red/green VFD display NEC FIP8AM18T no. 2-21 + * bright yellow round casing + + known releases: + - Japan: Puck Man, published by Tomy + - USA: Pac Man, published by Tomy + - UK: Puckman (Tomy), and also published by Grandstand as Munchman + - Australia: Pac Man-1, published by Futuretronics + + The game will start automatically after turning it on. This Pac Man refuses + to eat dots with his butt, you can only eat them going right-to-left. + +***************************************************************************/ + +class tmpacman_state : public hh_ucom4_state +{ +public: + tmpacman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmpacman(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tmpacman_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; + m_display->matrix(grid, plate); +} + +void tmpacman_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmpacman_state::plate_w(offs_t offset, u8 data) +{ + // E1: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 1 & 1); + + // E023,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tmpacman ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // port B + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tmpacman_state::tmpacman(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 430_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(tmpacman_state::grid_w)); + m_maincpu->write_d().set(FUNC(tmpacman_state::grid_w)); + m_maincpu->write_e().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_f().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_h().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_i().set(FUNC(tmpacman_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 508); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmpacman ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) ) + + ROM_REGION( 230216, "screen", 0) + ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Scramble (manufactured in Japan) + * PCB label TN-10 2E114E01 + * NEC uCOM-43 MCU, label D553C 192 + * cyan/red/green VFD display NEC FIP10CM20T no. 2-41 + + known releases: + - World: Scramble, published by Tomy + - USA: Scramble, published by Tandy + - UK: Astro Blaster, published by Hales (Epoch Astro Command was named Scramble) + - Germany: Rambler, published by Tomy + +***************************************************************************/ + +class tmscramb_state : public hh_ucom4_state +{ +public: + tmscramb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmscramb(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tmscramb_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; + m_display->matrix(m_grid, plate); +} + +void tmscramb_state::grid_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // C,D,I01: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmscramb_state::plate_w(offs_t offset, u8 data) +{ + // E,F,G,H: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tmscramb ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tmscramb_state::tmscramb(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(tmscramb_state::grid_w)); + m_maincpu->write_d().set(FUNC(tmscramb_state::grid_w)); + m_maincpu->write_e().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_f().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_h().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_i().set(FUNC(tmscramb_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 556); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmscramb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) ) + + ROM_REGION( 243830, "screen", 0) + ROM_LOAD( "tmscramb.svg", 0, 243830, CRC(300b098a) SHA1(9fde58ac0f4e4cfea05301346cbf5b1ced9fe973) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Caveman (manufactured in Japan) + * PCB label TN-12 2E114E03 + * NEC uCOM-43 MCU, label D553C 209 + * cyan/red/green VFD display NEC FIP8AM20T no. 2-42 + + known releases: + - World: Caveman, published by Tomy + - USA: Caveman, published by Tandy + - UK: Cave Man - Jr. Caveman vs Dinosaur, published by Grandstand + +***************************************************************************/ + +class tcaveman_state : public hh_ucom4_state +{ +public: + tcaveman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tcaveman(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tcaveman_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; + m_display->matrix(grid, plate); +} + +void tcaveman_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tcaveman_state::plate_w(offs_t offset, u8 data) +{ + // E3: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 3 & 1); + + // E012,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tcaveman ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x08, "Professional" ) +INPUT_PORTS_END + +void tcaveman_state::tcaveman(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_c().set(FUNC(tcaveman_state::grid_w)); + m_maincpu->write_d().set(FUNC(tcaveman_state::grid_w)); + m_maincpu->write_e().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_f().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_g().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_h().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_i().set(FUNC(tcaveman_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 559); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tcaveman ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) ) + + ROM_REGION( 306952, "screen", 0) + ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Alien Chase (manufactured in Japan) + * PCB label TN-16 2E121B01 + * NEC uCOM-43 MCU, label D553C 258 + * red/green VFD display NEC FIP9AM24T, with color overlay, 2-sided* + + *Player one views the VFD from the front (grid+filament side) while the + opposite player views it from the back side (through the conductive traces), + basically a mirror-image. + + To start the game, simply press [UP]. Hold a joystick direction to move around. + +***************************************************************************/ + +class alnchase_state : public hh_ucom4_state +{ +public: + alnchase_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void alnchase(machine_config &config); + +private: + void output_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void alnchase_state::output_w(offs_t offset, u8 data) +{ + if (offset <= PORTE) + { + // C,D,E0: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // C0(grid 0): input enable PL1 + // D0(grid 4): input enable PL2 + m_inp_mux = (m_grid & 1) | (m_grid >> 3 & 2); + + // E1: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 1 & 1); + } + + if (offset >= PORTE) + { + // E23,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; + } + + m_display->matrix(m_grid, m_plate); +} + +u8 alnchase_state::input_r() +{ + // A: multiplexed buttons + return read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + POWER SOUND LEVEL PLAYER + ON ON PRO TWO START + o o | | + | | | | [joystick] + | | o o + OFF OFF AMA ONE GAME 0,1,2,3 + + 1 PLAYER SIDE + + other player side only has a joystick +*/ + +static INPUT_PORTS_START( alnchase ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // on non-mirrored view, swap P2 left/right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + + PORT_START("IN.2") // port B + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x02, "Professional" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void alnchase_state::alnchase(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set(FUNC(alnchase_state::input_r)); + m_maincpu->read_b().set_ioport("IN.2"); + m_maincpu->write_c().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_d().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_e().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_f().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_g().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_h().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_i().set(FUNC(alnchase_state::output_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(365, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alnchase ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-258", 0x0000, 0x0800, CRC(c5284ff5) SHA1(6a20aaacc9748f0e0335958f3cea482e36153704) ) + + ROM_REGION( 576864, "screen", 0) + ROM_LOAD( "alnchase.svg", 0, 576864, CRC(fe7c7078) SHA1(0d201eeaeb291ded14c0759d1d3d5b2491cf0792) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel Electronics", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** + +CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE ) + +// ***: 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, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/monty.cpp b/src/mame/misc_handheld/monty.cpp new file mode 100644 index 00000000000..8a2718a167a --- /dev/null +++ b/src/mame/misc_handheld/monty.cpp @@ -0,0 +1,296 @@ +// license:BSD-3-Clause +// copyright-holders:Andrew Gardner, hap +/*************************************************************************** + +Driver for Ritam Monty Plays Scrabble Brand Crossword Game - Portable Computer Console + +Scrabble computer that allows you play a game of Scrabble by yourself (or you +can play with up to 3 players). Has a built-in 12,000 vocabulary, expandable +to 44,000 by way of 2 expansion modules each containing 16,000 more obscure words. +You can use the included 'score cards' (which look like little Scrabble boards), +or you can use a real Scrabble board and tiles to play. Also note, Monty +apparently originally came with a little pen. + +This game was later upgraded by Ritam to Master Monty which had 24,000 words +built-in (expandable to a total of 56,000 with the same 2 expansion modules). +Two variations on Master Monty have been seen: one looks exactly the same as the +Monty but the electronics on the inside have been upgraded. The later version +is blue and says Master Monty at the top. Both of these versions are hand-upgraded +by adding chips and wires to the inside of the game. + +Hardware notes: +- Z80 @ ~3.58MHz +- 2KB SRAM, 16KB ROM(32KB on mmonty) +- 2*16KB ROM sockets for vocabulary expansion +- 2*SED1503F, 40*32 LCD screen, beeper + +TODO: +- put expansion roms in softwarelist? (note: slot #1 only accepts rom #1, + slot #2 only accepts rom #2), they can be disabled in-game with option M + +****************************************************************************/ + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "sound/dac.h" +#include "video/sed1500.h" + +#include "screen.h" +#include "speaker.h" + +#include "monty.lh" + + +namespace { + +class monty_state : public driver_device +{ +public: + monty_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_lcd(*this, "lcd%u", 0) + , m_dac(*this, "dac") + , m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_WRITE_LINE_MEMBER(key_pressed); + + void monty(machine_config &config); + void mmonty(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device_array m_lcd; + required_device m_dac; + required_ioport_array<6> m_inputs; + + void monty_mem(address_map &map); + void mmonty_mem(address_map &map); + void monty_io(address_map &map); + + template void lcd_output_w(offs_t offset, u64 data) { m_lcd_data[N << 4 | offset] = data; } // buffer for screen_update + u32 screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); + + void control_w(offs_t offset, u8 data); + void lcd_w(offs_t offset, u8 data) { m_lcd[m_lcd_cs]->write(offset, data); } + u8 input_r(offs_t offset); + DECLARE_WRITE_LINE_MEMBER(halt_changed) { m_halt = state; } + + u64 m_lcd_data[32]; + int m_lcd_cs = 0; + int m_halt = 0; +}; + +void monty_state::machine_start() +{ + memset(m_lcd_data, 0, sizeof(m_lcd_data)); + + save_item(NAME(m_lcd_data)); + save_item(NAME(m_lcd_cs)); + save_item(NAME(m_halt)); +} + + + +/****************************************************************************** + Video +******************************************************************************/ + +u32 monty_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) +{ + bitmap.fill(0xffffff); + + // letters with width 5 with space in between them + for (int y = 0; y < 32; y++) + for (int x = 0; x < 40; x++) + bitmap.pix(y + 1, x + x/5 + 1) = BIT(m_lcd_data[y], x) ? 0 : 0xffffff; + + return 0; +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void monty_state::control_w(offs_t offset, u8 data) +{ + // a0: speaker out + m_dac->write(BIT(offset, 0)); + + // a1: lcd chip select + m_lcd_cs = BIT(offset, 1); +} + +u8 monty_state::input_r(offs_t offset) +{ + u8 data = 0; + + // a0-a5, d0-d4: multiplexed inputs + for (int i = 0; i < 6; i++) + if (BIT(offset, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + +WRITE_LINE_MEMBER(monty_state::key_pressed) +{ + if (state && m_halt) + m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void monty_state::monty_mem(address_map &map) +{ + map(0x0000, 0x3fff).rom(); + map(0x4000, 0x7fff).rom(); // slot 1 + map(0x8000, 0xbfff).rom(); // slot 2 + map(0xf800, 0xffff).ram(); +} + +void monty_state::mmonty_mem(address_map &map) +{ + map(0x0000, 0x77ff).rom(); + map(0x7800, 0x7fff).ram(); + map(0x8000, 0xbfff).rom(); // slot 2 + map(0xc000, 0xffff).rom(); // slot 1 +} + +void monty_state::monty_io(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0xff).r(FUNC(monty_state::input_r)); + map(0x00, 0x03).w(FUNC(monty_state::control_w)); + map(0x80, 0xff).w(FUNC(monty_state::lcd_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( monty ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Option") PORT_CODE(KEYCODE_SPACE) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Blank") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('M') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('I') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('G') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_UP) PORT_CHAR('C') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void monty_state::monty(machine_config &config) +{ + // Basic machine hardware + Z80(config, m_maincpu, 3.579545_MHz_XTAL); // Ceramic resonator labeled 3.58MT + m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::monty_mem); + m_maincpu->set_addrmap(AS_IO, &monty_state::monty_io); + m_maincpu->halt_cb().set(FUNC(monty_state::halt_changed)); + + // Video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(0); + screen.set_size(40+8+1, 32+1); + screen.set_visarea_full(); + screen.set_screen_update(FUNC(monty_state::screen_update)); + + SED1503(config, m_lcd[0], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<0>)); + SED1503(config, m_lcd[1], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<1>)); + config.set_default_layout(layout_monty); + + // Sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + +void monty_state::mmonty(machine_config &config) +{ + monty(config); + m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::mmonty_mem); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( monty ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "monty_main.bin", 0x0000, 0x4000, CRC(720b4f55) SHA1(0106eb88d3fbbf25a745b9b6ee785ba13689d095) ) // 27128 + ROM_LOAD( "monty_module1.bin", 0x4000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 + ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 +ROM_END + +ROM_START( mmonty ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "master_monty_main.bin", 0x0000, 0x8000, CRC(bb5ef4d4) SHA1(ba2c759e429f8740df419f9abb60832eddfba8ab) ) // 27C256 + ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 + ROM_LOAD( "monty_module1.bin", 0xc000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1983, monty, 0, 0, monty, monty, monty_state, empty_init, "Ritam", "Monty Plays Scrabble", MACHINE_SUPPORTS_SAVE ) +COMP( 1987, mmonty, 0, 0, mmonty, monty, monty_state, empty_init, "Ritam", "Master Monty", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/rzone.cpp b/src/mame/misc_handheld/rzone.cpp new file mode 100644 index 00000000000..abae24156fb --- /dev/null +++ b/src/mame/misc_handheld/rzone.cpp @@ -0,0 +1,355 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + + ** subclass of hh_sm510_state (includes/hh_sm510.h, drivers/hh_sm510.cpp) ** + + Tiger R-Zone driver + + This is a backwards console, the heart of the machine is the cartridge. + The console houses the controller, speaker, power, backlight, and a + polarizer filter for the screen. The cartridge has the MCU, optional + sound ROM, and the LCD screen in a translucent window. + + Console family: + + 1995: R-Zone HeadGear: Wearable headset, controller is separate, + red-on-black screen is reflected in front of the right eye. + 1996: R-Zone SuperScreen: Handheld console, inverted filter(aka black + LCD segments), optional background sheet as with standalone handhelds. + 1997: R-Zone X.P.G - Xtreme Pocket Game: Handheld version of HeadGear. + 1997: R-Zone DataZone: PDA with a built-in SuperScreen. + + TODO: + - softwarelist? it's impossible right now due to SVG initialization + - support for SuperScreen. SVG colors will need to be inverted, or maybe + with artwork or HLSL? + - add DataZone, will get its own driver + +***************************************************************************/ + +#include "emu.h" +#include "hh_sm510.h" + +#include "machine/timer.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "rzone.lh" + + +namespace { + +class rzone_state : public hh_sm510_state +{ +public: + rzone_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag), + m_led_out(*this, "led"), + m_led_off(*this, "led_off") + { } + + void rzbatfor(machine_config &config); + void rztoshden(machine_config &config); + void rzindy500(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + output_finder<> m_led_out; + required_device m_led_off; + + int m_led_pin = 0; + int m_sctrl = 0; + int m_sclock = 0; + + TIMER_DEVICE_CALLBACK_MEMBER(led_off_callback) { m_led_out = m_led_pin ? 1 : 0; } + DECLARE_WRITE_LINE_MEMBER(led_w); + DECLARE_WRITE_LINE_MEMBER(audio_w); + DECLARE_WRITE_LINE_MEMBER(sctrl_w); + DECLARE_WRITE_LINE_MEMBER(sclock_w); + DECLARE_READ_LINE_MEMBER(sdata_r); + + void t1_write_r(u8 data); + void t1_write_s(u8 data); + virtual u8 input_r() override; + + void t2_update_audio(); + void t2_write_r(u8 data); + void t2_write_s(u8 data); +}; + + +// machine start + +void rzone_state::machine_start() +{ + hh_sm510_state::machine_start(); + + // resolve handlers + m_led_out.resolve(); + + // register for savestates + save_item(NAME(m_led_pin)); + save_item(NAME(m_sctrl)); + save_item(NAME(m_sclock)); +} + + +/*************************************************************************** + I/O +***************************************************************************/ + +// console + +WRITE_LINE_MEMBER(rzone_state::led_w) +{ + // LED: enable backlight + if (state) + m_led_out = 1; + + // delay led off to prevent flickering + if (!state && m_led_pin) + m_led_off->adjust(attotime::from_msec(30)); + + m_led_pin = state; +} + +WRITE_LINE_MEMBER(rzone_state::audio_w) +{ + // Audio: speaker out + m_speaker->level_w(state ? 1 : 0); +} + +WRITE_LINE_MEMBER(rzone_state::sctrl_w) +{ + // SCTRL: 74165 SH/LD: reload inputs while low + if (!state || !m_sctrl) + m_inp_mux = m_inputs[0]->read(); + + m_sctrl = state; +} + +WRITE_LINE_MEMBER(rzone_state::sclock_w) +{ + // SCLOCK: 74165 CLK: shift inputs on rising edge when 74165 SH/LD is high + if (m_sctrl && !m_sclock && state) + m_inp_mux >>= 1; + + m_sclock = state; +} + +READ_LINE_MEMBER(rzone_state::sdata_r) +{ + // SDATA: 74165 Q + sctrl_w(m_sctrl); // reload inputs if needed + return m_inp_mux & 1; +} + + +// cartridge type 1: simple SM510 + +void rzone_state::t1_write_r(u8 data) +{ + // R1: Audio + audio_w(data & 1); + + // R2: SCTRL + sctrl_w(data >> 1 & 1); +} + +void rzone_state::t1_write_s(u8 data) +{ + // S1: LED + led_w(data & 1); + + // S2: SCLOCK + sclock_w(data >> 1 & 1); +} + +u8 rzone_state::input_r() +{ + // K1: SDATA + return sdata_r(); +} + + +// cartridge type 2: simple SM512, 2 audio lines + +void rzone_state::t2_update_audio() +{ + audio_w((m_s >> 2 & 1) | (m_r & 1)); +} + +void rzone_state::t2_write_r(u8 data) +{ + // R: Audio + m_r = data; + t2_update_audio(); +} + +void rzone_state::t2_write_s(u8 data) +{ + // S1: SCTRL + sctrl_w(data & 1); + + // S2: SCLOCK + sclock_w(data >> 1 & 1); + + // S3: Audio + m_s = data; + t2_update_audio(); + + // S4: LED + led_w(data >> 3 & 1); +} + + + +/*************************************************************************** + Inputs +***************************************************************************/ + +static INPUT_PORTS_START( rzone ) + PORT_START("IN.0") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // A + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // B + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) // C + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) // D + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) +INPUT_PORTS_END + + + +/*************************************************************************** + Machine Configs +***************************************************************************/ + +void rzone_state::rzbatfor(machine_config &config) +{ + // basic machine hardware + SM512(config, m_maincpu); // no external XTAL + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t2_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t2_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1368, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void rzone_state::rztoshden(machine_config &config) +{ + // basic machine hardware + SM510(config, m_maincpu); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1392, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void rzone_state::rzindy500(machine_config &config) +{ + // basic machine hardware + SM510(config, m_maincpu); // no external XTAL + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1425, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/*************************************************************************** + ROM Definitions +***************************************************************************/ + +ROM_START( rzbatfor ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-231, SM512 under epoxy (die label KMN1202) (not the same game as the standalone Tiger handheld) + ROM_LOAD( "12_02.program", 0x0000, 0x1000, CRC(27abdb52) SHA1(b356ff80b628244da588b4748404b78d7a57eccd) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "12_02.melody", 0x000, 0x100, CRC(d794746c) SHA1(f0706c5100c090c65fcb2d768b5a5b4a55b29e04) ) + + ROM_REGION( 652556, "screen", 0) + ROM_LOAD( "rzbatfor.svg", 0, 652556, CRC(4d850489) SHA1(31a2a1e9209c0f77dbc268cddbfa4a67478734a7) ) +ROM_END + +ROM_START( rztoshden ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-241, SM510 under epoxy (die label ML4) + ROM_LOAD( "ml4", 0x0000, 0x1000, CRC(282c641f) SHA1(f94e4a17ffe90adcc6046070034be9b777f72288) ) + + ROM_REGION( 857474, "screen", 0) + ROM_LOAD( "rztoshden.svg", 0, 857474, CRC(e4340f84) SHA1(4f040d3c7dc06d66b4f06942e610a64c11e5cd4d) ) +ROM_END + +ROM_START( rzindy500 ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-312, SM510 under epoxy (die label KMS10 22) + ROM_LOAD( "10_22", 0x0000, 0x1000, CRC(99a746d0) SHA1(64264499d45a566fa9a0801c20e7fa27eac18da6) ) + + ROM_REGION( 533411, "screen", 0) + ROM_LOAD( "rzindy500.svg", 0, 533411, CRC(cfc85677) SHA1(014b9123d81fba1488b4a22a6b6fd0c09e22c1ea) ) +ROM_END + +} // anonymous namespace + + + +/*************************************************************************** + Drivers +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1995, rzbatfor, 0, 0, rzbatfor, rzone, rzone_state, empty_init, "Tiger Electronics", "R-Zone: Batman Forever", MACHINE_SUPPORTS_SAVE ) +CONS( 1996, rztoshden, 0, 0, rztoshden, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Takara)", "R-Zone: Battle Arena Toshinden", MACHINE_SUPPORTS_SAVE ) +CONS( 1996, rzindy500, 0, 0, rzindy500, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Sega)", "R-Zone: Indy 500", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/scrablex.cpp b/src/mame/misc_handheld/scrablex.cpp new file mode 100644 index 00000000000..15b69e7f947 --- /dev/null +++ b/src/mame/misc_handheld/scrablex.cpp @@ -0,0 +1,229 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Selchow & Righter Scrabble Lexor +It's a tabletop scrabble game/scorekeeper. + +Hardware notes: +- PCB label: PB-074 +- Fujitsu MB8841 MCU +- 8-digit 14-seg LEDs, 2-bit sound + +There's also a version of this game on a Panasonic MN1405 MCU. + +*******************************************************************************/ + +#include "emu.h" +#include "cpu/mb88xx/mb88xx.h" +#include "sound/spkrdev.h" +#include "video/pwm.h" +#include "speaker.h" + +#include "scrablex.lh" + + +namespace { + +class scrablex_state : public driver_device +{ +public: + scrablex_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + void scrablex(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_display; + required_device m_speaker; + required_ioport_array<5> m_inputs; + + void write_o(u8 data); + void write_p(u8 data); + template u8 read_r(); + template void write_r(u8 data); + + u8 m_inp_mux = 0; + u16 m_r = 0; +}; + +void scrablex_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_r)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void scrablex_state::write_o(u8 data) +{ + // O0-O7: digit select (uses index 8-15) + m_display->write_my((1 << (data & 0xf)) >> 8); +} + +void scrablex_state::write_p(u8 data) +{ + // P0-P3: input mux part + m_inp_mux = (m_inp_mux & ~0xf) | (~data & 0xf); +} + +template +u8 scrablex_state::read_r() +{ + u16 data = 0; + + // R0-R8: multiplexed inputs + for (int i = 0; i < 5; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data >> (N * 4) & 0xf; +} + +template +void scrablex_state::write_r(u8 data) +{ + // R0-R13: digit segments + m_r = (m_r & ~(0xf << (N * 4))) | ((~data & 0xf) << (N * 4)); + m_display->write_mx(bitswap<14>(m_r,10,8,6,12,11,7,9,13,5,4,3,2,1,0)); + + // R14,R15: speaker out + m_speaker->level_w(m_r >> 14 & 3); + + // R15: input mux part + m_inp_mux = (m_inp_mux & 0xf) | (m_r >> 11 & 0x10); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( scrablex ) + PORT_START("IN.0") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.1") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + + PORT_START("IN.2") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR('*') + + PORT_START("IN.3") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Double") + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Triple") + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Word") + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Bonus") + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Minus") + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter") + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Flash") + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Solo") + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Score") + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Timer") + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Review") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void scrablex_state::scrablex(machine_config &config) +{ + // basic machine hardware + MB8841(config, m_maincpu, 500000); // approximation - RC osc. R=15K, C=100pF + m_maincpu->write_o().set(FUNC(scrablex_state::write_o)); + m_maincpu->write_p().set(FUNC(scrablex_state::write_p)); + m_maincpu->read_r<0>().set(FUNC(scrablex_state::read_r<0>)); + m_maincpu->read_r<1>().set(FUNC(scrablex_state::read_r<1>)); + m_maincpu->read_r<2>().set(FUNC(scrablex_state::read_r<2>)); + m_maincpu->read_r<3>().set(FUNC(scrablex_state::read_r<3>)); + m_maincpu->write_r<0>().set(FUNC(scrablex_state::write_r<0>)); + m_maincpu->write_r<1>().set(FUNC(scrablex_state::write_r<1>)); + m_maincpu->write_r<2>().set(FUNC(scrablex_state::write_r<2>)); + m_maincpu->write_r<3>().set(FUNC(scrablex_state::write_r<3>)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_scrablex); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( scrablex ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mb8841_320m", 0x0000, 0x0800, CRC(bef4ab5a) SHA1(44e385225c5e8818ed93c3654a294aa412042e34) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, scrablex, 0, 0, scrablex, scrablex, scrablex_state, empty_init, "Selchow & Righter", "Scrabble Lexor - Computer Word Game", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/talkingbb.cpp b/src/mame/misc_handheld/talkingbb.cpp new file mode 100644 index 00000000000..1118559e70c --- /dev/null +++ b/src/mame/misc_handheld/talkingbb.cpp @@ -0,0 +1,351 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/****************************************************************************** + +Parker Brothers Starting Lineup Talking Baseball + +Hardware notes: +- PCB label KPT-349 REV 6C<1> +- 80C31 MCU @ 12MHz +- 2KB RAM, 128KB ROM, 2 cartridge slots +- 12 leds, 2 16-button keypads + +ROM chip has (C) 1987 Tonka (Kenner Parker Toys was acquired by Tonka in 1987, Parker +Brothers itself was acquired by Kenner in 1985) + +The speech driver is by Forrest S. Mozer's company. + +The cartridge slots are for extra teams. There are around 8 cartridges, each one +included 3 or 4 baseball teams, with exception to the "Hall of Fame" cartridge. +Players enter a 3-digit code to select the team. + +TODO: +- add cartridge slots +- Buttons are unresponsive at initial game setup, you need to hold the yes/no button + until it responds. The keypad reading routine is at $1A5D, it gets skipped for several + seconds at a time. Once in-game, everything is fine though. BTANB or different cause? + +******************************************************************************* + +Field positions (used when substituting): + +1: Pitcher +2: Catcher +3: First Base +4: Second Base +5: Third Base +6: Shortstop +7: Left Field +8: Center Field +9: Right Field + +The game includes baseball cards with player stats. At the very least, the roster +cards are needed to play the game properly. See below for the default teams. + +American Team: +-------------- + +Starting lineup batting order: + +1: #23 Rickey Henderson, CF +2: #14 Don Mattingly, 1B +3: #18 Wade Boggs, 3B +4: #22 George Bell, LF +5: #24 Dave Winfield, RF +6: #16 Cal Ripken, SS +7: #11 Terry Kennedy, C +8: #15 Willie Randolph, 2B +9: #20 Alan Trammell, SS & DH +10:#27 Roger Clemens, P + +Substitutes: + +#19: George Brett, 3B +#12: Carlton Fisk, C +#25: Jack Morris, P +#13: Eddie Murray, 1B +#21: Kirby Puckett, OF +#30: Dan Quisenberry, P +#29: Dave Righetti, P +#28: Bret Saberhagen, P +#17: Lou Whitaker, 2B +#26: Robin Yount, SS + +National Team: +-------------- + +Starting lineup batting order: + +1: #23: Tim Raines, LF +2: #16: Ryne Sandberg, 2B +3: #22: Darryl Strawberry, RF +4: #19: Mike Schmidt, 3B +5: #13: Jack Clark, 1B +6: #20: Eric Davis, CF +7: #11: Gary Carter, C +8: #17: Ozzie Smith, SS +9: #18: Dale Murphy, OF & DH +10:#25: Mike Scott, P + +Substitutes: + +#15: Buddy Bell, 3B +#26: Jody Davis, C +#24: Andre Dawson, CF +#29: Dwight Gooden, P +#21: Tony Gwynn, OF +#14: Keith Hernandez, 1B +#30: Nolan Ryan, P +#12: Steve Sax, 2B +#28: Fernando Valenzuela, P +#27: Todd Worrell, P + +******************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "video/pwm.h" +#include "sound/dac.h" +#include "speaker.h" + +// internal artwork +#include "talkingbb.lh" + + +namespace { + +class talkingbb_state : public driver_device +{ +public: + talkingbb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_display(*this, "display"), + m_inputs(*this, "IN.%u", 0) + { } + + void talkingbb(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_region_ptr m_rom; + required_device m_display; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + u8 m_bank = 0; + u8 m_inp_mux = 0; + + // I/O handlers + void bank_w(u8 data); + u8 bank_r(offs_t offset); + void input_w(u8 data); + u8 input_r(); + u8 switch_r(); +}; + +void talkingbb_state::machine_start() +{ + // register for savestates + save_item(NAME(m_bank)); + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void talkingbb_state::bank_w(u8 data) +{ + // d0-d1: upper rom bank + // d2-d4: upper rom enable (bus conflict possible) + // d2: internal rom, d3: cart slot 1, d4: cart slot 2 + m_bank = data; +} + +u8 talkingbb_state::bank_r(offs_t offset) +{ + u32 hi = (~m_bank & 3) << 15; + u8 data = (m_bank & 4) ? 0xff : m_rom[offset | hi]; + + // TODO: cartridge + + return data; +} + +void talkingbb_state::input_w(u8 data) +{ + // no effect if P30 is low (never happens though) + if (~m_bank & 1) + return; + + // d4-d7: led select (also input mux) + // d0-d2: led data + m_inp_mux = data >> 4; + m_display->matrix(m_inp_mux, ~data & 7); +} + +u8 talkingbb_state::input_r() +{ + // open bus if P30 is low (never happens though) + if (~m_bank & 1) + return 0xff; + + u8 data = 0; + + // multiplexed inputs + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + +u8 talkingbb_state::switch_r() +{ + // d5: mode switch + return ~m_inputs[4]->read(); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void talkingbb_state::main_map(address_map &map) +{ + map(0x0000, 0x7fff).rom().region("maincpu", 0x18000); + map(0x8000, 0xffff).r(FUNC(talkingbb_state::bank_r)); +} + +void talkingbb_state::main_io(address_map &map) +{ + map(0x0000, 0x07ff).mirror(0x7800).ram(); + map(0x8000, 0x8000).mirror(0x7fff).rw(FUNC(talkingbb_state::input_r), FUNC(talkingbb_state::input_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +/* keypad layout: **** P1 = Batter **** | **** P2 = Pitcher **** + | +[PINCH [1 [2] [3 [TIME OUT] | [INFIELD [1 [2 [3 [TIME OUT] + HITTER] BUNT] POWER] | IN] FAST] CURVE] CHANGE] + | +[SCORE] [4] [5 [6] [NO | [SCORE] [4 [5 [6 [NO + SQUEEZE] CANCEL] | PTCHOUT] PICKOFF] INTWALK] CANCEL] + | +[PINCH [7 [8] [9 [YES | [INSTANT [7 [8] [9 [YES + RUNNER] STEAL] X-BASE] ENTER] | REPLAY] RELIEF] SUB] ENTER] + | + [0 | [0 + SWING] | BALL] +*/ + +static INPUT_PORTS_START( talkingbb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_R) PORT_NAME("P1 3 / Power") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F) PORT_NAME("P1 6") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_V) PORT_NAME("P1 9 / Extra Base") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("P1 Time Out") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_O) PORT_NAME("P2 3 / Change") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_L) PORT_NAME("P2 6 / Intentional Walk") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("P2 9 / Sub") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("P2 Time Out") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_E) PORT_NAME("P1 2") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_D) PORT_NAME("P1 5 / Squeeze") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_C) PORT_NAME("P1 8") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_LALT) PORT_NAME("P1 0 / Swing") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 2 / Curve") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 5 / Pickoff") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 8") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RALT) PORT_NAME("P2 0 / Ball") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_W) PORT_NAME("P1 1 / Bunt") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_S) PORT_NAME("P1 4") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_X) PORT_NAME("P1 7 / Steal") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 1 / Fast") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 4 / Pitchout") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 7 / Relief") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Pinch Hitter") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pinch Runner") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Infield In") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Instant Replay") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") + + PORT_START("IN.4") + PORT_CONFNAME( 0x20, 0x00, "Mode" ) + PORT_CONFSETTING( 0x00, "Player" ) + PORT_CONFSETTING( 0x20, "Coach" ) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void talkingbb_state::talkingbb(machine_config &config) +{ + /* basic machine hardware */ + I80C31(config, m_maincpu, 12_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &talkingbb_state::main_map); + m_maincpu->set_addrmap(AS_IO, &talkingbb_state::main_io); + m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); + m_maincpu->port_out_cb<3>().set(FUNC(talkingbb_state::bank_w)); + m_maincpu->port_in_cb<3>().set(FUNC(talkingbb_state::switch_r)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 3); + config.set_default_layout(layout_talkingbb); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( talkingbb ) + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD("sp17208-002", 0x0000, 0x20000, CRC(e0e56217) SHA1(24a06b5c94a5c750799f61e3eb865e02d6cea68a) ) // GM231000-110 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1988, talkingbb, 0, 0, talkingbb, talkingbb, talkingbb_state, empty_init, "Parker Brothers", "Starting Lineup Talking Baseball", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/talkingfb.cpp b/src/mame/misc_handheld/talkingfb.cpp new file mode 100644 index 00000000000..46dc83b6a00 --- /dev/null +++ b/src/mame/misc_handheld/talkingfb.cpp @@ -0,0 +1,256 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/****************************************************************************** + +Parker Brothers Superstar Lineup Talking Football + +Hardware notes: +- PCB label KPT-410 REV B1 (*KPT = Kenner Parker Toys) +- 80C31 MCU @ 12MHz +- 2KB RAM, 256KB ROM, 2 cartridge slots +- two 20-button keypads + +Like Baseball, The ROM chip has (C) Tonka. +The speech driver is by Mozer, the ROM data includes employees names. + +The cartridge slots are probably meant for extra teams. I can't find anything +about it in the manual or any proof that cartridges were released for this. +Maybe the toy went out of production soon after release. + +The game includes formation cards, refer to the manual on which number is which strategy. + +TODO: +- add cartridge slots (no need if no carts exist?) +- verify keypad (everything seems ok, but "Pursue" and "Go For Turnover" might + be swapped, their function is nearly identical so it's hard to test) + +******************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "sound/dac.h" +#include "speaker.h" + + +namespace { + +class talkingfb_state : public driver_device +{ +public: + talkingfb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_inputs(*this, "IN.%u", 0) + { } + + void talkingfb(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_region_ptr m_rom; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + u8 m_bank = 0; + u8 m_inp_mux = 0; + + // I/O handlers + void bank_w(u8 data); + template u8 bank_r(offs_t offset); + void input_w(u8 data); + u8 input_r(); +}; + +void talkingfb_state::machine_start() +{ + // register for savestates + save_item(NAME(m_bank)); + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void talkingfb_state::bank_w(u8 data) +{ + // d0-d2: upper rom bank + // d3-d5: upper rom enable (bus conflict possible) + // d3: cart slot 1, d4: cart slot 2, d5: internal rom + m_bank = data; +} + +template +u8 talkingfb_state::bank_r(offs_t offset) +{ + u32 hi = (m_bank & 7) << 15; + u8 data = (m_bank & 0x20) ? 0xff : m_rom[offset | hi]; + + // cartridge slots are only enabled if PSEN is high + // TODO + + return data; +} + +void talkingfb_state::input_w(u8 data) +{ + // d3-d7: input mux + m_inp_mux = data >> 3; +} + +u8 talkingfb_state::input_r() +{ + u8 data = 0; + + // multiplexed inputs + for (int i = 0; i < 5; i++) + if (BIT(~m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void talkingfb_state::main_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); + map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<0>)); +} + +void talkingfb_state::main_io(address_map &map) +{ + map(0x0000, 0x07ff).mirror(0x3800).ram(); + map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(talkingfb_state::input_r), FUNC(talkingfb_state::input_w)); + map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<1>)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +/* keypad layout is like this: (P1 = Home, P2 = Away, both keypads are same) + +OFFENSIVE [1 [2 [3 DEFENSIVE + ACTION HB] FB] ST] ACTION + +[SCRAM/ [SCORE] [4 [5 [6 [PURSUE] + EVADE] FL] WR] TE] + +[PASS OUT/ [TIME [7] [8 [9] [GO FOR + RUN OUT] OUT] SE] TURNOVER] + +[CHECK OFF [REPLAY] [YES/ [0 [NO/ + TO BACK] ENTER] DEMO] CANCEL] + +*/ + +static INPUT_PORTS_START( talkingfb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Pursue") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Scram / Evade") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Pass Out / Run Out") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Check Off To Back") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pursue") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Scram / Evade") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Pass Out / Run Out") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("P1 Check Off To Back") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Go For Turnover") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Time Out") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Replay") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Go For Turnover") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Time Out") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("P1 Replay") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P2 1 / HB") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P2 4 / FL") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P2 7") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("P1 1 / HB") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("P1 4 / FL") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("P1 7") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P2 2 / FB") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P2 5 / WR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P2 8 / SE") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P2 0 / Demo") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("P1 2 / FB") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("P1 5 / WR") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("P1 8 / SE") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("P1 0 / Demo") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P2 3 / ST") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P2 6 / TE") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P2 9") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("P1 3 / ST") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("P1 6 / TE") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("P1 9") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void talkingfb_state::talkingfb(machine_config &config) +{ + /* basic machine hardware */ + I80C31(config, m_maincpu, 12_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &talkingfb_state::main_map); + m_maincpu->set_addrmap(AS_IO, &talkingfb_state::main_io); + m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); + m_maincpu->port_out_cb<3>().set(FUNC(talkingfb_state::bank_w)); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( talkingfb ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD("sp17492-001", 0x0000, 0x40000, CRC(d03851c6) SHA1(e8ac9c342bee987657c3c18f24d466b3906d6fb0) ) // Sharp LH532378 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1989, talkingfb, 0, 0, talkingfb, talkingfb, talkingfb_state, empty_init, "Parker Brothers", "Superstar Lineup Talking Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/tispeak.cpp b/src/mame/misc_handheld/tispeak.cpp new file mode 100644 index 00000000000..667647474f1 --- /dev/null +++ b/src/mame/misc_handheld/tispeak.cpp @@ -0,0 +1,1909 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Jonathan Gevaryahu +// thanks-to:Sean Riddle, David Viens, Kevin Horton +/*************************************************************************** + + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** + + Texas Instruments 1st-gen. handheld speech devices. + + These devices, mostly edu-toys, are based around an MCU(TMS0270/TMS1100), + TMS51xx speech, and VSM ROM(s). Newer devices, such as Speak & Music, + are based around the TMP50C40 and belong in another driver, probably. + + note: except for tntell, MAME external artwork is not required. But it + is objectively a large improvement. + +---------------------------------------------------------------------------- + +Known devices on this hardware: (* denotes not dumped) + + +ROM (and/or source) code obtained from patents: +Some of these may have pre-release bugs. + + Speak & Spell: US4189779 + Speak & Math: US4946391 + Touch & Tell: US4403965, EP0048835A2 (patent calls it "Speak & Seek") + Language Translator: US4631748 + + +Speak & Spell: + +This is the original Speak & Spell. TI had done educational toys before, like +Wiz-A-Tron or Little Professor. But the popularity of this product was much +above expectations. TI continued to manufacture many products for this line. + + Speak & Spell (US), 1978 + - MCU: TMC0271, label TMC0271NL DBS (die label 0271B T0270B) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB TMC0351NL + - VSM(2/2): 16KB TMC0352NL + - VFD: NEC FIP8A5AR no. 3A + - notes: keyboard has buttons instead of cheap membrane + + Speak & Spell (US), 1979 + - MCU: TMC0271, label TMC0271H-N2L FDS (die label 0271H T0270D) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB TMC0351N2L + - VSM(2/2): 16KB TMC0352N2L + - notes: fixed a funny bug with gibberish-talk when Module button is pressed + with no module inserted, MCU ROM contents differs from 1978 version + + Speak & Spell (US), 1980 + - MCU: same as 1979 version + - TMS51xx: TMC0281D + - VSM: 16KB CD2350(rev.A) + - notes: only 1 VSM, meaning much smaller internal vocabulary + + Speak & Spell (Japan), 1980 + - MCU: TMC0271 (assume same as US 1979 version) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2321 + - VSM(2/2): 16KB CD2322 + - notes: no local name for the product, words are in English but very low difficulty + + Speak & Spell (UK), 1978 + - MCU: TMC0271 (assume same as US 1978 version) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2303 + - VSM(2/2): 16KB CD2304 + - notes: voice data was manually altered to give it a UK accent, + here's a small anecdote from developer: + "(...) I cannot bear to listen the product even now. I remember the + word 'butcher' took 3 days - I still don't know if it sounds right." + + Speak & Spell (UK), 1981 + - MCU: TMC0271 (assume same as US 1979 version) + - TMS51xx: CD2801 + - VSM: 16KB CD62175 + - VFD: some seen with the one from Speak & Math(!) + - notes: this one has a dedicated voice actor + + Speak & Spell (Spanish, prototype), 1981 + - MCU: CD2701N2L P (die label T0270D 2701) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2319 + - VSM(2/2): 16KB CD2320 + - VFD: 8 digits with 14 segments, DP and accent mark + + Speak & Spell (France) "La Dictée Magique", 1980 + - MCU: CD2702, label CD2702AN2L (die label TMC0270F 2702A) + - TMS51xx: CD2801 + - VSM: 16KB CD2352 + + Speak & Spell (Germany) "Buddy", 1980 + - MCU & TMS51xx: same as French 1980 version + - VSM(1/2): 16KB CD2345* + - VSM(2/2): 16KB CD2346* + + Speak & Spell (Italy) "Grillo Parlante", 1982 + - MCU & TMS51xx: same as French 1980 version + - VSM: 16KB CD62190 + - VFD: same as Speak & Math + - notes: it appears that TI ran out of original snspell VFDs in the early 80s? + + Speak & Spell Compact (US), 1981 + - MCU: CD8011, label CD8011A-NL (die label 1100B) + - TMS51xx: TMC0281D + - VSM: 16KB CD2354, CD2354(rev.A) + - notes: no display, MCU is TMS1100 instead of TMS0270, overall similar to Touch & Tell + + Speak & Spell Compact (UK) "Speak & Write", 1981 + - MCU: same as US 1981 version + - TMS51xx: CD2801A + - VSM: 16KB CD62174(rev.A) + - notes: BTANB: gibberish when the module button is pressed (with module present), + anecdotes from the developer, the same person working on the original UK version: + "We included a pencil and writing pad - it was now about 'writing'.", + and one about the welcome message: + "I had to manually create a sentence of digital speech from thin air. + I had to write down a 20 character code which would create each 10/s + sound bite that made up the phrase "Welcome to Speak and Write". + It took me 1 week. (...) Even Larry Brantingham was amazed." + +Speak & Spell modules: +Note that they are interchangeable, eg. you can use a French module on a US Speak & Spell. + + English: + - Vowel Power: VSM: 16KB CD2302 + - Number Stumpers 4-6: VSM: 16KB CD2305 + - Number Stumpers 7-8: VSM: 16KB CD2307(rev.A) + - Basic Builders: VSM: 16KB CD2308 + - Mighty Verbs: VSM: 16KB CD2309(rev.B) + - Homonym Heroes: VSM: 16KB CD2310 + - Vowel Ventures: VSM: 16KB CD2347(rev.C) + - Noun Endings: VSM: 16KB CD2348 + - Magnificent Modifiers: VSM: 16KB CD2349 + - E.T. Fantasy: VSM: 16KB CD2360 + + French: + - No.1: Les Mots de Base: VSM: 16KB CD2353 (1st release was called "Module No. 1 de Jacques Capelovici") + - No.2: Les Mots Difficiles (aka Les Mots de Base): VSM: 16KB CD62177A + - No.3: Les Animaux Familiers: VSM: 16KB? CD62047* + - No.4: Les Magasins de la Rue: VSM: 16KB CD62048 + - No.5: Les Extra-Terrestres: VSM: 16KB? CD62178* + + Italian: + - Super Modulo: VSM: 16KB? CD62313* + + +Speak & Math: + + Speak & Math (US), 1980 (renamed to "Speak & Maths" in UK, but is the same product) + - MCU: CD2704, label CD2704B-N2L (die label TMC0270F 2704B) - 2nd revision?(mid-1982) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2392 + - VSM(2/2): 16KB CD2393 + - VFD: Futaba 9SY -02Z 7E + - notes: As with the Speak & Spell, the voice actor was a radio announcer. + However, the phrase "is greater than or less than" had to be added by one + of the TI employees in a hurry, the day before a demo. Apparently QA + never found out and it ended up in the final product. + + Speak & Math (US), 1986 + - MCU: CD2708, label CD2708N2L (die label TMC0270F 2708A) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2381 + - VSM(2/2): 4KB CD2614 + + Speak & Math 'Compact' (France) "Les Maths Magiques", 1986? + - MCU: CP3447-NL* (TMS1100?) + - TMS51xx: CD2801 + - VSM: 16KB? CD62173* + - notes: this is not the same as "Le Calcul Magique", that's from a + series centered around a TMS50C40 instead of MCU+TMS51xx + + +Speak & Read: + + Speak & Read (US), 1980 + - MCU: CD2705, label CD2705B-N2L (die label TMC0270E 2705B) - 2nd revision?(late-1981) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2394(rev.A) + - VSM(2/2): 16KB CD2395(rev.A) + - VFD: same as Language Tutor, rightmost digit unused + +Speak & Read modules: + + English: + - Sea Sights: VSM: 16KB CD2396(rev.A) + - Who's Who at the Zoo: VSM: 16KB CD2397 + - A Dog on a Log: VSM: 16KB CD3534(rev.A) + - The Seal That Could Fly: VSM: 16KB CD3535 + - A Ghost in the House: VSM: 16KB CD3536 + - On the Track: VSM: 16KB CD3538 + - The Third Circle: VSM: 16KB CD3539 + - The Millionth Knight: VSM: 16KB CD3540 + + +Touch & Tell: + + Touch & Tell (US), 1981 + - MCU: CD8012, label CD8012NL (die label 1100G CD8012) + - TMS51xx: CD2802 + - VSM: 4KB CD2610 + - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices + too, maybe an earlier version? + + Touch & Tell (UK), 1981 + - MCU & TMS51xx: same as US version + - VSM: 16KB CD62170 + + Touch & Tell (France) "Le Livre Magique", 1981 + - MCU & TMS51xx: same as US version + - VSM: 16KB CD62171 + + Touch & Tell (Germany) "Tipp & Sprich", 1981 + - MCU & TMS51xx: same as US version + - VSM: ?KB CD62172* + + Touch & Tell (Italy) "Libro Parlante", 1982 + - MCU & TMS51xx: same as US version + - VSM: ?KB CD62176* + + Vocaid (US), 1982 + - MCU & TMS51xx: same as Touch & Tell (US) + - VSM: 16KB CD2357 + - notes: MCU is the same as in Touch & Tell, but instead of a toddler's toy, + you get a serious medical aid device for the voice-impaired. The PCB is + identical, it includes the edge connector for modules but no external slot. + +Touch & Tell modules: + + English: + - Alphabet Fun: VSM: 4KB CD2611 + - Animal Friends: VSM: 16KB CD2355 + - Number Fun: VSM: 4KB CD2612*, CD2612(rev.A) + - All About Me: VSM: 4KB CD2613 + - World of Transportation: VSM: 16KB CD2361 + - Little Creatures: VSM: 16KB CD2362 + - E.T.: VSM: 16KB CD2363 + +Touch & Tell/Vocaid overlay reference: + + tntell CD2610: + - $04: a - Colors + - $01: b - Objects + - $05: c - Shapes + - $09: d - Home Scene + tntelluk CD62170, tntellfr CD62171: + - see tntell + - see numfun(not A) + - see animalfr + - $08: ? - Clown Face + - $0B: ? - Body Parts + vocaid CD2357: + - $1C: 1 - Leisure + - $1E: 2 - Telephone + - $1B: 3 - Bedside + - $1D: 4 - Alphabet + alphabet CD2611: + - $0E: 1a - Alphabet A-M + - $0D: 1b - Alphabet N-Z + - $0C: 1c - Letter Jumble A-M + - $0B: 1d - Letter Jumble N-Z + animalfr CD2355: + - $0A: 2a - Farm Animals + - $0F: 2b - At The Farm + - $0E: 2c - Animal Babies + - $0D: 2d - In The Jungle + numfun CD2612: + - $02/$0A(rev.A): 3a - Numbers 1-10 + - $03/$0F(rev.A): 3b - Numbers 11-30 + - $07/$0D(rev.A): 3c - How Many? + - $06/$0E(rev.A): 3d - Hidden Numbers + aboutme CD2613: + - $0E: 4a - Clown Face + - $0B: 4b - Body Parts + - $0D: 4c - Things to Wear + - $0C: 4d - Just For Me + wot CD2361: + - $0A: 5a - On Land + - $0B: 5b - In The Air + - $0C: 5c - On The Water + - $0D: 5d - In Space + - $10: 5e - What Belongs Here? + - $11: 5f - How It Used To Be + - $12: 5g - Word Fun + - $13: 5h - In the Surprise Garage + lilcreat CD2362: + - $14: 6a - In The Park + - $15: 6b - In The Sea + - $16: 6c - In The Woods + - $17: 6d - Whose House? + - $18: 6e - Hide & Seek + - $1A: 6f - Who Is It? + - $19: 6g - But It's Not + - $1B: 6h - Word Fun + et CD2363: + - $0F: 7a - The Adventure On Earth I + - $10: 7b - The Adventure On Earth II + - $11: 7c - Fun And Friendship I + - $12: 7d - Fun And Friendship II + - $13: 7e - E.T. The Star I + - $14: 7f - E.T. The Star II + - $15: 7g - Do You Remember? I + - $16: 7h - Do You Remember? II + + $00: none inserted, and $1F is for diagnostics + + +Magic Wand "Speaking Reader" or "Speak & Learn": + +Limited release barcode reader text-to-speech device, meant for children. +The text is coded as phonemes. Books were sold separately. + + Magic Wand "Speaking Reader" (US), 1982 + - MCU: C14007* (TMS1400?) + - TMS5220 + - VSM: 4KB? CD2228* + + Magic Wand "Speak & Learn" (US), 1983 + - notes: same hardware + + +Language Tutor/Translator: + +A later device, called Language Teacher, was released without speech hardware. + + Language Tutor (US), 1978 + - MCU: TMC0275* + - TMS51xx: CD2801 + - VFD: NEC FIP10xxx? + - notes: external module is required (see below) + +Language Tutor modules: + + - Ingles(1/4): VSM: 16KB CD2311 + - Ingles(2/4): VSM: 16KB CD2312 + - Ingles(3/4): VSM: 16KB CD2313 + - Ingles(4/4): VSM: 16KB CD2314 + + - Spanish(1/4): VSM: 16KB CD2315 + - Spanish(2/4): VSM: 16KB CD2316 + - Spanish(3/4): VSM: 16KB CD2317 + - Spanish(4/4): VSM: 16KB CD2318 + + - French(1/4): VSM: 16KB CD2327 + - French(2/4): VSM: 16KB CD2328 + - French(3/4): VSM: 16KB CD2329 + - French(4/4): VSM: 16KB CD2330 + + - German(1/4): VSM: 16KB CD2331 + - German(2/4): VSM: 16KB CD2332 + - German(3/4): VSM: 16KB CD2333 + - German(4/4): VSM: 16KB CD2334 + + - English(1/4): VSM: 16KB CD3526 + - English(2/4): VSM: 16KB CD3527 + - English(3/4): VSM: 16KB CD3528 + - English(4/4): VSM: 16KB CD3529 + + +Other manufacturers: + +Tiger Electronics K28 (model 7-232) Sold in Hong Kong, distributed in US as: +- Coleco: Talking Teacher +- Sears: Talkatron - Learning Computer + +1981 K28 models 7-230 and 7-231 are on different hardware, showing a different +keyboard, VFD display, and use the SC-01 speech chip. --> driver k28.cpp + + K28 model 7-232 (HK), 1985 + - MCU: TMS1400 MP7324 + - TMS51xx: TMS5110A + - VSM: 16KB CM62084 + - LCD: SMOS SMC1112 MCU to 8*14-seg display + +K28 modules: + + - Spelling I: VSM: 16KB CM62086 + - Spelling II: VSM: 16KB CM62085? + - Spelling III: VSM: 16KB CM62087 + - Expansion Module 1: VSM: 16KB CM62214? - assumed same VSM as CM62086 + - Expansion Module 2: VSM: 16KB CM62216 - assumed same VSM as the one in Spelling II + - Expansion Module 3: VSM: 16KB CM62215 - same VSM as CM62087 + - Expansion Module 4: VSM: 16KB CM62217 + - Expansion Module 5: VSM: 16KB CM62218* + - Expansion Module 6: VSM: 16KB CM62219 + + note: these won't work on the 1981 version(s) + +---------------------------------------------------------------------------- + + TODO: + - why doesn't lantutor work? + - emulate k28 LCD + - emulate other known devices + + +Dick Smith catalog numbers, taken from advertisements: + +X-1300, Y-1300 : T.I. Speak & Spell +X-1301 : Super Stumper 1 (for Speak & Spell) +X-1302 : Super Stumper 2 (for Speak & Spell) +X-1305 : Vowell Power (for Speak & Spell) +Y-1310 : T.I. Speak & Math +Y-1313 : T.I. Speak & Read +Y-1320 : T.I. Dataman + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "machine/timer.h" +#include "machine/tms6100.h" +#include "sound/tms5110.h" +#include "softlist_dev.h" +#include "speaker.h" +#include "render.h" + +// internal artwork +#include "k28m2.lh" +#include "snmath.lh" +#include "snread.lh" +#include "snspell.lh" +#include "snspellsp.lh" +#include "tntell.lh" // keyboard overlay + +namespace { + +// The master clock is a single stage RC oscillator into TMS5100 RCOSC: +// In an early 1979 Speak & Spell, C is 68pf, R is a 50kohm trimpot which is set to around 33.6kohm +// (measured in-circuit). CPUCLK is this osc freq /2, ROMCLK is this osc freq /4. +// The typical osc freq curve for TMS5100 is unknown. Let's assume it is set to the default frequency, +// which is 640kHz for 8KHz according to the TMS5100 documentation. + +#define MASTER_CLOCK 640000 + + +class tispeak_state : public hh_tms1k_state +{ +public: + tispeak_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_tms5100(*this, "tms5100"), + m_tms6100(*this, "tms6100"), + m_cart(*this, "cartslot"), + m_ol_out(*this, "ol%u", 1U) + { } + + void init_snspell(); + void init_tntell(); + void init_lantutor(); + + // machine configs + void tms5110_route(machine_config &config); + void sns_tmc0281(machine_config &config); + void sns_tmc0281d(machine_config &config); + void sns_cd2801(machine_config &config); + void snspellit(machine_config &config); + void snspellsp(machine_config &config); + void snspellc(machine_config &config); + void snspellcuk(machine_config &config); + void snmath(machine_config &config); + void snread(machine_config &config); + void tntell(machine_config &config); + void vocaid(machine_config &config); + void lantutor(machine_config &config); + void k28m2(machine_config &config); + +private: + virtual void power_off() override; + void update_display(); + + u8 snspell_read_k(); + void snmath_write_o(u16 data); + void snspell_write_o(u16 data); + void snspell_write_r(u16 data); + void lantutor_write_r(u16 data); + + u8 snspellc_read_k(); + void snspellc_write_o(u16 data); + void snspellc_write_r(u16 data); + u8 tntell_read_k(); + + void k28_update_display(u8 old, u8 data); + u8 k28_read_k(); + void k28_write_o(u16 data); + void k28_write_r(u16 data); + + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + + u8 tntell_get_hexchar(const char c); + TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay); + + void init_cartridge(); + + virtual void machine_start() override; + + // devices + required_device m_tms5100; + required_device m_tms6100; + optional_device m_cart; + + output_finder<5> m_ol_out; + + // cartridge + u32 m_cart_max_size = 0; + u8 *m_cart_base = nullptr; + + u8 m_overlay = 0; +}; + +void tispeak_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + m_ol_out.resolve(); + init_cartridge(); +} + + + +/*************************************************************************** + + Cartridge Handling + +***************************************************************************/ + +void tispeak_state::init_cartridge() +{ + if (m_cart != nullptr && m_cart->exists()) + { + std::string region_tag; + memory_region *src = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); + if (src) + memcpy(m_cart_base, src->base(), src->bytes()); + } +} + +DEVICE_IMAGE_LOAD_MEMBER(tispeak_state::cart_load) +{ + u32 size = m_cart->common_get_size("rom"); + + if (size > m_cart_max_size) + { + image.seterror(image_error::INVALIDIMAGE, "Invalid file size"); + return image_init_result::FAIL; + } + + m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); + + return image_init_result::PASS; +} + + +void tispeak_state::init_snspell() +{ + m_cart_max_size = 0x4000; + m_cart_base = memregion("tms6100")->base() + 0x8000; +} + +void tispeak_state::init_tntell() +{ + m_cart_max_size = 0x4000; + m_cart_base = memregion("tms6100")->base() + 0x4000; +} + +void tispeak_state::init_lantutor() +{ + m_cart_max_size = 0x10000; + m_cart_base = memregion("tms6100")->base(); +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +// common/snspell + +void tispeak_state::power_off() +{ + hh_tms1k_state::power_off(); + m_tms5100->reset(); +} + +void tispeak_state::update_display() +{ + u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; + m_display->matrix(m_grid & gridmask, m_plate); +} + +void tispeak_state::snspell_write_r(u16 data) +{ + // R13: power-off request, on falling edge + if (~data & m_r & 0x2000) + power_off(); + + // R0-R7: input mux and select digit (+R8 if the device has 9 digits) + // R15: filament on + // other bits: MCU internal use + m_r = m_inp_mux = data; + m_grid = data & 0x81ff; + update_display(); +} + +void tispeak_state::snspell_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and AP as d15: + // note: lantutor and snread VFD has an accent triangle instead of DP, and no AP + // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK) + m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); + update_display(); +} + +u8 tispeak_state::snspell_read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[8]->read() | read_inputs(8); +} + + +// snmath specific + +void tispeak_state::snmath_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and CT as d15: + // [DP],D,C,H,F,B,I,M,L,K,N,J,[CT],E,G,A (sidenote: TI KLMN = MAME MLNK) + m_plate = bitswap<16>(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15); + update_display(); +} + + +// lantutor specific + +void tispeak_state::lantutor_write_r(u16 data) +{ + // same as default, except R13 is used for an extra digit + m_r = m_inp_mux = data; + m_grid = data & 0xa1ff; + update_display(); +} + + +// snspellc specific + +void tispeak_state::snspellc_write_r(u16 data) +{ + // R10: TMS5100 PDC pin + m_tms5100->pdc_w(data >> 10 & 1); + + // R9: power-off request, on falling edge + if (~data & m_r & 0x200) + power_off(); + + // R0-R8: input mux + m_r = m_inp_mux = data; +} + +void tispeak_state::snspellc_write_o(u16 data) +{ + // O3210: TMS5100 CTL8124 + m_tms5100->ctl_w(bitswap<4>(data,3,0,1,2)); + m_o = data; +} + +u8 tispeak_state::snspellc_read_k() +{ + // K4: TMS5100 CTL1 + u8 k4 = m_tms5100->ctl_r() << 2 & 4; + + // K: multiplexed inputs (note: the Vss row is always on) + return k4 | m_inputs[9]->read() | read_inputs(9); +} + + +// tntell specific + +u8 tispeak_state::tntell_read_k() +{ + // K8: overlay code from R5,O4-O7 + u8 k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0; + + // rest is same as snpellc + return k8 | snspellc_read_k(); +} + +u8 tispeak_state::tntell_get_hexchar(const char c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + + return 0; +} + +TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) +{ + // Each keyboard overlay insert has 5 holes, used by the game to determine + // which one is active(if any). If it matches with the internal ROM or + // external module, the game continues. + + // pick overlay code from machine config, see comment section above for reference + m_overlay = m_inputs[10]->read(); + + // try to get it from (external) layout + if (m_overlay == 0x20) + { + // as output value, eg. with defstate (in decimal) + m_overlay = output().get_value("overlay_code") & 0x1f; + + // and from current view name ($ + 2 hex digits) + render_target *target = machine().render().first_target(); + const char *name = target->view_name(target->view()); + + for (int i = 0; name && i < strlen(name); i++) + if (name[i] == '$' && strlen(&name[i]) > 2) + m_overlay = (tntell_get_hexchar(name[i + 1]) << 4 | tntell_get_hexchar(name[i + 2])) & 0x1f; + } + + // overlay holes + for (int i = 0; i < 5; i++) + m_ol_out[i] = BIT(m_overlay, i); +} + + +// k28 specific + +void tispeak_state::k28_update_display(u8 old, u8 data) +{ + // ? +} + +void tispeak_state::k28_write_r(u16 data) +{ + // R1234: TMS5100 CTL8421 + u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f); + m_tms5100->ctl_w(r & 0xf); + + // R0: TMS5100 PDC pin + m_tms5100->pdc_w(data & 1); + + // R5: input mux high bit + m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100); + + // R6: power-off request, on falling edge + if (~data & m_r & 0x40) + power_off(); + + // R7-R10: LCD data + k28_update_display(m_r >> 7 & 0xf, data >> 7 & 0xf); + m_r = r; +} + +void tispeak_state::k28_write_o(u16 data) +{ + // O0-O7: input mux low + m_inp_mux = (m_inp_mux & ~0xff) | data; +} + +u8 tispeak_state::k28_read_k() +{ + // K: TMS5100 CTL, multiplexed inputs (also tied to R1234) + return m_tms5100->ctl_r() | read_inputs(9) | (m_r & 0xf); +} + + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +static INPUT_PORTS_START( snspell ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module Select") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue") + + PORT_START("IN.8") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mystery Word") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellfr ) // French button names + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Efface") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Essaie") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME(u8"Arrét") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME(u8"Départ") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Rejoue") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repete") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aide") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mot Mystere") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Code Secret") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Lettre") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Dis-le") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellit ) // Italian button names + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Moduli") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Cancella") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Controllo") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Stop") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Via") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Ritorno") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Replica") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aiuto") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Indovina") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Codice") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Alfabeto") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Ripeti") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabet + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("CH") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("LL") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME(u8"Ñ") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("RR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Entra") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_NAME("Acento") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Listo") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Programa") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Borra") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Repite") + + PORT_START("IN.8") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Otra Vez") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Palabra Secreta") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Dilo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + + +static INPUT_PORTS_START( snmath ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("<") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME(">") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Repeat") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Mix It") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Number Stumper") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + + PORT_START("IN.7") + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.8") + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( snread ) + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Word Zapper") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Word Maker") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Read It") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Picture Read") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter Stumper") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Hear It") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + + +static INPUT_PORTS_START( lantutor ) + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Diacritical") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Space") + + PORT_MODIFY("IN.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Translate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Learn") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Phrase") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Link") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Repeat") +INPUT_PORTS_END + + +static INPUT_PORTS_START( snspellc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Stumper") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Review") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + + PORT_START("IN.9") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellcuk ) + PORT_INCLUDE( snspellc ) + + PORT_MODIFY("IN.9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) // just the label changed from Spell to Write +INPUT_PORTS_END + + +static INPUT_PORTS_START( tntell ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Grid 1-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Grid 1-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Grid 1-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Grid 1-3") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 2-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 2-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 2-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 2-3") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 3-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 3-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 3-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 3-3") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Grid 4-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 4-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 4-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 4-3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 5-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 5-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 5-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 5-3") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 5-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Grid 6-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 5-5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // overlay code + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 3-5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 2-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 4-5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Grid 1-5") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 3-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 2-6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Grid 4-6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Grid 1-6") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Grid 6-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Grid 6-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Grid 6-3") + + PORT_START("IN.9") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.10") + PORT_CONFNAME( 0x3f, 0x20, "Overlay Code" ) + PORT_CONFSETTING( 0x20, "From Artwork View" ) + PORT_CONFSETTING( 0x00, "$00 (None)" ) + PORT_CONFSETTING( 0x01, "$01" ) + PORT_CONFSETTING( 0x02, "$02" ) + PORT_CONFSETTING( 0x03, "$03" ) + PORT_CONFSETTING( 0x04, "$04" ) + PORT_CONFSETTING( 0x05, "$05" ) + PORT_CONFSETTING( 0x06, "$06" ) + PORT_CONFSETTING( 0x07, "$07" ) + PORT_CONFSETTING( 0x08, "$08" ) + PORT_CONFSETTING( 0x09, "$09" ) + PORT_CONFSETTING( 0x0a, "$0A" ) + PORT_CONFSETTING( 0x0b, "$0B" ) + PORT_CONFSETTING( 0x0c, "$0C" ) + PORT_CONFSETTING( 0x0d, "$0D" ) + PORT_CONFSETTING( 0x0e, "$0E" ) + PORT_CONFSETTING( 0x0f, "$0F" ) + PORT_CONFSETTING( 0x10, "$10" ) + PORT_CONFSETTING( 0x11, "$11" ) + PORT_CONFSETTING( 0x12, "$12" ) + PORT_CONFSETTING( 0x13, "$13" ) + PORT_CONFSETTING( 0x14, "$14" ) + PORT_CONFSETTING( 0x15, "$15" ) + PORT_CONFSETTING( 0x16, "$16" ) + PORT_CONFSETTING( 0x17, "$17" ) + PORT_CONFSETTING( 0x18, "$18" ) + PORT_CONFSETTING( 0x19, "$19" ) + PORT_CONFSETTING( 0x1a, "$1A" ) + PORT_CONFSETTING( 0x1b, "$1B" ) + PORT_CONFSETTING( 0x1c, "$1C" ) + PORT_CONFSETTING( 0x1d, "$1D" ) + PORT_CONFSETTING( 0x1e, "$1E" ) + PORT_CONFSETTING( 0x1f, "$1F (Diagnostic)" ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( k28m2 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A/1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J/0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Repeat") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C/3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('L') PORT_NAME("L/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Prompt") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D/4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('M') PORT_NAME(u8"M/×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E/5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('N') PORT_NAME(u8"N/÷") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("Module") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F/6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G/7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.7") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.8") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I/9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") +INPUT_PORTS_END + + + +/*************************************************************************** + + Machine Config + +***************************************************************************/ + +void tispeak_state::tms5110_route(machine_config &config) +{ + // sound hardware + m_tms5100->m0().set(m_tms6100, FUNC(tms6100_device::m0_w)); + m_tms5100->m1().set(m_tms6100, FUNC(tms6100_device::m1_w)); + m_tms5100->addr().set(m_tms6100, FUNC(tms6100_device::add_w)); + m_tms5100->data().set(m_tms6100, FUNC(tms6100_device::data_line_r)); + m_tms5100->romclk().set(m_tms6100, FUNC(tms6100_device::clk_w)); + m_tms5100->add_route(ALL_OUTPUTS, "mono", 0.5); +} + +void tispeak_state::snmath(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r)); + + m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r)); + m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w)); + m_maincpu->write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0x21ff, 0x3fff); + config.set_default_layout(layout_snmath); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + CD2801(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + + +void tispeak_state::sns_cd2801(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + + config.set_default_layout(layout_snspell); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snspell"); +} + +void tispeak_state::snspellit(machine_config &config) +{ + sns_cd2801(config); + + // basic machine hardware + config.set_default_layout(layout_snmath); +} + +void tispeak_state::sns_tmc0281(machine_config &config) +{ + sns_cd2801(config); + + // sound hardware + TMC0281(config.replace(), m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + +void tispeak_state::snspellsp(machine_config &config) +{ + sns_tmc0281(config); + + // basic machine hardware + config.set_default_layout(layout_snspellsp); +} + +void tispeak_state::sns_tmc0281d(machine_config &config) +{ + sns_cd2801(config); + + // sound hardware + TMC0281D(config.replace(), m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + + +void tispeak_state::snread(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + + config.set_default_layout(layout_snread); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snread", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snread"); +} + + +void tispeak_state::lantutor(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::lantutor_write_r)); + + config.set_default_layout(layout_snread); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "lantutor", "vsm,bin"); + m_cart->set_must_be_loaded(true); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("lantutor"); +} + + +void tispeak_state::snspellc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::snspellc_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); + + // no visual feedback! + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + TMC0281D(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snspell"); +} + +void tispeak_state::snspellcuk(machine_config &config) +{ + snspellc(config); + + // sound hardware + CD2801(config.replace(), m_tms5100, MASTER_CLOCK); // CD2801A! + tms5110_route(config); +} + + +void tispeak_state::vocaid(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::tntell_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); + + TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50)); + config.set_default_layout(layout_tntell); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + CD2802(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + +void tispeak_state::tntell(machine_config &config) +{ + vocaid(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tntell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("tntell"); +} + + +void tispeak_state::k28m2(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::k28_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::k28_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::k28_write_r)); + + config.set_default_layout(layout_k28m2); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + TMS5110A(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "k28m2", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("k28m2"); +} + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( snspell ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351n2l.vsm", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) + ROM_LOAD( "tmc0352n2l.vsm", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) +ROM_END + +ROM_START( snspellp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "us4189779_tmc0271", 0x0000, 0x1000, CRC(d3f5a37d) SHA1(f75ab617a6067d4d3a954a9f86126d2089554df8) ) // typed in from patent US4189779, verified by 2 sources + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version + ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " +ROM_END + +ROM_START( snspellua ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) + ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) +ROM_END + +ROM_START( snspellub ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2350a.vsm", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) +ROM_END + +ROM_START( snspelluk ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2303.vsm", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) + ROM_LOAD( "cd2304.vsm", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) +ROM_END + +ROM_START( snspelluka ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62175.vsm", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) +ROM_END + +ROM_START( snspelljp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2321.vsm", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) + ROM_LOAD( "cd2322.vsm", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) +ROM_END + +ROM_START( snspellsp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2701n2l_p", 0x0000, 0x1000, CRC(5230612a) SHA1(3ec75b207380af2efe84e865fe83ea29e79e8eea) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2701_output.pla", 0, 1246, CRC(f26980bd) SHA1(8d0c98fe5240541cb53c1e1d14c2a4560e7a7f32) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2319.vsm", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) + ROM_LOAD( "cd2320.vsm", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) +ROM_END + +ROM_START( snspellfr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) +ROM_END + +ROM_START( snspellit ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) +ROM_END + + +ROM_START( snspellc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2354.vsm", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) +ROM_END + +ROM_START( snspellca ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2354a.vsm", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) +ROM_END + +ROM_START( snspellcuk ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62174a.vsm", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) +ROM_END + + +ROM_START( snmath ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2704b-n2l", 0x0000, 0x1000, CRC(7e06c7c5) SHA1(d60a35a8163ab593c31afc840a0d8a9b3a762f29) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) + ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) +ROM_END + +ROM_START( snmatha ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2708-n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2381.vsm", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) + ROM_LOAD( "cd2614.vsm", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) + ROM_RELOAD( 0x5000, 0x1000 ) + ROM_RELOAD( 0x6000, 0x1000 ) + ROM_RELOAD( 0x7000, 0x1000 ) +ROM_END + +ROM_START( snmathp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + // typed in from patent 4946391, verified with source code + // BTANB note: Mix It does not work at all, this is an original bug in the patent listing. There are probably other minor bugs too. + ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version + ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " +ROM_END + + +ROM_START( snread ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2705b-n2l", 0x0000, 0x1000, CRC(c235636e) SHA1(57b24dd8414bf76ec786a51d10cb8a5898b60e18) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2705_output.pla", 0, 1246, CRC(bf859848) SHA1(66b297fbf534968fa6db7413b99ef0e81cc35ddc) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2394a.vsm", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) + ROM_LOAD( "cd2395a.vsm", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) +ROM_END + + +ROM_START( lantutor ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "us4631748_tmc0275", 0x0000, 0x1000, CRC(22818845) SHA1(1a84f15fb18ca66b1f2bf7491d76fbc56068984d) ) // extracted visually from patent US4631748, verified with source code + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // not verified + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, BAD_DUMP CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // taken from snspell, mostly looks correct + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // cartridge area +ROM_END + + +ROM_START( tntell ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) +ROM_END + +ROM_START( tntelluk ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd62170.vsm", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) +ROM_END + +ROM_START( tntellfr ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd62171.vsm", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) +ROM_END + +ROM_START( tntellp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "us4403965_cd1100", 0x0000, 0x0800, BAD_DUMP CRC(863a1c9e) SHA1(f2f9eb0ae17eedd4ef2b887b34601e75b4f6c720) ) // typed in from patent US4403965/EP0048835A2, may have errors + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) // from cd8012, matches patent source code + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_us4403965_output.pla", 0, 365, CRC(66cfb3c3) SHA1(80a05e5d729518e1f35d8f26438f56e80ffbd003) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) +ROM_END + + +ROM_START( vocaid ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // same hw as tntell, but no external slot + ROM_LOAD( "cd2357.vsm", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) +ROM_END + + +ROM_START( k28m2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(08d15ab6) SHA1(5b0f6c53e6732a362c4bb25d966d4072fdd33db8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge + ROM_LOAD( "cm62084.vsm", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) +ROM_END + +} // anonymous namespace + + + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1979, snspell, 0, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspellp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snspellub, snspell, 0, sns_tmc0281d, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspellua, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspelluk, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1981, snspelluka, snspell, 0, sns_cd2801, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1979, snspelljp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1981, snspellsp, snspell, 0, snspellsp, snspellsp, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Spanish, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snspellfr, snspell, 0, sns_cd2801, snspellfr, tispeak_state, init_snspell, "Texas Instruments", u8"La Dictée Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellit, snspell, 0, snspellit, snspellit, tispeak_state, init_snspell, "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1981, snspellc, 0, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellca, snspellc, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellcuk, snspellc, 0, snspellcuk, snspellcuk, tispeak_state, init_snspell, "Texas Instruments", "Speak & Write (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1980, snmath, 0, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1986, snmatha, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snmathp, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IS_INCOMPLETE ) + +COMP( 1980, snread, 0, 0, snread, snread, tispeak_state, init_snspell, "Texas Instruments", "Speak & Read (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, init_lantutor, "Texas Instruments", "Language Tutor (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) + +COMP( 1981, tntell, 0, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) +COMP( 1980, tntellp, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +COMP( 1981, tntelluk, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) +COMP( 1981, tntellfr, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1982, vocaid, 0, 0, vocaid, tntell, tispeak_state, empty_init, "Texas Instruments", "Vocaid", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1985, k28m2, 0, 0, k28m2, k28m2, tispeak_state, init_snspell, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/misc_handheld/tispellb.cpp b/src/mame/misc_handheld/tispellb.cpp new file mode 100644 index 00000000000..3826fcae96c --- /dev/null +++ b/src/mame/misc_handheld/tispellb.cpp @@ -0,0 +1,452 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** + + Texas Instruments Spelling B hardware + + The Spelling B was introduced together with the Speak & Spell. It is a + handheld educational toy with booklet. Two revisions of the hardware exist. + (* indicates not dumped) + + 1st revision: + + Spelling B (US), 1978 + - TMS0270 MCU TMC0272 (die label 0272A T0270B) + - TMS1980 MCU TMC1984 (die label 1980A 84A) + - 8-digit cyan VFD display (seen with and without apostrophe) + + Spelling ABC (UK), 1979: exact same hardware as US version + + 2nd revision: + + Spelling B (US), 1979 + - TMS0270 MCU TMC0274 + - TMC0355 4KB VSM ROM CD2602 + - 8-digit cyan VFD display + - 1-bit sound (indicated by a music note symbol on the top-right of the casing) + - note: much rarer than the 1978 version, not much luck finding one on eBay + + Spelling ABC (UK), 1979: exact same hardware as US version + + Spelling ABC (Germany), 1979: different VSM + - TMC0355 4KB VSM ROM CD2607* + + Mr. Challenger (US), 1979 + - TMS0270 MCU TMC0273 + - TMC0355 4KB VSM ROM CD2601 + - 8-digit cyan VFD display + - 1-bit sound + + Letterlogic (UK), 1980: exact same hardware as US Mr. Challenger + + Letterlogic (France), 1980: different VSM + - TMC0355 4KB VSM ROM CD2603* + + Letterlogic (Germany), 1980: different VSM + - TMC0355 4KB VSM ROM CD2604* + + +---------------------------------------------------------------------------- + + TODO: + - spellb fetches wrong word sometimes (on lv1 SPOON and ANT) - roms were doublechecked + + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "machine/tms6100.h" +#include "speaker.h" + +// internal artwork +#include "spellb.lh" + + +class tispellb_state : public hh_tms1k_state +{ +public: + tispellb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_subcpu(*this, "subcpu"), + m_tms6100(*this, "tms6100") + { } + + void rev1(machine_config &config); + void rev2(machine_config &config); + + virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override; + +private: + // devices + optional_device m_subcpu; + optional_device m_tms6100; + + u8 m_rev1_ctl = 0; + u16 m_sub_o = 0; + u16 m_sub_r = 0; + + virtual void power_off() override; + void power_subcpu(); + void update_display(); + + u8 main_read_k(); + void main_write_o(u16 data); + void main_write_r(u16 data); + + u8 rev1_ctl_r(); + void rev1_ctl_w(u8 data); + u8 sub_read_k(); + void sub_write_o(u16 data); + void sub_write_r(u16 data); + + void rev2_write_o(u16 data); + void rev2_write_r(u16 data); + + virtual void machine_start() override; +}; + +void tispellb_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_rev1_ctl)); + save_item(NAME(m_sub_o)); + save_item(NAME(m_sub_r)); +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +// common + +void tispellb_state::power_subcpu() +{ + if (m_subcpu) + m_subcpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); +} + +void tispellb_state::power_off() +{ + hh_tms1k_state::power_off(); + power_subcpu(); +} + +void tispellb_state::update_display() +{ + // almost same as snspell + u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; + m_display->matrix(m_grid & gridmask, m_plate); +} + +void tispellb_state::main_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and AP as d15, same as snspell + m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); + update_display(); +} + +void tispellb_state::main_write_r(u16 data) +{ + // R13: power-off request, on falling edge + if (~data & m_r & 0x2000) + power_off(); + + // R0-R6: input mux + // R0-R7: select digit + // R15: filament on + m_r = data; + m_inp_mux = data & 0x7f; + m_grid = data & 0x80ff; + update_display(); +} + +u8 tispellb_state::main_read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[7]->read() | read_inputs(7); +} + + +// 1st revision mcu/mcu comms + +void tispellb_state::rev1_ctl_w(u8 data) +{ + // main CTL write data + m_rev1_ctl = data & 0xf; +} + +u8 tispellb_state::sub_read_k() +{ + // sub K8421 <- main CTL3210 + return m_rev1_ctl; +} + +void tispellb_state::sub_write_o(u16 data) +{ + // sub O write data + m_sub_o = data; +} + +u8 tispellb_state::rev1_ctl_r() +{ + // main CTL3210 <- sub O6043 + return bitswap<4>(m_sub_o,6,0,4,3); +} + +void tispellb_state::sub_write_r(u16 data) +{ + // sub R: unused? + m_sub_r = data; +} + + +// 2nd revision specifics + +void tispellb_state::rev2_write_o(u16 data) +{ + // SEG DP: speaker out + m_speaker->level_w(data >> 15 & 1); + + // SEG DP and SEG AP are not connected to VFD, rest is same as rev1 + main_write_o(data & 0x6fff); +} + +void tispellb_state::rev2_write_r(u16 data) +{ + // R12: TMC0355 CS + // R4: TMC0355 M1 + // R6: TMC0355 M0 + m_tms6100->cs_w(data >> 12 & 1); + m_tms6100->m1_w(data >> 4 & 1); + m_tms6100->m0_w(data >> 6 & 1); + m_tms6100->clk_w(1); + m_tms6100->clk_w(0); + + // rest is same as rev1 + main_write_r(data); +} + + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +INPUT_CHANGED_MEMBER(tispellb_state::power_button) +{ + hh_tms1k_state::power_button(field, param, oldval, newval); + power_subcpu(); +} + +static INPUT_PORTS_START( spellb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Memory") PORT_CHAR('=') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Clue") PORT_CHAR('-') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") PORT_CHAR(8) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") PORT_CHAR(13) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") PORT_CHAR('7') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Level") PORT_CHAR('/') + + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter") PORT_CHAR('3') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word") PORT_CHAR('4') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble") PORT_CHAR('5') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With") PORT_CHAR('2') +INPUT_PORTS_END + + +static INPUT_PORTS_START( mrchalgr ) + PORT_INCLUDE( spellb ) // same key layout as spellb + + PORT_MODIFY("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("2nd Player") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Score") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Crazy Letters") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Guesser") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Word Challenge") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") +INPUT_PORTS_END + + + +/*************************************************************************** + + Machine Config + +***************************************************************************/ + +void tispellb_state::rev1(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); + m_maincpu->o().set(FUNC(tispellb_state::main_write_o)); + m_maincpu->r().set(FUNC(tispellb_state::main_write_r)); + m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r)); + m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w)); + + TMS1980(config, m_subcpu, 350000); // approximation + m_subcpu->k().set(FUNC(tispellb_state::sub_read_k)); + m_subcpu->o().set(FUNC(tispellb_state::sub_write_o)); + m_subcpu->r().set(FUNC(tispellb_state::sub_write_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_spellb); + + // no sound! +} + + +void tispellb_state::rev2(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); + m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o)); + m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r)); + m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r)); + m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w)); + + TMS6100(config, m_tms6100, 350000); + m_tms6100->enable_4bit_mode(true); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_spellb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( spellb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0272nl", 0x0000, 0x1000, CRC(f90318ff) SHA1(7cff03fafbc66b0e07b3c70a513fbb0b11eef4ea) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(3e021cbd) SHA1(c9bdfe10601b8a5a70442fe4805e4bfed8bbed35) ) + + ROM_REGION( 0x1000, "subcpu", 0 ) + ROM_LOAD( "tmc1984nl", 0x0000, 0x1000, CRC(78c9c83a) SHA1(6307fe2a0228fd1b8d308fcaae1b8e856d40fe57) ) + + ROM_REGION( 1246, "subcpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "subcpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "subcpu:opla", 0 ) + ROM_LOAD( "tms1980_spellb_output.pla", 0, 525, CRC(1e26a719) SHA1(eb031aa216fe865bc9e40b070ca5de2b1509f13b) ) +ROM_END + +ROM_START( spellb79 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0274n2l", 0x0000, 0x1000, CRC(98e3bd32) SHA1(e79b59ac29b0183bf1ee8d84b2944450c5e5d8fb) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_spellb79_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) + + ROM_REGION( 0x1000, "tms6100", 0 ) + ROM_LOAD( "cd2602.vsm", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) +ROM_END + + +ROM_START( mrchalgr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0273nll", 0x0000, 0x1000, CRC(ef6d23bd) SHA1(194e3b022c299e99a731bbcfba5bf8a3a9f0d07e) ) // matches patent US4421487 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) + + ROM_REGION( 0x1000, "tms6100", 0 ) + ROM_LOAD( "cd2601.vsm", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) +ROM_END + + + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1978, spellb, 0, 0, rev1, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1979, spellb79, spellb, 0, rev2, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1979 version)", MACHINE_SUPPORTS_SAVE ) + +COMP( 1979, mrchalgr, 0, 0, rev2, mrchalgr, tispellb_state, empty_init, "Texas Instruments", "Mr. Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/wildfire.cpp b/src/mame/misc_handheld/wildfire.cpp new file mode 100644 index 00000000000..a680974da95 --- /dev/null +++ b/src/mame/misc_handheld/wildfire.cpp @@ -0,0 +1,212 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen + +This is an electronic handheld pinball game. It has dozens of small leds to +create the illusion of a moving ball, and even the flippers are leds. A drawing +of a pinball table is added as overlay. + +Hardware notes: +- AMI S2150, labeled C10641 +- RC circuit for speaker volume decay (see patent US4334679 FIG.5, + the 2 resistors at A12 are 10K and the cap is 4.7uF) + +led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x: +*note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48 + + 0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6 + 1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5 + 2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4 + 3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3 + 4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6 + 5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!) + 6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5 + 7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!) + 8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3 + 9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = - + +NOTE!: MAME external artwork is required + +TODO: +- sound can be improved, volume decay should be more steep at the start, and the + pitch sounds wrong too (latter is an MCU emulation problem) + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/amis2000/amis2000.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" +#include "video/pwm.h" +#include "speaker.h" + +#include "wildfire.lh" + + +namespace { + +class wildfire_state : public driver_device +{ +public: + wildfire_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_volume(*this, "volume") + { } + + void wildfire(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_display; + required_device m_speaker; + required_device m_volume; + + void update_display(); + void write_d(u8 data); + void write_a(u16 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; + + u16 m_a = 0; + u8 m_d = 0; +}; + +void wildfire_state::machine_start() +{ + // register for savestates + save_item(NAME(m_a)); + save_item(NAME(m_d)); + save_item(NAME(m_speaker_volume)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void wildfire_state::speaker_update() +{ + if (~m_a & 0x1000) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.0025; +} + +void wildfire_state::update_display() +{ + m_display->matrix(~m_a, m_d); +} + +void wildfire_state::write_d(u8 data) +{ + // D0-D7: led/7seg data + m_d = bitswap<8>(data,7,0,1,2,3,4,5,6); + update_display(); +} + +void wildfire_state::write_a(u16 data) +{ + // A0-A2: digit select + // A3-A11: led select + m_a = data; + update_display(); + + // A12: speaker on + speaker_update(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( wildfire ) + PORT_START("IN.0") // I + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +// 7seg decoder table differs from default, this one is made by hand +static const u8 wildfire_7seg_table[0x10] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 + 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, - +}; + +void wildfire_state::wildfire(machine_config &config) +{ + // basic machine hardware + AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=? + m_maincpu->set_7seg_table(wildfire_7seg_table); + m_maincpu->read_i().set_ioport("IN.0"); + m_maincpu->write_d().set(FUNC(wildfire_state::write_d)); + m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); + m_maincpu->write_f().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(7, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // bumpers are dimmed + config.set_default_layout(layout_wildfire); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100)); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( wildfire ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + // Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verified with release version. + ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) + ROM_CONTINUE( 0x0600, 0x0200 ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release diff --git a/src/mame/parker/talkingbb.cpp b/src/mame/parker/talkingbb.cpp deleted file mode 100644 index 1118559e70c..00000000000 --- a/src/mame/parker/talkingbb.cpp +++ /dev/null @@ -1,351 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/****************************************************************************** - -Parker Brothers Starting Lineup Talking Baseball - -Hardware notes: -- PCB label KPT-349 REV 6C<1> -- 80C31 MCU @ 12MHz -- 2KB RAM, 128KB ROM, 2 cartridge slots -- 12 leds, 2 16-button keypads - -ROM chip has (C) 1987 Tonka (Kenner Parker Toys was acquired by Tonka in 1987, Parker -Brothers itself was acquired by Kenner in 1985) - -The speech driver is by Forrest S. Mozer's company. - -The cartridge slots are for extra teams. There are around 8 cartridges, each one -included 3 or 4 baseball teams, with exception to the "Hall of Fame" cartridge. -Players enter a 3-digit code to select the team. - -TODO: -- add cartridge slots -- Buttons are unresponsive at initial game setup, you need to hold the yes/no button - until it responds. The keypad reading routine is at $1A5D, it gets skipped for several - seconds at a time. Once in-game, everything is fine though. BTANB or different cause? - -******************************************************************************* - -Field positions (used when substituting): - -1: Pitcher -2: Catcher -3: First Base -4: Second Base -5: Third Base -6: Shortstop -7: Left Field -8: Center Field -9: Right Field - -The game includes baseball cards with player stats. At the very least, the roster -cards are needed to play the game properly. See below for the default teams. - -American Team: --------------- - -Starting lineup batting order: - -1: #23 Rickey Henderson, CF -2: #14 Don Mattingly, 1B -3: #18 Wade Boggs, 3B -4: #22 George Bell, LF -5: #24 Dave Winfield, RF -6: #16 Cal Ripken, SS -7: #11 Terry Kennedy, C -8: #15 Willie Randolph, 2B -9: #20 Alan Trammell, SS & DH -10:#27 Roger Clemens, P - -Substitutes: - -#19: George Brett, 3B -#12: Carlton Fisk, C -#25: Jack Morris, P -#13: Eddie Murray, 1B -#21: Kirby Puckett, OF -#30: Dan Quisenberry, P -#29: Dave Righetti, P -#28: Bret Saberhagen, P -#17: Lou Whitaker, 2B -#26: Robin Yount, SS - -National Team: --------------- - -Starting lineup batting order: - -1: #23: Tim Raines, LF -2: #16: Ryne Sandberg, 2B -3: #22: Darryl Strawberry, RF -4: #19: Mike Schmidt, 3B -5: #13: Jack Clark, 1B -6: #20: Eric Davis, CF -7: #11: Gary Carter, C -8: #17: Ozzie Smith, SS -9: #18: Dale Murphy, OF & DH -10:#25: Mike Scott, P - -Substitutes: - -#15: Buddy Bell, 3B -#26: Jody Davis, C -#24: Andre Dawson, CF -#29: Dwight Gooden, P -#21: Tony Gwynn, OF -#14: Keith Hernandez, 1B -#30: Nolan Ryan, P -#12: Steve Sax, 2B -#28: Fernando Valenzuela, P -#27: Todd Worrell, P - -******************************************************************************/ - -#include "emu.h" -#include "cpu/mcs51/mcs51.h" -#include "video/pwm.h" -#include "sound/dac.h" -#include "speaker.h" - -// internal artwork -#include "talkingbb.lh" - - -namespace { - -class talkingbb_state : public driver_device -{ -public: - talkingbb_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_rom(*this, "maincpu"), - m_display(*this, "display"), - m_inputs(*this, "IN.%u", 0) - { } - - void talkingbb(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_region_ptr m_rom; - required_device m_display; - required_ioport_array<5> m_inputs; - - void main_map(address_map &map); - void main_io(address_map &map); - - u8 m_bank = 0; - u8 m_inp_mux = 0; - - // I/O handlers - void bank_w(u8 data); - u8 bank_r(offs_t offset); - void input_w(u8 data); - u8 input_r(); - u8 switch_r(); -}; - -void talkingbb_state::machine_start() -{ - // register for savestates - save_item(NAME(m_bank)); - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void talkingbb_state::bank_w(u8 data) -{ - // d0-d1: upper rom bank - // d2-d4: upper rom enable (bus conflict possible) - // d2: internal rom, d3: cart slot 1, d4: cart slot 2 - m_bank = data; -} - -u8 talkingbb_state::bank_r(offs_t offset) -{ - u32 hi = (~m_bank & 3) << 15; - u8 data = (m_bank & 4) ? 0xff : m_rom[offset | hi]; - - // TODO: cartridge - - return data; -} - -void talkingbb_state::input_w(u8 data) -{ - // no effect if P30 is low (never happens though) - if (~m_bank & 1) - return; - - // d4-d7: led select (also input mux) - // d0-d2: led data - m_inp_mux = data >> 4; - m_display->matrix(m_inp_mux, ~data & 7); -} - -u8 talkingbb_state::input_r() -{ - // open bus if P30 is low (never happens though) - if (~m_bank & 1) - return 0xff; - - u8 data = 0; - - // multiplexed inputs - for (int i = 0; i < 4; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - -u8 talkingbb_state::switch_r() -{ - // d5: mode switch - return ~m_inputs[4]->read(); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void talkingbb_state::main_map(address_map &map) -{ - map(0x0000, 0x7fff).rom().region("maincpu", 0x18000); - map(0x8000, 0xffff).r(FUNC(talkingbb_state::bank_r)); -} - -void talkingbb_state::main_io(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x7800).ram(); - map(0x8000, 0x8000).mirror(0x7fff).rw(FUNC(talkingbb_state::input_r), FUNC(talkingbb_state::input_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -/* keypad layout: **** P1 = Batter **** | **** P2 = Pitcher **** - | -[PINCH [1 [2] [3 [TIME OUT] | [INFIELD [1 [2 [3 [TIME OUT] - HITTER] BUNT] POWER] | IN] FAST] CURVE] CHANGE] - | -[SCORE] [4] [5 [6] [NO | [SCORE] [4 [5 [6 [NO - SQUEEZE] CANCEL] | PTCHOUT] PICKOFF] INTWALK] CANCEL] - | -[PINCH [7 [8] [9 [YES | [INSTANT [7 [8] [9 [YES - RUNNER] STEAL] X-BASE] ENTER] | REPLAY] RELIEF] SUB] ENTER] - | - [0 | [0 - SWING] | BALL] -*/ - -static INPUT_PORTS_START( talkingbb ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_R) PORT_NAME("P1 3 / Power") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F) PORT_NAME("P1 6") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_V) PORT_NAME("P1 9 / Extra Base") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("P1 Time Out") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_O) PORT_NAME("P2 3 / Change") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_L) PORT_NAME("P2 6 / Intentional Walk") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("P2 9 / Sub") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("P2 Time Out") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_E) PORT_NAME("P1 2") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_D) PORT_NAME("P1 5 / Squeeze") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_C) PORT_NAME("P1 8") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_LALT) PORT_NAME("P1 0 / Swing") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 2 / Curve") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 5 / Pickoff") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 8") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RALT) PORT_NAME("P2 0 / Ball") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_W) PORT_NAME("P1 1 / Bunt") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_S) PORT_NAME("P1 4") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_X) PORT_NAME("P1 7 / Steal") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 1 / Fast") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 4 / Pitchout") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 7 / Relief") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Pinch Hitter") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pinch Runner") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Infield In") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Instant Replay") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") - - PORT_START("IN.4") - PORT_CONFNAME( 0x20, 0x00, "Mode" ) - PORT_CONFSETTING( 0x00, "Player" ) - PORT_CONFSETTING( 0x20, "Coach" ) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void talkingbb_state::talkingbb(machine_config &config) -{ - /* basic machine hardware */ - I80C31(config, m_maincpu, 12_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &talkingbb_state::main_map); - m_maincpu->set_addrmap(AS_IO, &talkingbb_state::main_io); - m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); - m_maincpu->port_out_cb<3>().set(FUNC(talkingbb_state::bank_w)); - m_maincpu->port_in_cb<3>().set(FUNC(talkingbb_state::switch_r)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 3); - config.set_default_layout(layout_talkingbb); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( talkingbb ) - ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD("sp17208-002", 0x0000, 0x20000, CRC(e0e56217) SHA1(24a06b5c94a5c750799f61e3eb865e02d6cea68a) ) // GM231000-110 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1988, talkingbb, 0, 0, talkingbb, talkingbb, talkingbb_state, empty_init, "Parker Brothers", "Starting Lineup Talking Baseball", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/parker/talkingfb.cpp b/src/mame/parker/talkingfb.cpp deleted file mode 100644 index 46dc83b6a00..00000000000 --- a/src/mame/parker/talkingfb.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/****************************************************************************** - -Parker Brothers Superstar Lineup Talking Football - -Hardware notes: -- PCB label KPT-410 REV B1 (*KPT = Kenner Parker Toys) -- 80C31 MCU @ 12MHz -- 2KB RAM, 256KB ROM, 2 cartridge slots -- two 20-button keypads - -Like Baseball, The ROM chip has (C) Tonka. -The speech driver is by Mozer, the ROM data includes employees names. - -The cartridge slots are probably meant for extra teams. I can't find anything -about it in the manual or any proof that cartridges were released for this. -Maybe the toy went out of production soon after release. - -The game includes formation cards, refer to the manual on which number is which strategy. - -TODO: -- add cartridge slots (no need if no carts exist?) -- verify keypad (everything seems ok, but "Pursue" and "Go For Turnover" might - be swapped, their function is nearly identical so it's hard to test) - -******************************************************************************/ - -#include "emu.h" -#include "cpu/mcs51/mcs51.h" -#include "sound/dac.h" -#include "speaker.h" - - -namespace { - -class talkingfb_state : public driver_device -{ -public: - talkingfb_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_rom(*this, "maincpu"), - m_inputs(*this, "IN.%u", 0) - { } - - void talkingfb(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_region_ptr m_rom; - required_ioport_array<5> m_inputs; - - void main_map(address_map &map); - void main_io(address_map &map); - - u8 m_bank = 0; - u8 m_inp_mux = 0; - - // I/O handlers - void bank_w(u8 data); - template u8 bank_r(offs_t offset); - void input_w(u8 data); - u8 input_r(); -}; - -void talkingfb_state::machine_start() -{ - // register for savestates - save_item(NAME(m_bank)); - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void talkingfb_state::bank_w(u8 data) -{ - // d0-d2: upper rom bank - // d3-d5: upper rom enable (bus conflict possible) - // d3: cart slot 1, d4: cart slot 2, d5: internal rom - m_bank = data; -} - -template -u8 talkingfb_state::bank_r(offs_t offset) -{ - u32 hi = (m_bank & 7) << 15; - u8 data = (m_bank & 0x20) ? 0xff : m_rom[offset | hi]; - - // cartridge slots are only enabled if PSEN is high - // TODO - - return data; -} - -void talkingfb_state::input_w(u8 data) -{ - // d3-d7: input mux - m_inp_mux = data >> 3; -} - -u8 talkingfb_state::input_r() -{ - u8 data = 0; - - // multiplexed inputs - for (int i = 0; i < 5; i++) - if (BIT(~m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void talkingfb_state::main_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<0>)); -} - -void talkingfb_state::main_io(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x3800).ram(); - map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(talkingfb_state::input_r), FUNC(talkingfb_state::input_w)); - map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<1>)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -/* keypad layout is like this: (P1 = Home, P2 = Away, both keypads are same) - -OFFENSIVE [1 [2 [3 DEFENSIVE - ACTION HB] FB] ST] ACTION - -[SCRAM/ [SCORE] [4 [5 [6 [PURSUE] - EVADE] FL] WR] TE] - -[PASS OUT/ [TIME [7] [8 [9] [GO FOR - RUN OUT] OUT] SE] TURNOVER] - -[CHECK OFF [REPLAY] [YES/ [0 [NO/ - TO BACK] ENTER] DEMO] CANCEL] - -*/ - -static INPUT_PORTS_START( talkingfb ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Pursue") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Scram / Evade") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Pass Out / Run Out") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Check Off To Back") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pursue") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Scram / Evade") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Pass Out / Run Out") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("P1 Check Off To Back") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Go For Turnover") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Time Out") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Replay") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Go For Turnover") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Time Out") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("P1 Replay") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P2 1 / HB") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P2 4 / FL") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P2 7") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("P1 1 / HB") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("P1 4 / FL") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("P1 7") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P2 2 / FB") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P2 5 / WR") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P2 8 / SE") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P2 0 / Demo") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("P1 2 / FB") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("P1 5 / WR") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("P1 8 / SE") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("P1 0 / Demo") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P2 3 / ST") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P2 6 / TE") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P2 9") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("P1 3 / ST") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("P1 6 / TE") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("P1 9") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void talkingfb_state::talkingfb(machine_config &config) -{ - /* basic machine hardware */ - I80C31(config, m_maincpu, 12_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &talkingfb_state::main_map); - m_maincpu->set_addrmap(AS_IO, &talkingfb_state::main_io); - m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); - m_maincpu->port_out_cb<3>().set(FUNC(talkingfb_state::bank_w)); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( talkingfb ) - ROM_REGION( 0x40000, "maincpu", 0 ) - ROM_LOAD("sp17492-001", 0x0000, 0x40000, CRC(d03851c6) SHA1(e8ac9c342bee987657c3c18f24d466b3906d6fb0) ) // Sharp LH532378 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1989, talkingfb, 0, 0, talkingfb, talkingfb, talkingfb_state, empty_init, "Parker Brothers", "Superstar Lineup Talking Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/parker/wildfire.cpp b/src/mame/parker/wildfire.cpp deleted file mode 100644 index a680974da95..00000000000 --- a/src/mame/parker/wildfire.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/******************************************************************************* - -Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen - -This is an electronic handheld pinball game. It has dozens of small leds to -create the illusion of a moving ball, and even the flippers are leds. A drawing -of a pinball table is added as overlay. - -Hardware notes: -- AMI S2150, labeled C10641 -- RC circuit for speaker volume decay (see patent US4334679 FIG.5, - the 2 resistors at A12 are 10K and the cap is 4.7uF) - -led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x: -*note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48 - - 0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6 - 1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5 - 2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4 - 3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3 - 4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6 - 5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!) - 6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5 - 7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!) - 8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3 - 9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = - - -NOTE!: MAME external artwork is required - -TODO: -- sound can be improved, volume decay should be more steep at the start, and the - pitch sounds wrong too (latter is an MCU emulation problem) - -*******************************************************************************/ - -#include "emu.h" - -#include "cpu/amis2000/amis2000.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" -#include "video/pwm.h" -#include "speaker.h" - -#include "wildfire.lh" - - -namespace { - -class wildfire_state : public driver_device -{ -public: - wildfire_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_volume(*this, "volume") - { } - - void wildfire(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device m_display; - required_device m_speaker; - required_device m_volume; - - void update_display(); - void write_d(u8 data); - void write_a(u16 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; - - u16 m_a = 0; - u8 m_d = 0; -}; - -void wildfire_state::machine_start() -{ - // register for savestates - save_item(NAME(m_a)); - save_item(NAME(m_d)); - save_item(NAME(m_speaker_volume)); -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -void wildfire_state::speaker_update() -{ - if (~m_a & 0x1000) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.0025; -} - -void wildfire_state::update_display() -{ - m_display->matrix(~m_a, m_d); -} - -void wildfire_state::write_d(u8 data) -{ - // D0-D7: led/7seg data - m_d = bitswap<8>(data,7,0,1,2,3,4,5,6); - update_display(); -} - -void wildfire_state::write_a(u16 data) -{ - // A0-A2: digit select - // A3-A11: led select - m_a = data; - update_display(); - - // A12: speaker on - speaker_update(); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( wildfire ) - PORT_START("IN.0") // I - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -// 7seg decoder table differs from default, this one is made by hand -static const u8 wildfire_7seg_table[0x10] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 - 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, - -}; - -void wildfire_state::wildfire(machine_config &config) -{ - // basic machine hardware - AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=? - m_maincpu->set_7seg_table(wildfire_7seg_table); - m_maincpu->read_i().set_ioport("IN.0"); - m_maincpu->write_d().set(FUNC(wildfire_state::write_d)); - m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); - m_maincpu->write_f().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 8); - m_display->set_segmask(7, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // bumpers are dimmed - config.set_default_layout(layout_wildfire); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100)); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( wildfire ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - // Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verified with release version. - ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) - ROM_CONTINUE( 0x0600, 0x0200 ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release diff --git a/src/mame/ritam/monty.cpp b/src/mame/ritam/monty.cpp deleted file mode 100644 index 8a2718a167a..00000000000 --- a/src/mame/ritam/monty.cpp +++ /dev/null @@ -1,296 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Andrew Gardner, hap -/*************************************************************************** - -Driver for Ritam Monty Plays Scrabble Brand Crossword Game - Portable Computer Console - -Scrabble computer that allows you play a game of Scrabble by yourself (or you -can play with up to 3 players). Has a built-in 12,000 vocabulary, expandable -to 44,000 by way of 2 expansion modules each containing 16,000 more obscure words. -You can use the included 'score cards' (which look like little Scrabble boards), -or you can use a real Scrabble board and tiles to play. Also note, Monty -apparently originally came with a little pen. - -This game was later upgraded by Ritam to Master Monty which had 24,000 words -built-in (expandable to a total of 56,000 with the same 2 expansion modules). -Two variations on Master Monty have been seen: one looks exactly the same as the -Monty but the electronics on the inside have been upgraded. The later version -is blue and says Master Monty at the top. Both of these versions are hand-upgraded -by adding chips and wires to the inside of the game. - -Hardware notes: -- Z80 @ ~3.58MHz -- 2KB SRAM, 16KB ROM(32KB on mmonty) -- 2*16KB ROM sockets for vocabulary expansion -- 2*SED1503F, 40*32 LCD screen, beeper - -TODO: -- put expansion roms in softwarelist? (note: slot #1 only accepts rom #1, - slot #2 only accepts rom #2), they can be disabled in-game with option M - -****************************************************************************/ - -#include "emu.h" - -#include "cpu/z80/z80.h" -#include "sound/dac.h" -#include "video/sed1500.h" - -#include "screen.h" -#include "speaker.h" - -#include "monty.lh" - - -namespace { - -class monty_state : public driver_device -{ -public: - monty_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_lcd(*this, "lcd%u", 0) - , m_dac(*this, "dac") - , m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_WRITE_LINE_MEMBER(key_pressed); - - void monty(machine_config &config); - void mmonty(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device_array m_lcd; - required_device m_dac; - required_ioport_array<6> m_inputs; - - void monty_mem(address_map &map); - void mmonty_mem(address_map &map); - void monty_io(address_map &map); - - template void lcd_output_w(offs_t offset, u64 data) { m_lcd_data[N << 4 | offset] = data; } // buffer for screen_update - u32 screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); - - void control_w(offs_t offset, u8 data); - void lcd_w(offs_t offset, u8 data) { m_lcd[m_lcd_cs]->write(offset, data); } - u8 input_r(offs_t offset); - DECLARE_WRITE_LINE_MEMBER(halt_changed) { m_halt = state; } - - u64 m_lcd_data[32]; - int m_lcd_cs = 0; - int m_halt = 0; -}; - -void monty_state::machine_start() -{ - memset(m_lcd_data, 0, sizeof(m_lcd_data)); - - save_item(NAME(m_lcd_data)); - save_item(NAME(m_lcd_cs)); - save_item(NAME(m_halt)); -} - - - -/****************************************************************************** - Video -******************************************************************************/ - -u32 monty_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) -{ - bitmap.fill(0xffffff); - - // letters with width 5 with space in between them - for (int y = 0; y < 32; y++) - for (int x = 0; x < 40; x++) - bitmap.pix(y + 1, x + x/5 + 1) = BIT(m_lcd_data[y], x) ? 0 : 0xffffff; - - return 0; -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void monty_state::control_w(offs_t offset, u8 data) -{ - // a0: speaker out - m_dac->write(BIT(offset, 0)); - - // a1: lcd chip select - m_lcd_cs = BIT(offset, 1); -} - -u8 monty_state::input_r(offs_t offset) -{ - u8 data = 0; - - // a0-a5, d0-d4: multiplexed inputs - for (int i = 0; i < 6; i++) - if (BIT(offset, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - -WRITE_LINE_MEMBER(monty_state::key_pressed) -{ - if (state && m_halt) - m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void monty_state::monty_mem(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).rom(); // slot 1 - map(0x8000, 0xbfff).rom(); // slot 2 - map(0xf800, 0xffff).ram(); -} - -void monty_state::mmonty_mem(address_map &map) -{ - map(0x0000, 0x77ff).rom(); - map(0x7800, 0x7fff).ram(); - map(0x8000, 0xbfff).rom(); // slot 2 - map(0xc000, 0xffff).rom(); // slot 1 -} - -void monty_state::monty_io(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0xff).r(FUNC(monty_state::input_r)); - map(0x00, 0x03).w(FUNC(monty_state::control_w)); - map(0x80, 0xff).w(FUNC(monty_state::lcd_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( monty ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Option") PORT_CODE(KEYCODE_SPACE) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Blank") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('M') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('I') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('G') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_UP) PORT_CHAR('C') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void monty_state::monty(machine_config &config) -{ - // Basic machine hardware - Z80(config, m_maincpu, 3.579545_MHz_XTAL); // Ceramic resonator labeled 3.58MT - m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::monty_mem); - m_maincpu->set_addrmap(AS_IO, &monty_state::monty_io); - m_maincpu->halt_cb().set(FUNC(monty_state::halt_changed)); - - // Video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(60); - screen.set_vblank_time(0); - screen.set_size(40+8+1, 32+1); - screen.set_visarea_full(); - screen.set_screen_update(FUNC(monty_state::screen_update)); - - SED1503(config, m_lcd[0], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<0>)); - SED1503(config, m_lcd[1], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<1>)); - config.set_default_layout(layout_monty); - - // Sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - -void monty_state::mmonty(machine_config &config) -{ - monty(config); - m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::mmonty_mem); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( monty ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "monty_main.bin", 0x0000, 0x4000, CRC(720b4f55) SHA1(0106eb88d3fbbf25a745b9b6ee785ba13689d095) ) // 27128 - ROM_LOAD( "monty_module1.bin", 0x4000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 - ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 -ROM_END - -ROM_START( mmonty ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "master_monty_main.bin", 0x0000, 0x8000, CRC(bb5ef4d4) SHA1(ba2c759e429f8740df419f9abb60832eddfba8ab) ) // 27C256 - ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 - ROM_LOAD( "monty_module1.bin", 0xc000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, monty, 0, 0, monty, monty, monty_state, empty_init, "Ritam", "Monty Plays Scrabble", MACHINE_SUPPORTS_SAVE ) -COMP( 1987, mmonty, 0, 0, mmonty, monty, monty_state, empty_init, "Ritam", "Master Monty", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/selchow/scrablex.cpp b/src/mame/selchow/scrablex.cpp deleted file mode 100644 index 15b69e7f947..00000000000 --- a/src/mame/selchow/scrablex.cpp +++ /dev/null @@ -1,229 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/******************************************************************************* - -Selchow & Righter Scrabble Lexor -It's a tabletop scrabble game/scorekeeper. - -Hardware notes: -- PCB label: PB-074 -- Fujitsu MB8841 MCU -- 8-digit 14-seg LEDs, 2-bit sound - -There's also a version of this game on a Panasonic MN1405 MCU. - -*******************************************************************************/ - -#include "emu.h" -#include "cpu/mb88xx/mb88xx.h" -#include "sound/spkrdev.h" -#include "video/pwm.h" -#include "speaker.h" - -#include "scrablex.lh" - - -namespace { - -class scrablex_state : public driver_device -{ -public: - scrablex_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - void scrablex(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device m_display; - required_device m_speaker; - required_ioport_array<5> m_inputs; - - void write_o(u8 data); - void write_p(u8 data); - template u8 read_r(); - template void write_r(u8 data); - - u8 m_inp_mux = 0; - u16 m_r = 0; -}; - -void scrablex_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_r)); -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -void scrablex_state::write_o(u8 data) -{ - // O0-O7: digit select (uses index 8-15) - m_display->write_my((1 << (data & 0xf)) >> 8); -} - -void scrablex_state::write_p(u8 data) -{ - // P0-P3: input mux part - m_inp_mux = (m_inp_mux & ~0xf) | (~data & 0xf); -} - -template -u8 scrablex_state::read_r() -{ - u16 data = 0; - - // R0-R8: multiplexed inputs - for (int i = 0; i < 5; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data >> (N * 4) & 0xf; -} - -template -void scrablex_state::write_r(u8 data) -{ - // R0-R13: digit segments - m_r = (m_r & ~(0xf << (N * 4))) | ((~data & 0xf) << (N * 4)); - m_display->write_mx(bitswap<14>(m_r,10,8,6,12,11,7,9,13,5,4,3,2,1,0)); - - // R14,R15: speaker out - m_speaker->level_w(m_r >> 14 & 3); - - // R15: input mux part - m_inp_mux = (m_inp_mux & 0xf) | (m_r >> 11 & 0x10); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( scrablex ) - PORT_START("IN.0") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.1") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - - PORT_START("IN.2") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR('*') - - PORT_START("IN.3") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Double") - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Triple") - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Word") - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Bonus") - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Minus") - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter") - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Flash") - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Solo") - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Score") - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Timer") - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Review") -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -void scrablex_state::scrablex(machine_config &config) -{ - // basic machine hardware - MB8841(config, m_maincpu, 500000); // approximation - RC osc. R=15K, C=100pF - m_maincpu->write_o().set(FUNC(scrablex_state::write_o)); - m_maincpu->write_p().set(FUNC(scrablex_state::write_p)); - m_maincpu->read_r<0>().set(FUNC(scrablex_state::read_r<0>)); - m_maincpu->read_r<1>().set(FUNC(scrablex_state::read_r<1>)); - m_maincpu->read_r<2>().set(FUNC(scrablex_state::read_r<2>)); - m_maincpu->read_r<3>().set(FUNC(scrablex_state::read_r<3>)); - m_maincpu->write_r<0>().set(FUNC(scrablex_state::write_r<0>)); - m_maincpu->write_r<1>().set(FUNC(scrablex_state::write_r<1>)); - m_maincpu->write_r<2>().set(FUNC(scrablex_state::write_r<2>)); - m_maincpu->write_r<3>().set(FUNC(scrablex_state::write_r<3>)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_scrablex); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( scrablex ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mb8841_320m", 0x0000, 0x0800, CRC(bef4ab5a) SHA1(44e385225c5e8818ed93c3654a294aa412042e34) ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, scrablex, 0, 0, scrablex, scrablex, scrablex_state, empty_init, "Selchow & Righter", "Scrabble Lexor - Computer Word Game", MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3