summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/handheld/hh_tms1k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/handheld/hh_tms1k.cpp')
-rw-r--r--src/mame/handheld/hh_tms1k.cpp4835
1 files changed, 3611 insertions, 1224 deletions
diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp
index 63927be59e7..aaed167331a 100644
--- a/src/mame/handheld/hh_tms1k.cpp
+++ b/src/mame/handheld/hh_tms1k.cpp
@@ -1,18 +1,20 @@
// 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
+- atari/hitparade.cpp: Atari Europe Hit Parade jukebox(es)
+- entex/sag.cpp: Entex Select-A-Game Machine (actually most games are on HMCS40)
+- miltonbradley/microvsn.cpp: Milton Bradley Microvision
+- misc/eva.cpp: Chrysler EVA-11 (and EVA-24)
+- ti/snspell.cpp: TI Speak & Spell series gen. 1
+- ti/snspellc.cpp: TI Speak & Spell Compact / Touch & Tell
+- ti/spellb.cpp: TI Spelling B series gen. 1
+- tiger/bingobear.cpp: Hasbro/Tiger Bingo Bear / Monkgomery Monkey
+- tiger/k28m2.cpp: Tiger K-2-8: Talking Learning Computer (model 7-232)
About the approximated MCU frequency everywhere: The RC osc. is not that
stable on most of these handhelds. When comparing multiple video recordings
@@ -21,7 +23,7 @@ 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:
+ROM source notes when dumped from another title, but confident it's the same:
- arrball: Tandy Zingo
- bcheetah: Fundimensions Incredible Brain Buggy
- cchime: Videomaster Door Tunes
@@ -36,6 +38,7 @@ ROM source notes when dumped from another publisher, but confident it's the same
- gpoker: Entex Electronic Poker
- matchnum: LJN Electronic Concentration
- palmf31: Toshiba BC-8018B
+- racetime: Bandai FL Grand Prix Champion
- ti1250: Texas Instruments TI-1200
- ti25503: Texas Instruments TI-1265
- ti5100: loose 1979 TMS1073NL chip
@@ -49,15 +52,14 @@ TODO:
- 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
+- finish bshipb SN76477 sound (incomplete output PLA)
- 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).
@@ -73,14 +75,16 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
*MP0121 TMS1000 1979, Waddingtons Compute-A-Tune
@MP0154 TMS1000 1979, Fonas 2 Player Baseball
@MP0158 TMS1000 1979, Entex Soccer (6003)
+ @MP0159 TMS1000 1979, Tomy Volleyball
@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)
+ *MP0169 TMS1000 1979, Conic Electronic Baseball
@MP0170 TMS1000 1979, Conic Football
*MP0171 TMS1000 1979, Tomy Soccer
*MP0220 TMS1000 1980, Tomy Teacher
@MP0230 TMS1000 1980, Entex Blast It (6015)
- @MP0271 TMS1000 1982, Radio Shack Monkey See
+ @MP0271 TMS1000 1982, Tandy (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)
@@ -99,7 +103,7 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@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
+ @MP1209 TMS1100 1980, U.S. Games Space Cruiser
@MP1211 TMS1100 1980, Entex Space Invader (6012)
@MP1215 TMS1100 1980, Tiger Playmaker
@MP1218 TMS1100 1980, Entex Basketball 2 (6010)
@@ -107,10 +111,15 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@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)
+ *MP1272 TMS1100 1981, Tandy Computerized Arcade (assumed same as CD7282, not confirmed)
+ @MP1288 TMS1100 1981, Tiger Finger Bowl
@MP1296 TMS1100 1982, Entex Black Knight Pinball (6081)
@MP1311 TMS1100 1981, Bandai TC7: Air Traffic Control
@MP1312 TMS1100 1981, Gakken FX-Micom R-165/Radio Shack Science Fair Microcomputer Trainer
- *MP1359 TMS1100? 1985, Capsela CRC2000
+ *MP1342 TMS1100 1985, Tiger Micro-Bot
+ @MP1343 TMS1100 1984, Tandy (Micronta) VoxClock 3
+ *MP1359 TMS1100 1985, Play-Jour Capsela CRC2000
+ @MP1362 TMS1100 1985, Technasonic Weight Talker
@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)
@@ -119,14 +128,17 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@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
+ *MP2721 TMS1070 1978, Sanyo VTC 9300 Beta VCR timer unit
@MP2726 TMS1040 1979, Tomy Break Up
- *MP2788 TMS1040? 1980, Bandai Flight Time (? note: VFD-capable)
+ @MP2787 TMS1070 1980, Bandai Race Time
+ *MP2788 TMS1070 1980, Bandai Flight Time
@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 1978, Concept 2000 Mr. Mus-I-Cal (model 560)
- *MP3207 TMS1000 1978, Concept 2000 Lite 'n Learn: Electronic Organ (model 554)
- @MP3208 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750B)
+ @MP3207 TMS1000 1978, Concept 2000 Lite 'n Learn: Electronic Organ (model 554)
+ @MP3208 TMS1000 1978, Milton Bradley Electronic Battleship (1977, model 4750B)
+ @MP3209 TMS1000 1978, Kenner Star Wars: Electronic Laser Battle Game
@MP3226 TMS1000 1978, Milton Bradley Simon (Rev A)
*MP3228 TMS1000 1979, Texas Instruments OEM melody chip
*MP3232 TMS1000 1979, Fonas 2 Player Baseball (no "MP" on chip label)
@@ -148,7 +160,8 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
*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
+ @MP3438A TMS1100 1979, Kenner Star Wars: Electronic Battle Command Game
+ MP3447 TMS1100 1982, Texas Instruments Les Maths Magiques -> ti/snspellc.cpp
MP3450A TMS1100 1979, Microvision cartridge: Block Buster
MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike
MP3455 TMS1100 1980, Microvision cartridge: Pinball
@@ -159,31 +172,36 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@MP3476 TMS1100 1979, Milton Bradley Super Simon
MP3479 TMS1100 1980, Microvision cartridge: Baseball
MP3481 TMS1100 1979, Microvision cartridge: Connect Four
+ @MP3487 TMS1100 1980, Lakeside Strobe
@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
+ @M34004A TMS1100 1981, Ideal Sky-Writer (note: MP3498, MP3499, M3400x..)
+ M34009 TMS1100 1981, Microvision cartridge: Alien Raiders
+ @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
+ *M34033 TMS1100 1982, Spartus Electronic Talking Clock (1411-61)
@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
+ *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
+ *MP6262A TMS1170 1981, Bearcat BC-210XL
@MP6354 TMS1475 1982, Tsukuda The Dracula
- *MP6361 TMS1475? 1983, <unknown> Defender Strikes
+ @MP6358 TMS1475 1982, Bandai U-Boat
+ *MP6361 TMS1475 1983, <unknown> Defender Strikes
@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
+ MP7324 TMS1400 1985, Tiger K-2-8/Coleco Talking Teacher -> tiger/k28m2.cpp
@MP7332 TMS1400 1981, Milton Bradley Dark Tower
@MP7334 TMS1400 1981, Coleco Total Control 4
@MP7351 TMS1400 1982, Parker Brothers Master Merlin
@@ -196,58 +214,72 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
inconsistent:
@TMS1007 TMS1000 1976, TSI Speech+ (S14002-A)
- @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?)
+ @CD7282SL TMS1100 1981, Tandy Computerized Arcade (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 "bus/generic/carts.h"
+#include "bus/generic/slot.h"
+#include "cpu/tms1000/tms1000.h"
+#include "cpu/tms1000/tms1000c.h"
+#include "cpu/tms1000/tms1100.h"
+#include "cpu/tms1000/tms1400.h"
+#include "cpu/tms1000/tms2400.h"
+#include "cpu/tms1000/tms0970.h"
+#include "cpu/tms1000/tms0980.h"
#include "machine/clock.h"
-#include "machine/ds8874.h"
+#include "machine/netlist.h"
+#include "machine/nvram.h"
#include "machine/timer.h"
#include "machine/tmc0999.h"
#include "machine/tms1024.h"
+#include "machine/tms6100.h"
#include "sound/beep.h"
#include "sound/flt_vol.h"
#include "sound/s14001a.h"
#include "sound/sn76477.h"
+#include "sound/spkrdev.h"
+#include "sound/tms5110.h"
+#include "video/ds8874.h"
#include "video/hlcd0515.h"
-#include "bus/generic/carts.h"
-#include "bus/generic/slot.h"
+#include "video/pwm.h"
#include "softlist_dev.h"
#include "screen.h"
#include "speaker.h"
-#include "utf8.h"
+// netlist
+#include "nl_bship.h"
// internal artwork
#include "t7in1ss.lh"
#include "alphie.lh"
-#include "amaztron.lh" // clickable
-#include "arcmania.lh" // clickable
+#include "amaztron.lh"
+#include "arcmania.lh"
#include "arrball.lh"
#include "astro.lh"
#include "bankshot.lh"
#include "bcheetah.lh"
#include "bigtrak.lh"
#include "blastit.lh"
-#include "bship.lh" // clickable
+#include "bship.lh"
#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 "cnsector.lh"
+#include "comp4.lh"
+#include "comparc.lh"
+#include "copycat.lh"
+#include "copycata.lh"
+#include "cqback.lh"
#include "dataman.lh"
-#include "ditto.lh" // clickable
+#include "ditto.lh"
#include "dxfootb.lh"
-#include "cqback.lh"
#include "ebball.lh"
#include "ebball2.lh"
#include "ebball3.lh"
@@ -257,12 +289,13 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
#include "einvader.lh"
#include "elecbowl.lh"
#include "elecdet.lh"
-#include "eleciq.lh" // clickable
+#include "eleciq.lh"
#include "esbattle.lh"
#include "esoccer.lh"
#include "f2pbball.lh"
#include "f3in1.lh"
-#include "fxmcr165.lh" // clickable
+#include "fingbowl.lh"
+#include "fxmcr165.lh"
#include "gjackpot.lh"
#include "gpoker.lh"
#include "h2hbaseb.lh"
@@ -271,16 +304,18 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
#include "h2hfootb.lh"
#include "h2hhockey.lh"
#include "horseran.lh"
+#include "lilprof.lh"
+#include "litelrn.lh"
#include "liveafb.lh"
-#include "lostreas.lh" // clickable
-#include "matchnum.lh" // clickable
+#include "lostreas.lh"
+#include "matchnum.lh"
#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 "mbdtower.lh"
+#include "mdndclab.lh"
+#include "merlin.lh"
+#include "mmarvin.lh"
+#include "mmerlin.lh"
#include "monkeysee.lh"
#include "mrmusical.lh"
#include "palmf31.lh"
@@ -288,19 +323,21 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
#include "pbmastm.lh"
#include "phpball.lh"
#include "playmaker.lh"
-#include "qfire.lh" // clickable
+#include "qfire.lh"
#include "quizwizc.lh"
#include "raisedvl.lh"
-#include "simon.lh" // clickable
+#include "scruiser.lh"
+#include "simon.lh"
#include "speechp.lh"
#include "splitsec.lh"
-#include "ssimon.lh" // clickable
+#include "ssimon.lh"
#include "ssports4.lh"
-#include "starwbc.lh" // clickable
-#include "stopthief.lh" // clickable
+#include "starwbc.lh"
+#include "starwlb.lh"
+#include "stopthief.lh"
+#include "strobe.lh"
#include "subwars.lh"
#include "t3in1sa.lh"
-#include "tandy12.lh" // clickable
#include "tbreakup.lh"
#include "tc4.lh"
#include "tc7atc.lh"
@@ -310,19 +347,71 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
#include "ti1250.lh"
#include "ti1270.lh"
#include "ti1680.lh"
-#include "ti25503.lh"
+#include "ti25502.lh"
#include "ti30.lh"
#include "ti5100.lh"
+#include "ti5200.lh"
#include "timaze.lh"
#include "tisr16.lh"
#include "tithermos.lh"
-#include "wizatron.lh"
-#include "xl25.lh" // clickable
-#include "zodiac.lh" // clickable
+#include "tmvolleyb.lh"
+#include "uboat.lh"
+#include "vclock3.lh"
+#include "xl25.lh"
+#include "zodiac.lh"
//#include "hh_tms1k_test.lh" // common test-layout - use external artwork
+namespace {
+
+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<int Sel> DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); }
+ template<int Sel> 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<tms1k_base_device> m_maincpu;
+ optional_device<pwm_display_device> m_display;
+ optional_device<speaker_sound_device> m_speaker;
+ optional_ioport_array<18> m_inputs; // max 18
+ output_finder<> m_out_power; // power state, eg. led
+
+ // misc common
+ u32 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 void auto_power_off(int state);
+ virtual void power_off();
+ virtual void set_power(bool state);
+ void switch_change(int sel, u32 mask, bool next);
+};
+
+
// machine_start/reset
void hh_tms1k_state::machine_start()
@@ -346,11 +435,11 @@ void hh_tms1k_state::machine_reset()
-/***************************************************************************
+/*******************************************************************************
Helper Functions
-***************************************************************************/
+*******************************************************************************/
// generic input handlers
@@ -360,7 +449,7 @@ u8 hh_tms1k_state::read_inputs(int columns)
// read selected input rows
for (int i = 0; i < columns; i++)
- if (m_inp_mux >> i & 1)
+ if (BIT(m_inp_mux, i))
ret |= m_inputs[i]->read();
return ret;
@@ -398,10 +487,11 @@ INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button)
INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button)
{
- set_power((bool)param);
+ if (newval != field.defvalue())
+ set_power((bool)param);
}
-WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off)
+void hh_tms1k_state::auto_power_off(int state)
{
// devices with a TMS0980 can auto power-off
if (state)
@@ -426,15 +516,13 @@ void hh_tms1k_state::set_power(bool state)
-/***************************************************************************
+/*******************************************************************************
Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
-***************************************************************************/
+*******************************************************************************/
-namespace {
-
-/***************************************************************************
+/*******************************************************************************
A-One LSI Match Number
* PCB label: PT-204 "Pair Card"
@@ -449,7 +537,7 @@ namespace {
- 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
{
@@ -501,7 +589,7 @@ u8 matchnum_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( matchnum )
PORT_START("IN.0") // R3
@@ -542,6 +630,8 @@ static INPUT_PORTS_START( matchnum )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1")
INPUT_PORTS_END
+// config
+
void matchnum_state::matchnum(machine_config &config)
{
// basic machine hardware
@@ -579,7 +669,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
A-One LSI Arrange Ball
* PCB label: Kaken, PT-249
@@ -592,7 +682,7 @@ ROM_END
- USA(2): Computer Impulse, published by LJN (white case)
- Germany: Fixball, unknown publisher, same as LJN version
-***************************************************************************/
+*******************************************************************************/
class arrball_state : public hh_tms1k_state
{
@@ -643,7 +733,7 @@ u8 arrball_state::read_k()
return read_inputs(1);
}
-// config
+// inputs
static INPUT_PORTS_START( arrball )
PORT_START("IN.0") // R8
@@ -655,6 +745,8 @@ static INPUT_PORTS_START( arrball )
PORT_CONFSETTING( 0x08, "Fast" )
INPUT_PORTS_END
+// config
+
void arrball_state::arrball(machine_config &config)
{
// basic machine hardware
@@ -693,7 +785,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
APF Mathemagician
* TMS1100 MCU, label MP1030 (no decap)
@@ -714,7 +806,7 @@ ROM_END
5) Football
6) Lunar Lander
-***************************************************************************/
+*******************************************************************************/
class mathmagi_state : public hh_tms1k_state
{
@@ -766,7 +858,7 @@ u8 mathmagi_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -794,7 +886,7 @@ static INPUT_PORTS_START( mathmagi )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
PORT_START("IN.3") // R7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL")
@@ -806,7 +898,7 @@ static INPUT_PORTS_START( mathmagi )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
PORT_START("IN.5") // R10
PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) )
@@ -815,6 +907,8 @@ static INPUT_PORTS_START( mathmagi )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
// output PLA is not decapped, this was made by hand
static const u16 mathmagi_output_pla[0x20] =
{
@@ -857,23 +951,25 @@ 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.
+ It's a programmable buggy modeled after the Lamborghini Cheetah, it's like
+ Big Trak 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)
-***************************************************************************/
+ Bandai also made an RC car version of the Cheetah with the same mould.
+
+*******************************************************************************/
class bcheetah_state : public hh_tms1k_state
{
@@ -891,18 +987,20 @@ protected:
virtual void machine_start() override;
private:
- void write_r(u32 data);
- void write_o(u16 data);
- u8 read_k();
-
output_finder<> m_motor1;
output_finder<> m_motor2_left;
output_finder<> m_motor2_right;
+
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
void bcheetah_state::machine_start()
{
hh_tms1k_state::machine_start();
+
+ // resolve handlers
m_motor1.resolve();
m_motor2_left.resolve();
m_motor2_right.resolve();
@@ -913,8 +1011,8 @@ void bcheetah_state::machine_start()
void bcheetah_state::write_r(u32 data)
{
// R0-R4: input mux
- // R5,R6: tied to K4??
m_inp_mux = data & 0x1f;
+ m_r = data;
}
void bcheetah_state::write_o(u16 data)
@@ -923,18 +1021,18 @@ void bcheetah_state::write_o(u16 data)
// 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;
+ m_motor1 = BIT(data, 1);
+ m_motor2_left = BIT(data, 0);
+ m_motor2_right = BIT(data, 2);
}
u8 bcheetah_state::read_k()
{
- // K: multiplexed inputs
- return read_inputs(5);
+ // K: multiplexed inputs, K4 is also tied to R5+R6
+ return read_inputs(5) | ((m_r & 0x60) ? 4 : 0);
}
-// config
+// inputs
static INPUT_PORTS_START( bcheetah )
PORT_START("IN.0") // R0
@@ -964,10 +1062,12 @@ static INPUT_PORTS_START( bcheetah )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
INPUT_PORTS_END
+// config
+
void bcheetah_state::bcheetah(machine_config &config)
{
// basic machine hardware
- TMS1000(config, m_maincpu, 100000); // approximation - RC osc. R=47K, C=47pF
+ TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF
m_maincpu->read_k().set(FUNC(bcheetah_state::read_k));
m_maincpu->write_r().set(FUNC(bcheetah_state::write_r));
m_maincpu->write_o().set(FUNC(bcheetah_state::write_o));
@@ -993,7 +1093,124 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Bandai Race Time
+ * PCB label: SM-007
+ * TMS1070 MP2787 (die label: 1070B, MP2787)
+ * cyan/red VFD Futaba DM-8Z, 1-bit sound
+
+ known releases:
+ - World: Race Time (model 8007), published by Bandai
+ - Japan: FL Grand Prix Champion (model 16162), published by Bandai
+
+*******************************************************************************/
+
+class racetime_state : public hh_tms1k_state
+{
+public:
+ racetime_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void racetime(machine_config &config);
+
+private:
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void racetime_state::update_display()
+{
+ m_display->matrix(m_grid, m_plate);
+}
+
+void racetime_state::write_r(u32 data)
+{
+ // R7: input mux
+ m_inp_mux = BIT(data, 7);
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
+
+ // R0-R8: VFD grid
+ // R9: VFD plate
+ m_grid = data & 0x1ff;
+ m_plate = (m_plate & 0xff) | (data >> 1 & 0x100);
+ update_display();
+}
+
+void racetime_state::write_o(u16 data)
+{
+ // O0-O7: VFD plate
+ m_plate = (m_plate & ~0xff) | data;
+ update_display();
+}
+
+u8 racetime_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(1);
+}
+
+// inputs
+
+static INPUT_PORTS_START( racetime )
+ PORT_START("IN.0") // R7
+ 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_RIGHT ) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
+INPUT_PORTS_END
+
+// config
+
+void racetime_state::racetime(machine_config &config)
+{
+ // basic machine hardware
+ TMS1070(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF
+ m_maincpu->read_k().set(FUNC(racetime_state::read_k));
+ m_maincpu->write_r().set(FUNC(racetime_state::write_r));
+ m_maincpu->write_o().set(FUNC(racetime_state::write_o));
+
+ // video hardware
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_refresh_hz(60);
+ screen.set_size(229, 1080);
+ screen.set_visarea_full();
+
+ PWM_DISPLAY(config, m_display).set_size(9, 9);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( racetime )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp2787", 0x0000, 0x0400, CRC(38c668b9) SHA1(2181647d4f2385a81355eaf99a40ad82f57ecdc6) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 406, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1070_racetime_output.pla", 0, 406, CRC(21e966b0) SHA1(ce918302d2b462df81b2d0cf2145e2351c98a0c0) )
+
+ ROM_REGION( 221716, "screen", 0)
+ ROM_LOAD( "racetime.svg", 0, 221716, CRC(d3934aed) SHA1(40b1fde191506c884b16b2ee3daaee2c6a4f4f08) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Bandai TC7: Air Traffic Control
* TMS1100 MCU, label MP1311 (die label: 1100E, MP1311)
@@ -1001,7 +1218,7 @@ ROM_END
It is a very complicated game, refer to the manual on how to play.
-***************************************************************************/
+*******************************************************************************/
class tc7atc_state : public hh_tms1k_state
{
@@ -1050,7 +1267,7 @@ u8 tc7atc_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( tc7atc )
PORT_START("IN.0") // R0
@@ -1084,6 +1301,8 @@ static INPUT_PORTS_START( tc7atc )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("80%")
INPUT_PORTS_END
+// config
+
void tc7atc_state::tc7atc(machine_config &config)
{
// basic machine hardware
@@ -1119,7 +1338,164 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Bandai U-Boat (model 16300)
+ * TMS1475 MP6358 (die label: TMS1175 /TMS1475, MP6358, 40H-PASS-0900-R300-0)
+ * cyan/red VFD NEC FIP10DM24AT no. 2-8 21 (2-sided), 1-bit sound
+ * color overlay: red/yellow/blue, and black
+
+ The VFD is 2-sided, the destroyer side views it from the back and basically
+ sees a mirror image. Each side has its own color overlay, and a black panel
+ that obscures part of the screen.
+
+*******************************************************************************/
+
+class uboat_state : public hh_tms1k_state
+{
+public:
+ uboat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void uboat(machine_config &config);
+
+private:
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void uboat_state::update_display()
+{
+ m_display->matrix(m_grid, m_plate);
+}
+
+void uboat_state::write_r(u32 data)
+{
+ // R14: speaker out
+ m_speaker->level_w(BIT(data, 14));
+
+ // R15,R19-R21: input mux
+ m_inp_mux = (data >> 15 & 1) | (data >> 18 & 0xe);
+
+ // R0-R9: VFD grid
+ // R10-R13, R16-R18: VFD plate
+ m_grid = data & 0x3ff;
+ m_plate = (m_plate & 0xff) | (data >> 2 & 0xf00) | (data >> 4 & 0x7000);
+ update_display();
+}
+
+void uboat_state::write_o(u16 data)
+{
+ // O0-O7: VFD plate
+ m_plate = (m_plate & ~0xff) | data;
+ update_display();
+}
+
+u8 uboat_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(4);
+}
+
+// inputs
+
+/* physical button layout and labels are like this:
+
+ player 1 side: player 2 side (opposite):
+
+ OFF ON OFF ON ---- SELECT ---- s
+ [---o] [---o] [ ] [ ] [ ] c
+ POWER SOUND COMvsD MANUAL COMvsS r
+ e SUBMARINE SIDE
+ [ ] e \ | /
+ FIRE DISTROYER SIDE (sic) [joystick] n [ ] [ ] [ ] [joystick]
+ [ ] ACTION --- FIRE --- ACTION
+*/
+
+static INPUT_PORTS_START( uboat )
+ PORT_START("IN.0") // R15
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire Shallow")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire Left")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
+
+ PORT_START("IN.1") // R19
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("1 Player Start (Submarine)")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
+
+ PORT_START("IN.2") // R20
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("1 Player Start (Destroyer)")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Fire Right")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
+
+ PORT_START("IN.3") // R21
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire Deep")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire Middle")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL
+INPUT_PORTS_END
+
+// config
+
+void uboat_state::uboat(machine_config &config)
+{
+ // basic machine hardware
+ TMS1475(config, m_maincpu, 425000); // approximation - RC osc. R=43K, C=47pF
+ m_maincpu->read_k().set(FUNC(uboat_state::read_k));
+ m_maincpu->write_r().set(FUNC(uboat_state::write_r));
+ m_maincpu->write_o().set(FUNC(uboat_state::write_o));
+
+ // video hardware
+ screen_device &screen1(SCREEN(config, "screen1", SCREEN_TYPE_SVG));
+ screen1.set_refresh_hz(60);
+ screen1.set_size(372, 1080);
+ screen1.set_visarea_full();
+
+ screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_SVG));
+ screen2.set_refresh_hz(60);
+ screen2.set_size(372, 1080);
+ screen2.set_visarea_full();
+
+ PWM_DISPLAY(config, m_display).set_size(10, 15);
+ config.set_default_layout(layout_uboat);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( uboat )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp6358", 0x0000, 0x1000, CRC(2e238df8) SHA1(e60f061b1f449946e1a68fb8789a381961b088ad) )
+
+ 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_uboat_output.pla", 0, 557, CRC(fdb07ac9) SHA1(beb2d8f8de39b795cb95aef2b0f02abc5e4d79dc) )
+
+ ROM_REGION( 305576, "screen1", 0) // destroyer side
+ ROM_LOAD( "uboat1.svg", 0, 305576, CRC(5d51fa01) SHA1(a42ccbc821050f5719232130f115eeb4888ed452) )
+
+ ROM_REGION( 310743, "screen2", 0) // submarine side
+ ROM_LOAD( "uboat2.svg", 0, 310743, CRC(72c44272) SHA1(a43a57b8038b00f9d63c6e5d1a43c4a45a6c6075) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B,
Triumph-Adler 81 SN, Silver-Reed 8J, more
@@ -1131,7 +1507,7 @@ ROM_END
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
{
@@ -1184,7 +1560,7 @@ u8 palmf31_state::read_k()
return data;
}
-// config
+// inputs
static INPUT_PORTS_START( palmf31 )
PORT_START("IN.0") // R0
@@ -1215,13 +1591,13 @@ static INPUT_PORTS_START( palmf31 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221a") // U+221A = √
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_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME(u8"π")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
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)
@@ -1230,14 +1606,14 @@ static INPUT_PORTS_START( palmf31 )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(u8"\u2190") // U+2190 = ←
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)
@@ -1255,6 +1631,8 @@ static INPUT_PORTS_START( palmf31 )
PORT_CONFSETTING( 0x100, DEF_STR( On ) )
INPUT_PORTS_END
+// config
+
void palmf31_state::palmf31(machine_config &config)
{
// basic machine hardware
@@ -1287,17 +1665,17 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810
* PCB label: Canon EHI-0115-03
* TMS1070 MCU label TMC1079 (die label: 1070B, 1079A)
- * 2-line cyan VFD, each 9-digit 7seg + 1 custom (label 20-ST-22)
+ * cyan VFD Futaba 20-ST-22, 2-line 9-digit 7seg + 1 custom
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
{
@@ -1348,7 +1726,7 @@ u8 palmmd8_state::read_k()
return read_inputs(11);
}
-// config
+// inputs
static INPUT_PORTS_START( palmmd8 )
PORT_START("IN.0") // R0
@@ -1365,20 +1743,20 @@ static INPUT_PORTS_START( palmmd8 )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221a") // U+221A = √
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
@@ -1423,6 +1801,8 @@ static INPUT_PORTS_START( palmmd8 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void palmmd8_state::palmmd8(machine_config &config)
{
// basic machine hardware
@@ -1447,15 +1827,15 @@ ROM_START( palmmd8 )
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_REGION( 406, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1070_palmmd8_output.pla", 0, 406, CRC(55117610) SHA1(fd06060ae5f04b802ae26697935d4a9765e1a7d7) )
ROM_END
-/***************************************************************************
+/*******************************************************************************
Chromatronics Chroma-Chime
* PCB label: DESIGNED BY CHROMATRONICS, 118-2-003
@@ -1473,7 +1853,7 @@ ROM_END
The MCU was also used in Bell-Fruit Oranges and Lemons (slot machine).
-***************************************************************************/
+*******************************************************************************/
class cchime_state : public hh_tms1k_state
{
@@ -1493,12 +1873,13 @@ private:
required_device<filter_volume_device> m_volume;
required_device<timer_device> m_tempo_timer;
- virtual void write_o(u16 data);
- virtual void write_r(u32 data);
- virtual u8 read_k();
+ double m_speaker_volume = 0.0;
+
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
- double m_speaker_volume = 0.0;
};
void cchime_state::machine_start()
@@ -1511,7 +1892,7 @@ void cchime_state::machine_start()
TIMER_DEVICE_CALLBACK_MEMBER(cchime_state::speaker_decay_sim)
{
- m_volume->flt_volume_set_volume(m_speaker_volume);
+ m_volume->set_gain(m_speaker_volume);
// volume decays when speaker is off, decay scale is determined by tone knob
const double step = (1.005 - 1.0005) / 100.0; // approximation
@@ -1541,7 +1922,7 @@ void cchime_state::write_o(u16 data)
// O2: trigger speaker on
if (~m_o & data & 4)
- m_volume->flt_volume_set_volume(m_speaker_volume = 1.0);
+ m_volume->set_gain(m_speaker_volume = 1.0);
m_o = data;
}
@@ -1565,7 +1946,7 @@ u8 cchime_state::read_k()
return inp;
}
-// config
+// inputs
static INPUT_PORTS_START( cchime )
PORT_START("IN.0") // R0-R7
@@ -1596,6 +1977,8 @@ static INPUT_PORTS_START( cchime )
PORT_ADJUSTER(50, "Tone Knob")
INPUT_PORTS_END
+// config
+
void cchime_state::cchime(machine_config &config)
{
// basic machine hardware
@@ -1632,7 +2015,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Amaze-A-Tron, by Ralph Baer
* TMS1100 MCU, label MP3405 (die label same)
@@ -1642,7 +2025,7 @@ ROM_END
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
{
@@ -1699,7 +2082,7 @@ u8 amaztron_state::read_k()
return k & 0xf;
}
-// config
+// inputs
static INPUT_PORTS_START( amaztron )
PORT_START("IN.0") // R0
@@ -1743,6 +2126,8 @@ static INPUT_PORTS_START( amaztron )
PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void amaztron_state::amaztron(machine_config &config)
{
// basic machine hardware
@@ -1778,16 +2163,16 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Coleco Zodiac - The Astrology Computer (model 2110)
+ 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
{
@@ -1839,9 +2224,9 @@ u8 zodiac_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
-/* The physical button layout and labels are like this:
+/* physical button layout and labels are like this:
[P] [A]
[ 1 ] [ 2 ] [ 3 ]
@@ -1851,45 +2236,38 @@ u8 zodiac_state::read_k()
[.__.__.__.]
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_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") // 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_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") // 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_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A")
+ 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") // 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_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("P")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("L")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("J")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("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( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear")
PORT_START("IN.5") // R8
PORT_CONFNAME( 0x03, 0x01, "Mode")
@@ -1899,6 +2277,8 @@ static INPUT_PORTS_START( zodiac )
PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void zodiac_state::zodiac(machine_config &config)
{
// basic machine hardware
@@ -1937,17 +2317,17 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Electronic Quarterback (model 2120)
- * TMS1100NLL MP3415 (die label same)
+ * TMS1100NLL MP3415 (die label: 1100B, MP3415)
* 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
{
@@ -2003,7 +2383,7 @@ u8 cqback_state::read_k()
return read_rotated_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( cqback )
PORT_START("IN.0") // K1
@@ -2028,6 +2408,8 @@ static INPUT_PORTS_START( cqback )
PORT_CONFSETTING( 0x01, DEF_STR( On ) ) // TP1-TP2
INPUT_PORTS_END
+// config
+
void cqback_state::cqback(machine_config &config)
{
// basic machine hardware
@@ -2064,10 +2446,10 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Head to Head: Electronic Football (model 2140)
- * TMS1100NLLE (rev. E!) MP3460 (die label same)
+ * TMS1100NLLE (rev. E!) MP3460 (die label: 1100E, MP3460)
* 2*SN75492N LED display drivers, 9-digit LED grid, 1-bit sound
LED electronic football game. To distinguish between offense and defense,
@@ -2077,7 +2459,7 @@ ROM_END
- 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
{
@@ -2129,7 +2511,7 @@ u8 h2hfootb_state::read_k()
return read_rotated_inputs(9);
}
-// config
+// inputs
static INPUT_PORTS_START( h2hfootb )
PORT_START("IN.0") // K1
@@ -2158,6 +2540,8 @@ static INPUT_PORTS_START( h2hfootb )
PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY
INPUT_PORTS_END
+// config
+
void h2hfootb_state::h2hfootb(machine_config &config)
{
// basic machine hardware
@@ -2194,7 +2578,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Head to Head: Electronic Basketball (model 2150)
* TMS1000NLL MP3320A (die label: 1000E, MP3320A)
@@ -2207,14 +2591,14 @@ ROM_END
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")
+ m_cap_discharge(*this, "cap_discharge")
{ }
void h2hbaskb(machine_config &config);
@@ -2224,9 +2608,7 @@ protected:
virtual void machine_start() override;
private:
- required_device<timer_device> m_cap_empty_timer;
- TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback);
- bool m_cap_state = false;
+ required_device<timer_device> m_cap_discharge;
attotime m_cap_charge = attotime::zero;
void update_display();
@@ -2240,18 +2622,11 @@ 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
@@ -2273,12 +2648,10 @@ void h2hbaskb_state::write_r(u32 data)
// 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)
+ else 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
@@ -2287,7 +2660,7 @@ void h2hbaskb_state::write_r(u32 data)
if (charge > full)
charge = full;
- m_cap_empty_timer->adjust(charge * factor);
+ m_cap_discharge->adjust(charge * factor);
}
// R0-R7: led select
@@ -2305,10 +2678,11 @@ void h2hbaskb_state::write_o(u16 data)
u8 h2hbaskb_state::read_k()
{
// K1-K4: multiplexed inputs, K8: R9 and capacitor
- return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0);
+ u8 cap_state = (m_r & 0x200 || m_cap_discharge->enabled()) ? 8 : 0;
+ return (read_inputs(4) & 7) | cap_state;
}
-// config
+// inputs
static INPUT_PORTS_START( h2hbaskb )
PORT_START("IN.0") // R0
@@ -2344,6 +2718,8 @@ static INPUT_PORTS_START( h2hhockey )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left")
INPUT_PORTS_END
+// config
+
void h2hbaskb_state::h2hbaskb(machine_config &config)
{
// basic machine hardware
@@ -2352,7 +2728,7 @@ void h2hbaskb_state::h2hbaskb(machine_config &config)
m_maincpu->write_r().set(FUNC(h2hbaskb_state::write_r));
m_maincpu->write_o().set(FUNC(h2hbaskb_state::write_o));
- TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback));
+ TIMER(config, "cap_discharge").configure_generic(nullptr);
// video hardware
PWM_DISPLAY(config, m_display).set_size(6+6, 7);
@@ -2397,7 +2773,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Head to Head: Electronic Baseball (model 2180)
* PCB labels: Coleco rev C 73891/2
@@ -2408,7 +2784,7 @@ ROM_END
- USA: Head to Head: Electronic Baseball, published by Coleco
- Japan: Computer Baseball, published by Tsukuda
-***************************************************************************/
+*******************************************************************************/
class h2hbaseb_state : public hh_tms1k_state
{
@@ -2419,32 +2795,22 @@ public:
void h2hbaseb(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
-
-protected:
- virtual void machine_reset() override;
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
private:
- void set_clock();
void update_display();
void write_r(u32 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()
+INPUT_CHANGED_MEMBER(h2hbaseb_state::skill_switch)
{
// 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);
+ m_maincpu->set_unscaled_clock((newval & 1) ? 400000 : 350000);
}
void h2hbaseb_state::update_display()
@@ -2480,7 +2846,7 @@ u8 h2hbaseb_state::read_k()
return m_inputs[4]->read() | read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( h2hbaseb )
PORT_START("IN.0") // R4
@@ -2501,20 +2867,22 @@ static INPUT_PORTS_START( h2hbaseb )
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_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_START("CPU") // 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
+// config
+
void h2hbaseb_state::h2hbaseb(machine_config &config)
{
// basic machine hardware
- TMS1170(config, m_maincpu, 350000); // see set_clock
+ TMS1170(config, m_maincpu, 350000); // see skill_switch
m_maincpu->read_k().set(FUNC(h2hbaseb_state::read_k));
m_maincpu->write_r().set(FUNC(h2hbaseb_state::write_r));
m_maincpu->write_o().set(FUNC(h2hbaseb_state::write_o));
@@ -2546,7 +2914,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Head to Head: Electronic Boxing (model 2190)
* TMS1100NLL M34018-N2 (die label: 1100E, M34018)
@@ -2554,7 +2922,7 @@ ROM_END
This appears to be the last game of Coleco's Head to Head series.
-***************************************************************************/
+*******************************************************************************/
class h2hboxing_state : public hh_tms1k_state
{
@@ -2606,7 +2974,7 @@ u8 h2hboxing_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( h2hboxing )
PORT_START("IN.0") // R0
@@ -2638,6 +3006,8 @@ static INPUT_PORTS_START( h2hboxing )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Block")
INPUT_PORTS_END
+// config
+
void h2hboxing_state::h2hboxing(machine_config &config)
{
// basic machine hardware
@@ -2673,7 +3043,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Quiz Wiz Challenger
* TMS1000NLL M32001-N2 (die label: 1000E, M32001)
@@ -2696,7 +3066,7 @@ ROM_END
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
{
@@ -2711,8 +3081,8 @@ protected:
virtual void machine_start() override;
private:
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u16 m_pinout = 0x07; // cartridge R pins
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void update_display();
void write_r(u32 data);
@@ -2733,10 +3103,7 @@ void quizwizc_state::machine_start()
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;
- }
+ return std::make_pair(image_error::UNSUPPORTED, "Can only load through software list");
// get cartridge pinout K1 to R connections
const char *pinout = image.get_feature("pinout");
@@ -2744,12 +3111,9 @@ DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load)
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 std::make_pair(image_error::BADSOFTWARE, "Invalid cartridge pinout");
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}
void quizwizc_state::update_display()
@@ -2787,7 +3151,7 @@ u8 quizwizc_state::read_k()
return read_inputs(6) | ((m_r & m_pinout) ? 1 : 0);
}
-// config
+// inputs
static INPUT_PORTS_START( quizwizc )
PORT_START("IN.0") // R0
@@ -2827,6 +3191,8 @@ static INPUT_PORTS_START( quizwizc )
PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void quizwizc_state::quizwizc(machine_config &config)
{
// basic machine hardware
@@ -2868,7 +3234,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Coleco Total Control 4
* TMS1400NLL MP7334-N2 (die label: TMS1400, MP7334, 28L 01D D000 R000)
@@ -2891,7 +3257,7 @@ ROM_END
The cartridge connects pin 8 with one of the K-pins.
-***************************************************************************/
+*******************************************************************************/
class tc4_state : public hh_tms1k_state
{
@@ -2906,8 +3272,8 @@ protected:
virtual void machine_start() override;
private:
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u8 m_pinout = 0xf; // cartridge K pins
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void update_display();
void write_r(u32 data);
@@ -2928,16 +3294,13 @@ void tc4_state::machine_start()
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;
- }
+ return std::make_pair(image_error::UNSUPPORTED, "Can only load through software list");
// 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;
+ return std::make_pair(std::error_condition(), std::string());
}
void tc4_state::update_display()
@@ -2975,7 +3338,7 @@ u8 tc4_state::read_k()
return read_inputs(6) | ((m_r & 0x200) ? m_pinout : 0);
}
-// config
+// inputs
static INPUT_PORTS_START( tc4 )
PORT_START("IN.0") // R0
@@ -3015,6 +3378,8 @@ static INPUT_PORTS_START( tc4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button")
INPUT_PORTS_END
+// config
+
void tc4_state::tc4(machine_config &config)
{
// basic machine hardware
@@ -3058,16 +3423,174 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Concept 2000 Lite 'n Learn (model 554)
+ * PCB label: CONCEPT 2000, SEC 554
+ * TMS1000NLL MP3207 (die label: 1000C, MP3207)
+ * 10 LEDs, 1-bit sound with volume decay
+
+ Two versions are known, one with the tone knob, and one without. The MCU
+ is the same for both.
+
+ Electronic Jukebox (model 552) has the exact same MCU as well, it's on a
+ much smaller PCB. It doesn't have the tone knob either. They removed the
+ LEDs and learn mode.
+
+*******************************************************************************/
+
+class litelrn_state : public hh_tms1k_state
+{
+public:
+ litelrn_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
+ m_volume(*this, "volume")
+ { }
+
+ void litelrn(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_device<filter_volume_device> m_volume;
+
+ double m_speaker_volume = 0.0;
+
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
+
+ TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
+};
+
+void litelrn_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+ save_item(NAME(m_speaker_volume));
+}
+
+// handlers
+
+TIMER_DEVICE_CALLBACK_MEMBER(litelrn_state::speaker_decay_sim)
+{
+ m_volume->set_gain(m_speaker_volume);
+
+ // volume decays when speaker is off, rate is determined by tone knob
+ const double div[3] = { 1.002, 1.004, 1.008 }; // approximation
+ m_speaker_volume /= div[m_inputs[2]->read() % 3];
+}
+
+void litelrn_state::write_r(u32 data)
+{
+ // R0: speaker out
+ m_speaker->level_w(data & 1);
+
+ // R1-R10: input mux, leds
+ m_inp_mux = data >> 1;
+ m_display->matrix(1, data >> 1);
+}
+
+void litelrn_state::write_o(u16 data)
+{
+ // O0: trigger speaker on
+ if (~data & m_o & 1)
+ m_volume->set_gain(m_speaker_volume = 1.0);
+
+ // O2: select mode switch
+ // other: N/C
+ m_o = data;
+}
+
+u8 litelrn_state::read_k()
+{
+ // K1: multiplexed inputs
+ u8 data = read_rotated_inputs(10, 1);
+
+ // K4,K8: mode switch
+ if (m_o & 4)
+ data |= m_inputs[1]->read() & 0xc;
+
+ return data;
+}
+
+// inputs
+
+static INPUT_PORTS_START( litelrn )
+ PORT_START("IN.0") // K1
+ PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10")
+
+ PORT_START("IN.1") // O2
+ PORT_CONFNAME( 0x0c, 0x00, "Mode" )
+ PORT_CONFSETTING( 0x00, "Learn" )
+ PORT_CONFSETTING( 0x0c, "Auto" )
+ PORT_CONFSETTING( 0x04, "Manual" )
+
+ PORT_START("IN.2")
+ PORT_CONFNAME( 0x03, 0x00, "Tone" )
+ PORT_CONFSETTING( 0x00, "Organ" )
+ PORT_CONFSETTING( 0x01, "Harpsichord" )
+ PORT_CONFSETTING( 0x02, "Banjo" )
+INPUT_PORTS_END
+
+// config
+
+void litelrn_state::litelrn(machine_config &config)
+{
+ // basic machine hardware
+ TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=33K, C=100pF
+ m_maincpu->read_k().set(FUNC(litelrn_state::read_k));
+ m_maincpu->write_o().set(FUNC(litelrn_state::write_o));
+ m_maincpu->write_r().set(FUNC(litelrn_state::write_r));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(1, 10);
+ m_display->set_bri_levels(0.25);
+ config.set_default_layout(layout_litelrn);
+
+ // 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(litelrn_state::speaker_decay_sim), attotime::from_msec(1));
+}
+
+// roms
+
+ROM_START( litelrn )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3207", 0x0000, 0x0400, CRC(9fd7bc0b) SHA1(0dd2903bb33833e85103a1d012fda449d92722af) )
+
+ 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_litelrn_output.pla", 0, 365, CRC(393d859e) SHA1(2d224a8dee621ee598001ebdac3e57cae52c93e1) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Concept 2000 Mr. Mus-I-Cal (model 560)
- * PCB label: CONCEPT 2000 ITE 556
+ * PCB label: CONCEPT 2000, ITE 556
* TMS1000NLL MP3206 (die label: 1000C, MP3206)
* 9-digit 7seg LED display(one custom digit), 1-bit sound
It's a simple 4-function calculator, and plays music tones too.
-***************************************************************************/
+*******************************************************************************/
class mrmusical_state : public hh_tms1k_state
{
@@ -3078,11 +3601,11 @@ public:
void mrmusical(machine_config &config);
-protected:
+private:
void update_display();
- virtual void write_o(u16 data);
- virtual void write_r(u32 data);
- virtual u8 read_k();
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
};
// handlers
@@ -3116,20 +3639,20 @@ u8 mrmusical_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( mrmusical )
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_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("A=")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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")
@@ -3160,10 +3683,12 @@ static INPUT_PORTS_START( mrmusical )
PORT_CONFSETTING( 0x01, DEF_STR( On ) )
INPUT_PORTS_END
+// config
+
void mrmusical_state::mrmusical(machine_config &config)
{
// basic machine hardware
- TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=33K, C=100pF
+ TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=33K, C=100pF
m_maincpu->read_k().set(FUNC(mrmusical_state::read_k));
m_maincpu->write_o().set(FUNC(mrmusical_state::write_o));
m_maincpu->write_r().set(FUNC(mrmusical_state::write_r));
@@ -3196,7 +3721,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Conic Electronic Basketball
* PCB label: CONIC 101-006
@@ -3210,7 +3735,7 @@ ROM_END
- Hong Kong: Electronic Basketball, published by Conic
- USA: Electronic Basketball, published by Cardinal
-***************************************************************************/
+*******************************************************************************/
class cnbaskb_state : public hh_tms1k_state
{
@@ -3264,7 +3789,7 @@ u8 cnbaskb_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( cnbaskb )
PORT_START("IN.0") // R0
@@ -3285,6 +3810,8 @@ static INPUT_PORTS_START( cnbaskb )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void cnbaskb_state::cnbaskb(machine_config &config)
{
// basic machine hardware
@@ -3321,11 +3848,11 @@ 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)
+ * TMS1000 MP0168 (die label: 1000B, MP0168)
* 2 7seg LEDs, 33 other LEDs, 1-bit sound
This handheld includes 3 games: Basketball, Ice Hockey, Soccer.
@@ -3337,7 +3864,7 @@ ROM_END
- USA(1): Electronic Multisport, published by Innocron
- USA(2): Sports Arena, published by Tandy (model 60-2158)
-***************************************************************************/
+*******************************************************************************/
class cmsport_state : public hh_tms1k_state
{
@@ -3389,7 +3916,7 @@ u8 cmsport_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( cmsport )
PORT_START("IN.0") // R0
@@ -3414,6 +3941,8 @@ static INPUT_PORTS_START( cmsport )
PORT_CONFSETTING( 0x08, "2" ) // professional
INPUT_PORTS_END
+// config
+
void cmsport_state::cmsport(machine_config &config)
{
// basic machine hardware
@@ -3450,10 +3979,10 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Conic Electronic Football
- * TMS1000 MP0170 (die label same)
+ * TMS1000 MP0170 (die label: 1000B, MP0170)
* DS8874N, 3*9 LED array, 7 7seg LEDs, 1-bit sound
This is a clone of Mattel Football. Apparently Mattel tried to keep imports
@@ -3468,7 +3997,7 @@ ROM_END
Another hardware revision of this game uses a PIC16 MCU.
-***************************************************************************/
+*******************************************************************************/
class cnfball_state : public hh_tms1k_state
{
@@ -3482,6 +4011,7 @@ public:
private:
required_device<ds8874_device> m_ds8874;
+
void ds8874_output_w(u16 data);
void update_display();
@@ -3535,7 +4065,7 @@ u8 cnfball_state::read_k()
return read_inputs(2) | (m_r << 3 & 8);
}
-// config
+// inputs
static INPUT_PORTS_START( cnfball )
PORT_START("IN.0") // R9
@@ -3553,6 +4083,8 @@ static INPUT_PORTS_START( cnfball )
PORT_CONFSETTING( 0x00, "2" ) // professional
INPUT_PORTS_END
+// config
+
void cnfball_state::cnfball(machine_config &config)
{
// basic machine hardware
@@ -3593,7 +4125,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Conic Electronic Football II
* TMS1100 MP1181 (no decap)
@@ -3605,9 +4137,9 @@ ROM_END
known releases:
- Hong Kong: Electronic Football II, published by Conic
- - USA: Electronic Football II, published by Tandy
+ - USA: Electronic Football II (model 60-2169), published by Tandy
-***************************************************************************/
+*******************************************************************************/
class cnfball2_state : public hh_tms1k_state
{
@@ -3663,7 +4195,7 @@ u8 cnfball2_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( cnfball2 )
PORT_START("IN.0") // R8
@@ -3689,6 +4221,8 @@ static INPUT_PORTS_START( cnfball2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void cnfball2_state::cnfball2(machine_config &config)
{
// basic machine hardware
@@ -3727,11 +4261,11 @@ 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
+ * 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
@@ -3741,7 +4275,7 @@ ROM_END
- Hong Kong: Electronic I.Q., published by Conic
- UK: Solitaire, published by Grandstand
-***************************************************************************/
+*******************************************************************************/
class eleciq_state : public hh_tms1k_state
{
@@ -3794,7 +4328,7 @@ u8 eleciq_state::read_k()
return read_inputs(7);
}
-// config
+// inputs
static INPUT_PORTS_START( eleciq )
PORT_START("IN.0") // R1
@@ -3840,6 +4374,8 @@ static INPUT_PORTS_START( eleciq )
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
+// config
+
void eleciq_state::eleciq(machine_config &config)
{
// basic machine hardware
@@ -3875,17 +4411,18 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Electroplay Quickfire
- * TMS1000NLL MP3260 (die label same)
- * 2 7seg LEDs, 5 lamps, 3 lightsensors, lightgun
+ * TMS1000NLL MP3260 (die label: 1000C, MP3260)
+ * 2 7seg LEDs, 5 lamps, 1-bit sound
+ * 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
{
@@ -3913,7 +4450,7 @@ void qfire_state::write_r(u32 data)
m_display->write_row(2, (data >> 3 & 3) | (data >> 4 & 0x1c));
// R9: speaker out
- m_speaker->level_w(data >> 9 & 1);
+ m_speaker->level_w(BIT(data, 9));
}
void qfire_state::write_o(u16 data)
@@ -3930,7 +4467,7 @@ u8 qfire_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( qfire )
PORT_START("IN.0") // R1
@@ -3956,6 +4493,8 @@ static INPUT_PORTS_START( qfire )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // lightgun trigger, also turns on lightgun lamp
INPUT_PORTS_END
+// config
+
void qfire_state::qfire(machine_config &config)
{
// basic machine hardware
@@ -3991,7 +4530,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex (Electronic) Soccer
* TMS1000NL MP0158 (die label: 1000B, MP0158)
@@ -4001,7 +4540,7 @@ ROM_END
- 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
{
@@ -4053,7 +4592,7 @@ u8 esoccer_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( esoccer )
PORT_START("IN.0") // R0
@@ -4076,6 +4615,8 @@ static INPUT_PORTS_START( esoccer )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
INPUT_PORTS_END
+// config
+
void esoccer_state::esoccer(machine_config &config)
{
// basic machine hardware
@@ -4112,7 +4653,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex (Electronic) Baseball (1)
* TMS1000NLP MP0914 (die label: 1000B, MP0914A)
@@ -4141,7 +4682,7 @@ ROM_END
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
{
@@ -4194,7 +4735,7 @@ u8 ebball_state::read_k()
return m_inputs[5]->read() | read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( ebball )
PORT_START("IN.0") // R1
@@ -4221,11 +4762,13 @@ static INPUT_PORTS_START( ebball )
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_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
+// config
+
void ebball_state::ebball(machine_config &config)
{
// basic machine hardware
@@ -4261,7 +4804,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex (Electronic) Baseball 2
* PCB label: ZENY
@@ -4286,7 +4829,7 @@ ROM_END
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
{
@@ -4338,7 +4881,7 @@ u8 ebball2_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( ebball2 )
PORT_START("IN.0") // R3
@@ -4364,6 +4907,8 @@ static INPUT_PORTS_START( ebball2 )
PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void ebball2_state::ebball2(machine_config &config)
{
// basic machine hardware
@@ -4399,7 +4944,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex (Electronic) Baseball 3
* PCB label: ZENY
@@ -4429,7 +4974,7 @@ ROM_END
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
{
@@ -4440,33 +4985,23 @@ public:
void ebball3(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
-
-protected:
- virtual void machine_reset() override;
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
private:
- void set_clock();
void update_display();
void write_r(u32 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()
+INPUT_CHANGED_MEMBER(ebball3_state::skill_switch)
{
// 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);
+ m_maincpu->set_unscaled_clock((newval & 1) ? 440000 : 340000);
}
void ebball3_state::update_display()
@@ -4507,7 +5042,7 @@ u8 ebball3_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -4542,16 +5077,18 @@ static INPUT_PORTS_START( ebball3 )
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_START("CPU") // 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
+// config
+
void ebball3_state::ebball3(machine_config &config)
{
// basic machine hardware
- TMS1100(config, m_maincpu, 340000); // see set_clock
+ TMS1100(config, m_maincpu, 340000); // see skill_switch
m_maincpu->read_k().set(FUNC(ebball3_state::read_k));
m_maincpu->write_r().set(FUNC(ebball3_state::write_r));
m_maincpu->write_o().set(FUNC(ebball3_state::write_o));
@@ -4584,7 +5121,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex Space Battle
* TMS1000 EN-6004 MP0920 (die label: 1000B, MP0920)
@@ -4605,7 +5142,7 @@ ROM_END
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
{
@@ -4657,7 +5194,7 @@ u8 esbattle_state::read_k()
return read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( esbattle )
PORT_START("IN.0") // R0
@@ -4675,6 +5212,8 @@ static INPUT_PORTS_START( esbattle )
PORT_CONFSETTING( 0x00, "2" ) // Manual
INPUT_PORTS_END
+// config
+
void esbattle_state::esbattle(machine_config &config)
{
// basic machine hardware
@@ -4710,13 +5249,13 @@ 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
{
@@ -4768,7 +5307,7 @@ u8 blastit_state::read_k()
return read_inputs(1);
}
-// config
+// inputs
static INPUT_PORTS_START( blastit )
PORT_START("IN.0") // R3
@@ -4780,6 +5319,8 @@ static INPUT_PORTS_START( blastit )
PORT_CONFSETTING( 0x00, "2" ) // PRO
INPUT_PORTS_END
+// config
+
void blastit_state::blastit(machine_config &config)
{
// basic machine hardware
@@ -4816,7 +5357,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex Space Invader
* TMS1100 MP1211 (die label same)
@@ -4826,7 +5367,7 @@ ROM_END
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
{
@@ -4835,33 +5376,23 @@ public:
hh_tms1k_state(mconfig, type, tag)
{ }
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
void einvader(machine_config &config);
-protected:
- virtual void machine_reset() override;
-
private:
- void set_clock();
void update_display();
void write_r(u32 data);
void write_o(u16 data);
};
-void einvader_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
// handlers
-void einvader_state::set_clock()
+INPUT_CHANGED_MEMBER(einvader_state::skill_switch)
{
// 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);
+ m_maincpu->set_unscaled_clock((newval & 1) ? 400000 : 320000);
}
void einvader_state::update_display()
@@ -4887,7 +5418,7 @@ void einvader_state::write_o(u16 data)
update_display();
}
-// config
+// inputs
static INPUT_PORTS_START( einvader )
PORT_START("IN.0")
@@ -4899,10 +5430,12 @@ static INPUT_PORTS_START( einvader )
PORT_CONFSETTING( 0x08, "2" ) // professional
INPUT_PORTS_END
+// config
+
void einvader_state::einvader(machine_config &config)
{
// basic machine hardware
- TMS1100(config, m_maincpu, 320000); // see set_clock
+ TMS1100(config, m_maincpu, 320000); // see skill_switch
m_maincpu->read_k().set_ioport("IN.0");
m_maincpu->write_r().set(FUNC(einvader_state::write_r));
m_maincpu->write_o().set(FUNC(einvader_state::write_o));
@@ -4943,7 +5476,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex Color Football 4
* TMS1670 6009 MP7551 (die label: TMS1400, MP7551, 40H 01D D000 R000)
@@ -4951,7 +5484,7 @@ ROM_END
Another version exist, one with a LED(red) 7seg display.
-***************************************************************************/
+*******************************************************************************/
class efootb4_state : public hh_tms1k_state
{
@@ -5002,7 +5535,7 @@ u8 efootb4_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( efootb4 )
PORT_START("IN.0") // R0
@@ -5040,6 +5573,8 @@ static INPUT_PORTS_START( efootb4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void efootb4_state::efootb4(machine_config &config)
{
// basic machine hardware
@@ -5083,7 +5618,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex (Electronic) Basketball 2
* TMS1100 6010 MP1218 (die label: 1100B, MP1218)
@@ -5101,7 +5636,7 @@ ROM_END
A = 9.4
B = 6.4
-***************************************************************************/
+*******************************************************************************/
class ebaskb2_state : public hh_tms1k_state
{
@@ -5153,7 +5688,7 @@ u8 ebaskb2_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( ebaskb2 )
PORT_START("IN.0") // R6
@@ -5184,6 +5719,8 @@ static INPUT_PORTS_START( ebaskb2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY
INPUT_PORTS_END
+// config
+
void ebaskb2_state::ebaskb2(machine_config &config)
{
// basic machine hardware
@@ -5220,7 +5757,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex Raise The Devil
* TMS1100 MP1221 (die label: 1100B, MP1221)
@@ -5246,7 +5783,7 @@ ROM_END
NOTE!: MAME external artwork is required
-***************************************************************************/
+*******************************************************************************/
class raisedvl_state : public hh_tms1k_state
{
@@ -5258,36 +5795,26 @@ public:
void raisedvl(machine_config &config);
void ebknight(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
-
-protected:
- virtual void machine_reset() override;
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
private:
- void set_clock();
void update_display();
void write_r(u32 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()
+INPUT_CHANGED_MEMBER(raisedvl_state::skill_switch)
{
// 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));
+ static const u32 freq[3] = { 350000, 425000, 465000 };
+ m_maincpu->set_unscaled_clock(freq[(newval >> 4) % 3]);
}
void raisedvl_state::update_display()
@@ -5323,7 +5850,7 @@ u8 raisedvl_state::read_k()
return read_inputs(2) & 0xf;
}
-// config
+// inputs
static INPUT_PORTS_START( raisedvl )
PORT_START("IN.0") // R0
@@ -5340,10 +5867,12 @@ static INPUT_PORTS_START( raisedvl )
PORT_CONFSETTING( 0x21, "4" )
INPUT_PORTS_END
+// config
+
void raisedvl_state::raisedvl(machine_config &config)
{
// basic machine hardware
- TMS1100(config, m_maincpu, 350000); // see set_clock
+ TMS1100(config, m_maincpu, 350000); // see skill_switch
m_maincpu->read_k().set(FUNC(raisedvl_state::read_k));
m_maincpu->write_r().set(FUNC(raisedvl_state::write_r));
m_maincpu->write_o().set(FUNC(raisedvl_state::write_o));
@@ -5391,7 +5920,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Entex Musical Marvin
* TMS1100 MP1228 (no decap)
@@ -5401,7 +5930,7 @@ ROM_END
The design patent was assigned to Hanzawa (Japan), so it's probably
manufactured by them.
-***************************************************************************/
+*******************************************************************************/
class mmarvin_state : public hh_tms1k_state
{
@@ -5421,13 +5950,14 @@ private:
required_device<filter_volume_device> m_volume;
required_device<timer_device> m_speed_timer;
+ double m_speaker_volume = 0.0;
+
void update_display();
void write_r(u32 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()
@@ -5440,7 +5970,7 @@ void mmarvin_state::machine_start()
TIMER_DEVICE_CALLBACK_MEMBER(mmarvin_state::speaker_decay_sim)
{
- m_volume->flt_volume_set_volume(m_speaker_volume);
+ m_volume->set_gain(m_speaker_volume);
// volume decays when speaker is off, decay scale is determined by tone knob
const double step = (1.01 - 1.003) / 100.0; // approximation
@@ -5470,7 +6000,7 @@ void mmarvin_state::write_r(u32 data)
// R9: trigger speaker on
if (m_r & ~data & 0x200)
- m_volume->flt_volume_set_volume(m_speaker_volume = 1.0);
+ m_volume->set_gain(m_speaker_volume = 1.0);
// R0,R1: digit/led select
// R7: digit DP
@@ -5492,7 +6022,7 @@ u8 mmarvin_state::read_k()
return (read_inputs(4) & 7) | (m_speed_timer->enabled() ? 0 : 8);
}
-// config
+// inputs
static INPUT_PORTS_START( mmarvin )
PORT_START("IN.0") // R2
@@ -5522,6 +6052,8 @@ static INPUT_PORTS_START( mmarvin )
PORT_ADJUSTER(50, "Tone Knob")
INPUT_PORTS_END
+// config
+
void mmarvin_state::mmarvin(machine_config &config)
{
// basic machine hardware
@@ -5564,7 +6096,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Fonas 2 Player Baseball
* PCB label: CA-014 (probably Cassia)
@@ -5576,6 +6108,9 @@ ROM_END
- USA: 2 Player Baseball, published by Sears
- Canada: 2 Player Baseball, published by Talbot Electronics
+ Calfax / Caprice Pro-Action Strategy Baseball is also suspected to be the
+ same game, even though it looks a bit different.
+
led translation table: led zz from game PCB = MAME y.x:
0 = - 10 = 2.2 20 = 4.0 30 = 4.4
@@ -5589,7 +6124,7 @@ ROM_END
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
{
@@ -5641,7 +6176,7 @@ u8 f2pbball_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( f2pbball )
PORT_START("IN.0") // R4
@@ -5668,6 +6203,8 @@ static INPUT_PORTS_START( f2pbball )
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
+// config
+
void f2pbball_state::f2pbball(machine_config &config)
{
// basic machine hardware
@@ -5703,7 +6240,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Fonas 3 in 1: Football, Basketball, Soccer
* PCB label: HP-801
@@ -5712,9 +6249,13 @@ ROM_END
It's not known if this game has an official title. The current one is
taken from the handheld front side.
+
+ Calfax / Caprice separate Football / Basketball / Soccer handhelds are
+ suspected to be the same ROM.
+
MAME external artwork is needed for the switchable overlays.
-***************************************************************************/
+*******************************************************************************/
class f3in1_state : public hh_tms1k_state
{
@@ -5725,31 +6266,21 @@ public:
void f3in1(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
-
-protected:
- virtual void machine_reset() override;
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
private:
- void set_clock();
void update_display();
void write_r(u32 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()
+INPUT_CHANGED_MEMBER(f3in1_state::skill_switch)
{
// 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);
+ m_maincpu->set_unscaled_clock((newval & 1) ? 400000 : 300000);
}
void f3in1_state::update_display()
@@ -5784,7 +6315,7 @@ u8 f3in1_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( f3in1 )
PORT_START("IN.0") // R0
@@ -5810,16 +6341,18 @@ static INPUT_PORTS_START( f3in1 )
PORT_CONFSETTING( 0x04, "Basketball" )
PORT_CONFSETTING( 0x08, "Soccer" )
- PORT_START("IN.4") // fake
+ PORT_START("CPU") // 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
+// config
+
void f3in1_state::f3in1(machine_config &config)
{
// basic machine hardware
- TMS1100(config, m_maincpu, 300000); // see set_clock
+ TMS1100(config, m_maincpu, 300000); // see skill_switch
m_maincpu->read_k().set(FUNC(f3in1_state::read_k));
m_maincpu->write_r().set(FUNC(f3in1_state::write_r));
m_maincpu->write_o().set(FUNC(f3in1_state::write_o));
@@ -5852,7 +6385,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken Poker
* PCB label: POKER. gakken
@@ -5863,7 +6396,7 @@ ROM_END
- Japan: Poker, published by Gakken
- USA: Electronic Poker, published by Entex
-***************************************************************************/
+*******************************************************************************/
class gpoker_state : public hh_tms1k_state
{
@@ -5919,7 +6452,7 @@ u8 gpoker_state::read_k()
return read_inputs(7);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -5972,6 +6505,8 @@ static INPUT_PORTS_START( gpoker )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL
INPUT_PORTS_END
+// config
+
void gpoker_state::gpoker(machine_config &config)
{
// basic machine hardware
@@ -6007,7 +6542,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken Jackpot: Gin Rummy & Black Jack
* PCB label: gakken
@@ -6018,7 +6553,7 @@ ROM_END
- Japan: Jackpot(?), published by Gakken
- USA: Electronic Jackpot: Gin Rummy & Black Jack, published by Entex
-***************************************************************************/
+*******************************************************************************/
class gjackpot_state : public gpoker_state
{
@@ -6042,7 +6577,7 @@ void gjackpot_state::write_r(u32 data)
m_inp_mux = (data & 0x3f) | (data >> 4 & 0x40);
}
-// config
+// inputs
/* physical button layout and labels are like this:
(note: on dual-function buttons, upper label=Gin, lower label=Black Jack)
@@ -6101,6 +6636,8 @@ static INPUT_PORTS_START( gjackpot )
PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void gjackpot_state::gjackpot(machine_config &config)
{
gpoker(config);
@@ -6130,7 +6667,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken Invader
* PCB label: GAKKEN, INVADER, KS-00779
@@ -6146,7 +6683,7 @@ ROM_END
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
{
@@ -6159,9 +6696,9 @@ public:
private:
void update_display();
- virtual void write_r(u32 data);
- virtual void write_o(u16 data);
- virtual u8 read_k();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
// handlers
@@ -6199,7 +6736,7 @@ u8 ginv_state::read_k()
return m_inputs[2]->read() | read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( ginv )
PORT_START("IN.0") // R9
@@ -6219,6 +6756,8 @@ static INPUT_PORTS_START( ginv )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
INPUT_PORTS_END
+// config
+
void ginv_state::ginv(machine_config &config)
{
// basic machine hardware
@@ -6260,7 +6799,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken Invader 1000
* TMS1370 MP2139 (die label: 1170, MP2139)
@@ -6272,7 +6811,7 @@ ROM_END
- USA(1): Galaxy Invader 1000, published by CGL
- USA(2): Cosmic 1000 Fire Away, published by Tandy
-***************************************************************************/
+*******************************************************************************/
class ginv1000_state : public hh_tms1k_state
{
@@ -6285,9 +6824,9 @@ public:
private:
void update_display();
- virtual void write_r(u32 data);
- virtual void write_o(u16 data);
- virtual u8 read_k();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
// handlers
@@ -6325,7 +6864,7 @@ u8 ginv1000_state::read_k()
return m_inputs[2]->read() | read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( ginv1000 )
PORT_START("IN.0") // R8
@@ -6344,6 +6883,8 @@ static INPUT_PORTS_START( ginv1000 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
INPUT_PORTS_END
+// config
+
void ginv1000_state::ginv1000(machine_config &config)
{
// basic machine hardware
@@ -6385,7 +6926,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken Invader 2000
* TMS1370(28 pins) MP1604 (die label: 1370A, MP1604)
@@ -6397,7 +6938,7 @@ ROM_END
- USA(1): Galaxy Invader 10000, published by CGL
- USA(2): Cosmic 3000 Fire Away, published by Tandy
-***************************************************************************/
+*******************************************************************************/
class ginv2000_state : public hh_tms1k_state
{
@@ -6411,12 +6952,13 @@ public:
private:
required_device<tms1024_device> m_expander;
+
void expander_w(offs_t offset, u8 data);
void update_display();
- virtual void write_r(u32 data);
- virtual void write_o(u16 data);
- virtual u8 read_k();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
// handlers
@@ -6464,7 +7006,7 @@ u8 ginv2000_state::read_k()
return m_inputs[2]->read() | read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( ginv2000 )
PORT_START("IN.0") // R11
@@ -6482,6 +7024,8 @@ static INPUT_PORTS_START( ginv2000 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
INPUT_PORTS_END
+// config
+
void ginv2000_state::ginv2000(machine_config &config)
{
// basic machine hardware
@@ -6529,14 +7073,14 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Gakken FX-Micom R-165
* TMS1100 MCU, label MP1312 (die label: 1100E, 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),
+ 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.
@@ -6545,7 +7089,7 @@ ROM_END
- 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
{
@@ -6603,7 +7147,7 @@ u8 fxmcr165_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -6645,6 +7189,8 @@ static INPUT_PORTS_START( fxmcr165 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Address Set")
INPUT_PORTS_END
+// config
+
void fxmcr165_state::fxmcr165(machine_config &config)
{
// basic machine hardware
@@ -6680,11 +7226,11 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Ideal Electronic Detective
* TMS0980NLL MP6100A (die label: 0980B-00)
- * 10-digit 7seg LED display, 2-level sound
+ * 9-digit 7seg LED display (2 unused), 2-level sound
hardware (and concept) is very similar to Parker Brothers Stop Thief
@@ -6693,7 +7239,7 @@ ROM_END
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
{
@@ -6737,7 +7283,7 @@ u8 elecdet_state::read_k()
return m_inputs[4]->read() | read_inputs(4);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -6778,7 +7324,7 @@ static INPUT_PORTS_START( elecdet )
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_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 )
@@ -6786,10 +7332,12 @@ static INPUT_PORTS_START( elecdet )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
+// config
+
void elecdet_state::elecdet(machine_config &config)
{
// basic machine hardware
- TMS0980(config, m_maincpu, 425000); // approximation
+ TMS0980(config, m_maincpu, 450000); // approximation
m_maincpu->read_k().set(FUNC(elecdet_state::read_k));
m_maincpu->write_r().set(FUNC(elecdet_state::write_r));
m_maincpu->write_o().set(FUNC(elecdet_state::write_o));
@@ -6828,9 +7376,365 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Ideal Sky-Writer (model 6070-7)
+ * PCB label: ITC 5A-3917-02, 201101
+ * TMS1100 M34004A (die label: 1100E, M34004A)
+ * 7 LEDs, no sound
+
+ It's a toy wand that the user waves around to display a message in the air,
+ relying on human persistence of vision. A keyboard is included, making the
+ whole thing quite tiring to wave around for a kid.
+
+ The display is simulated in MAME with a screen and slowly fading pixels.
+
+*******************************************************************************/
+
+static constexpr u32 SKYWRITER_WIDTH = 0x300; // screen width (wave range)
+
+class skywriter_state : public hh_tms1k_state
+{
+public:
+ skywriter_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void skywriter(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ std::unique_ptr<u16[]> m_pixbuf;
+ u8 m_led_data[2] = { };
+ u16 m_wand_pos[2] = { };
+ attotime m_shake;
+
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ TIMER_DEVICE_CALLBACK_MEMBER(check_pos);
+};
+
+void skywriter_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ m_pixbuf = make_unique_clear<u16[]>(7 * SKYWRITER_WIDTH);
+ save_pointer(NAME(m_pixbuf), 7 * SKYWRITER_WIDTH);
+
+ save_item(NAME(m_led_data));
+ save_item(NAME(m_wand_pos));
+ save_item(NAME(m_shake));
+}
+
+// handlers
+
+u32 skywriter_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ for (int i = 0; i < 7 * SKYWRITER_WIDTH; i++)
+ {
+ int dx = i % SKYWRITER_WIDTH;
+ int dy = (i / SKYWRITER_WIDTH) * 4 + 1;
+
+ // write current led state to pixels
+ u8 red = std::clamp<u16>(m_pixbuf[i], 0, 0xff);
+ u8 green = red / 16;
+ u8 blue = red / 12;
+
+ for (int j = 0; j < 3; j++)
+ {
+ if (cliprect.contains(dx, dy + j))
+ bitmap.pix(dy + j, dx) = red << 16 | green << 8 | blue;
+ }
+
+ // decay led brightness
+ const double rate = 1.15;
+ m_pixbuf[i] /= rate;
+ }
+
+ return 0;
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(skywriter_state::check_pos)
+{
+ u16 pos = m_inputs[11]->read() % SKYWRITER_WIDTH;
+
+ if (pos != m_wand_pos[0])
+ {
+ // set shake sensor if wand changed direction from left to right
+ if (pos > m_wand_pos[0] && m_wand_pos[0] < m_wand_pos[1])
+ m_shake = machine().time() + attotime::from_msec(10);
+
+ m_wand_pos[1] = m_wand_pos[0];
+ m_wand_pos[0] = pos;
+ }
+
+ // write lit leds to pixel buffer
+ for (int i = 0; i < 7; i++)
+ {
+ if (BIT(m_led_data[0] | m_led_data[1], i))
+ m_pixbuf[i * SKYWRITER_WIDTH + pos] = 0x180;
+ }
+
+ m_led_data[1] = m_led_data[0];
+}
+
+void skywriter_state::write_r(u32 data)
+{
+ // R0-R10: input mux
+ m_inp_mux = data;
+}
+
+void skywriter_state::write_o(u16 data)
+{
+ // O0-O3, O5-O7: leds
+ m_led_data[0] = bitswap<7>(data,1,5,6,7,3,2,0);
+
+ // O4: enable shake sensor
+ m_o = data;
+}
+
+u8 skywriter_state::read_k()
+{
+ // K: multiplexed inputs + shake sensor
+ u8 shake = (m_o & 0x10 && m_shake > machine().time()) ? 4 : 0;
+ return read_inputs(11) | shake;
+}
+
+// inputs
+
+static INPUT_PORTS_START( skywriter )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CHAR(127) PORT_NAME("CL")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Start")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // factory test?
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("BS")
+
+ PORT_START("IN.1") // R1
+ 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_T) PORT_CHAR('T')
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'')
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("SP")
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9')
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.')
+ 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_I) PORT_CHAR('I')
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H')
+ 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_SLASH) PORT_CHAR('?')
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8')
+
+ PORT_START("IN.4") // R4
+ 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_MINUS) PORT_CHAR('-')
+ 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_G) PORT_CHAR('G')
+
+ PORT_START("IN.5") // R5
+ 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_P) PORT_CHAR('P')
+ 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_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6')
+
+ PORT_START("IN.6") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5')
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
+ 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_E) PORT_CHAR('E')
+
+ PORT_START("IN.7") // R7
+ 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_N) PORT_CHAR('N')
+ 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_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4')
+
+ PORT_START("IN.8") // R8
+ 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_W) PORT_CHAR('W')
+ 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_C) PORT_CHAR('C')
+
+ PORT_START("IN.9") // R9
+ 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_L) PORT_CHAR('L')
+ 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_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2')
+
+ PORT_START("IN.10") // R10
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1')
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
+ 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_A) PORT_CHAR('A')
+
+ PORT_START("IN.11") // fake
+ PORT_BIT( 0xfff, SKYWRITER_WIDTH / 2, IPT_PADDLE ) PORT_MINMAX(0, SKYWRITER_WIDTH - 1) PORT_SENSITIVITY(25) PORT_KEYDELTA(300) PORT_CENTERDELTA(0) PORT_NAME("Wave Wand")
+INPUT_PORTS_END
+
+// config
+
+void skywriter_state::skywriter(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 475000); // approximation - RC osc. R=27K, C=100pF
+ m_maincpu->read_k().set(FUNC(skywriter_state::read_k));
+ m_maincpu->write_r().set(FUNC(skywriter_state::write_r));
+ m_maincpu->write_o().set(FUNC(skywriter_state::write_o));
+
+ TIMER(config, "check_pos").configure_periodic(FUNC(skywriter_state::check_pos), attotime::from_usec(1));
+
+ // video hardware
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE); // for led decay
+ screen.set_physical_aspect(16, 1);
+ screen.set_refresh_hz(60);
+ screen.set_size(SKYWRITER_WIDTH, 4 * 7 + 1);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(skywriter_state::screen_update));
+
+ // no sound!
+}
+
+// roms
+
+ROM_START( skywriter )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "m34004a.ic1", 0x0000, 0x0800, CRC(8e218dcc) SHA1(d3d5e0fa02c947d49d5bba1297edb7cecc0356da) )
+
+ 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_skywriter_output.pla", 0, 365, CRC(407cb3b5) SHA1(f5830d25ec0ff8682993a2d03001606f1f30b46f) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
+
+ Kenner Star Wars: Electronic Laser Battle Game (model 40090)
+ * TMS1000NLL MP3209 (die label: 1000C, MP3209)
+ * 12 LEDs, 1 lamp, 1-bit sound
+
+ known releases:
+ - USA: Star Wars: Electronic Laser Battle Game, published by Kenner
+ - France: La Guerre des Etoiles: Bataille Spatiale Électronique, published by Meccano
+
+*******************************************************************************/
+
+class starwlb_state : public hh_tms1k_state
+{
+public:
+ starwlb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void starwlb(machine_config &config);
+
+private:
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void starwlb_state::update_display()
+{
+ m_display->matrix(1, (m_r & 0x7ff) | (m_o << 4 & 0x800) | (m_o << 10 & 0x1000));
+}
+
+void starwlb_state::write_r(u32 data)
+{
+ // R0-R10: leds
+ m_r = data;
+ update_display();
+}
+
+void starwlb_state::write_o(u16 data)
+{
+ // O0,O1: input mux
+ m_inp_mux = data & 3;
+
+ // O3-O6(tied together): speaker out (actually only writes 0x0 or 0xf)
+ m_speaker->level_w(population_count_32(data >> 3 & 0xf));
+
+ // O2: lamp
+ // O7: one more led
+ m_o = data;
+ update_display();
+}
+
+u8 starwlb_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(2);
+}
+
+// inputs
+
+static INPUT_PORTS_START( starwlb )
+ PORT_START("IN.0") // O0
+ PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button B")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button F")
+
+ PORT_START("IN.1") // O1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Button B")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Button F")
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+// config
+
+void starwlb_state::starwlb(machine_config &config)
+{
+ // basic machine hardware
+ TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF
+ m_maincpu->read_k().set(FUNC(starwlb_state::read_k));
+ m_maincpu->write_r().set(FUNC(starwlb_state::write_r));
+ m_maincpu->write_o().set(FUNC(starwlb_state::write_o));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(1, 13);
+ config.set_default_layout(layout_starwlb);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ static const double speaker_levels[5] = { 0.0, 1.0/4.0, 2.0/4.0, 3.0/4.0, 1.0 };
+ m_speaker->set_levels(5, speaker_levels);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( starwlb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3209", 0x0000, 0x0400, CRC(99628f9c) SHA1(5db191462521c4ae0b6955b31d5e8c6de65dd6a0) )
+
+ 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_starwlb_output.pla", 0, 365, CRC(80a2d158) SHA1(8c74ca6af5d76425ff451bb5140a8dd2cfde850a) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
- Kenner Star Wars - Electronic Battle Command
+ Kenner Star Wars: Electronic Battle Command Game (model 40370)
* TMS1100 MCU, label MP3438A (die label: 1100B, MP3438A)
* 4x4 LED grid display + 2 separate LEDs and 2-digit 7segs, 1-bit sound
@@ -6838,7 +7742,7 @@ ROM_END
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
{
@@ -6890,7 +7794,7 @@ u8 starwbc_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -6907,7 +7811,7 @@ static INPUT_PORTS_START( starwbc )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) 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")
@@ -6934,6 +7838,8 @@ static INPUT_PORTS_START( starwbc )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right")
INPUT_PORTS_END
+// config
+
void starwbc_state::starwbc(machine_config &config)
{
// basic machine hardware
@@ -6979,7 +7885,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Kenner Live Action Football
* TMS1100NLL MCU, label MP3489-N2 (die label: 1100E, MP3489)
@@ -6993,7 +7899,7 @@ ROM_END
(eg. 1 rising edge per full rotation), so there's no difference between
rotating left or right.
-***************************************************************************/
+*******************************************************************************/
class liveafb_state : public hh_tms1k_state
{
@@ -7050,7 +7956,7 @@ u8 liveafb_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( liveafb )
PORT_START("IN.0") // R0
@@ -7083,6 +7989,8 @@ static INPUT_PORTS_START( liveafb )
PORT_BIT( 0x7f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
INPUT_PORTS_END
+// config
+
void liveafb_state::liveafb(machine_config &config)
{
// basic machine hardware
@@ -7127,16 +8035,21 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Kosmos Astro
* TMS1470NLHL MP1133 (die label: TMS1400, MP1133, 28H 01D D000 R000)
* 9-digit 7seg VFD + 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.
+ This is an astrological calculator, and also supports 4-function calculations.
+ Refer to the official manual on how to use this device.
+
+ known releases:
+ - World: Astro, published by Kosmos
+ - USA: Astro (model EC-312), published by Tandy (Radio Shack)
+ - Japan: Astrostar, published by Bandai
-***************************************************************************/
+*******************************************************************************/
class astro_state : public hh_tms1k_state
{
@@ -7184,19 +8097,19 @@ u8 astro_state::read_k()
return read_inputs(8);
}
-// config
+// inputs
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( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷/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( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×/Mercury")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // R2
@@ -7234,10 +8147,12 @@ static INPUT_PORTS_START( astro )
PORT_CONFSETTING( 0x08, "Astro" )
INPUT_PORTS_END
+// config
+
void astro_state::astro(machine_config &config)
{
// basic machine hardware
- TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=4.7K, C=33pF
+ TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=33pF
m_maincpu->read_k().set(FUNC(astro_state::read_k));
m_maincpu->write_r().set(FUNC(astro_state::write_r));
m_maincpu->write_o().set(FUNC(astro_state::write_o));
@@ -7266,7 +8181,155 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Lakeside Strobe
+ * PCB label: Lakeside, REVN 3, MODEL 9020-1099, PART 9504-3007, TCI-A4H 94HB
+ * TMS1100NLLE MCU, label MP3487-N1 (die label: 1100E, MP3487)
+ * SN75492, 4 lamps, 1-bit sound
+
+ If patent US4309030 does not just describe a prototype, there should be an
+ older version on a Matsushita MN1400.
+
+ known releases:
+ - USA: Strobe, published by Lakeside
+ - UK: Strobe, published by Action GT
+
+*******************************************************************************/
+
+class strobe_state : public hh_tms1k_state
+{
+public:
+ strobe_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void strobe(machine_config &config);
+
+private:
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void strobe_state::write_r(u32 data)
+{
+ // R1-R7,R9: input mux
+ m_inp_mux = (data >> 1 & 0x7f) | (data >> 2 & 0x80);
+
+ // R8: speaker out
+ m_speaker->level_w(BIT(data, 8));
+}
+
+void strobe_state::write_o(u16 data)
+{
+ // O0-O3: lamps
+ // O4-O7: N/C
+ m_display->matrix(1, data & 0xf);
+}
+
+u8 strobe_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(8) | (m_inputs[8]->read() & 8);
+}
+
+// inputs
+
+static INPUT_PORTS_START( strobe )
+ PORT_START("IN.0") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.3") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.4") // R5
+ PORT_CONFNAME( 0x05, 0x00, "Game" )
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x01, "2" )
+ PORT_CONFSETTING( 0x04, "3" )
+ PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // R6
+ PORT_CONFNAME( 0x07, 0x00, DEF_STR( Players ) )
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x01, "2" )
+ PORT_CONFSETTING( 0x02, "3" )
+ PORT_CONFSETTING( 0x04, "4" )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.6") // R7
+ PORT_CONFNAME( 0x06, 0x00, "Speed" )
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x04, "3" )
+ PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.7") // R9
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE ) // beneath a small hole between "S" and "T" on the faceplate
+
+ PORT_START("IN.8") // Vss
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Set")
+INPUT_PORTS_END
+
+// config
+
+void strobe_state::strobe(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 500000); // approximation - RC osc. R=39K, C=47pF
+ m_maincpu->read_k().set(FUNC(strobe_state::read_k));
+ m_maincpu->write_r().set(FUNC(strobe_state::write_r));
+ m_maincpu->write_o().set(FUNC(strobe_state::write_o));
+
+ PWM_DISPLAY(config, m_display).set_size(1, 4);
+ config.set_default_layout(layout_strobe);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( strobe )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3487", 0x0000, 0x0800, CRC(aaa999d3) SHA1(69bba74bafc60573ed29451c3939c479851fe867) )
+
+ 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_strobe_output.pla", 0, 365, CRC(021bc65b) SHA1(1360e9f05bac922a27379058de16c92aca3df663) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Marx Series 300 Electronic Bowling Game
* TMS1100NLL MP3403 DBS 7836 SINGAPORE (no decap)
@@ -7290,7 +8353,7 @@ ROM_END
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
{
@@ -7360,7 +8423,7 @@ u8 elecbowl_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( elecbowl )
PORT_START("IN.0") // R5
@@ -7388,6 +8451,8 @@ static INPUT_PORTS_START( elecbowl )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw?
INPUT_PORTS_END
+// config
+
// output PLA is not decapped, this was made by hand
static const u16 elecbowl_output_pla[0x20] =
{
@@ -7434,7 +8499,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Mattel Thoroughbred Horse Race Analyzer
* PCB label: 1670-4619D
@@ -7447,7 +8512,7 @@ ROM_END
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
{
@@ -7502,7 +8567,7 @@ u8 horseran_state::read_k()
return read_inputs(8);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -7565,6 +8630,8 @@ static INPUT_PORTS_START( horseran )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
INPUT_PORTS_END
+// config
+
void horseran_state::horseran(machine_config &config)
{
// basic machine hardware
@@ -7599,16 +8666,16 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Mattel Dungeons & Dragons - Computer Labyrinth Game
+ Mattel Dungeons & Dragons: Computer Labyrinth Game
* TMS1100 M34012-N2LL (die label: 1100E, 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
{
@@ -7648,7 +8715,7 @@ u8 mdndclab_state::read_k()
return read_inputs(18);
}
-// config
+// inputs
static INPUT_PORTS_START( mdndclab )
PORT_START("IN.0") // O0
@@ -7760,6 +8827,8 @@ static INPUT_PORTS_START( mdndclab )
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
+// config
+
void mdndclab_state::mdndclab(machine_config &config)
{
// basic machine hardware
@@ -7792,7 +8861,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Comp IV
* TMC0904NL CP0904A (die label: 0970D-04A)
@@ -7808,7 +8877,7 @@ ROM_END
- Europe: Logic 5, published by MB
- Japan: Pythaligoras, published by Takara
-***************************************************************************/
+*******************************************************************************/
class comp4_state : public hh_tms1k_state
{
@@ -7854,7 +8923,7 @@ u8 comp4_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( comp4 )
PORT_START("IN.0") // O1
@@ -7876,6 +8945,8 @@ static INPUT_PORTS_START( comp4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
INPUT_PORTS_END
+// config
+
void comp4_state::comp4(machine_config &config)
{
// basic machine hardware
@@ -7911,9 +8982,9 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Milton Bradley Electronic Battleship (1977 version, model 4750A)
+ Milton Bradley Electronic Battleship (model 4750A)
* PCB label: 4750A
* TMS1000NL MP3201 (die label: 1000C, MP3201)
* LM324N, MC14016CP/TP4016AN, NE555P, discrete sound
@@ -7922,26 +8993,30 @@ ROM_END
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):
+ It went through at least 6 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)
+ 1978: 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
+ 1982: model 4750E: similar custom single-chip hardware, chip label MB4750 SCUS 0562
+ 1982: model 4750G: back to MCU, COP420 instead of TI, emulated in hh_cop400.cpp
+ 1982: model 4750H: unknown hardware, probably also COP420
-***************************************************************************/
+*******************************************************************************/
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)
+ hh_tms1k_state(mconfig, type, tag),
+ m_sound_nl(*this, "sound_nl:o%u", 0)
{ }
void bship(machine_config &config);
private:
+ optional_device_array<netlist_mame_logic_input_device, 8> m_sound_nl;
+
void write_r(u32 data);
void write_o(u16 data);
u8 read_k();
@@ -7958,9 +9033,11 @@ void bship_state::write_r(u32 data)
void bship_state::write_o(u16 data)
{
// O4: explosion light bulb
- m_display->matrix(1, data >> 4 & 1);
+ m_display->matrix(1, BIT(data, 4));
// other: sound
+ for (int i = 0; i < 8; i++)
+ if (i != 4) m_sound_nl[i]->write_line(BIT(data, i));
}
u8 bship_state::read_k()
@@ -7969,7 +9046,7 @@ u8 bship_state::read_k()
return m_inputs[11]->read() | read_inputs(11);
}
-// config
+// inputs
static INPUT_PORTS_START( bship )
PORT_START("IN.0") // R0
@@ -8038,13 +9115,15 @@ static INPUT_PORTS_START( bship )
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_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
+// config
+
void bship_state::bship(machine_config &config)
{
// basic machine hardware
@@ -8058,7 +9137,17 @@ void bship_state::bship(machine_config &config)
config.set_default_layout(layout_bship);
// sound hardware
- // TODO
+ SPEAKER(config, "mono").front_center();
+ NETLIST_SOUND(config, "sound_nl", 48000).set_source(NETLIST_NAME(bship)).add_route(ALL_OUTPUTS, "mono", 0.125);
+ NETLIST_STREAM_OUTPUT(config, "sound_nl:cout0", 0, "SPK1.1").set_mult_offset(1.0, 0.0);
+
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o0", "O0.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o1", "O1.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o2", "O2.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o3", "O3.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o5", "O5.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o6", "O6.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "sound_nl:o7", "O7.IN", 0);
}
// roms
@@ -8077,9 +9166,9 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Milton Bradley Electronic Battleship (1977 version, model 4750B)
+ Milton Bradley Electronic Battleship (model 4750B)
* PCB label: MB 4750B
* TMS1000NLL MP3208 (die label: 1000C, MP3208)
* SN75494N (acting as inverters), SN76477 sound
@@ -8087,7 +9176,7 @@ ROM_END
This is the 2nd version. The sound hardware was changed to a SN76477.
-***************************************************************************/
+*******************************************************************************/
class bshipb_state : public hh_tms1k_state
{
@@ -8127,30 +9216,23 @@ void bshipb_state::write_o(u16 data)
// 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);
+ const double o12[4] = { RES_INF, RES_K(100), RES_K(150), RES_2_PARALLEL(RES_K(100), RES_K(150)) };
+ m_sn->vco_res_w(o12[~data >> 1 & 3]);
// O2,O6: (TODO) to SN76477 pin 21
//m_sn->slf_cap_w(x);
// O4: SN76477 pin 22
- m_sn->vco_w(data >> 4 & 1);
+ m_sn->vco_w(BIT(data, 4));
// 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);
+ m_sn->mixer_b_w(BIT(data, 6));
// O7: 75494 to light bulb
- m_display->matrix(1, data >> 7 & 1);
+ m_display->matrix(1, BIT(data, 7));
}
u8 bshipb_state::read_k()
@@ -8161,8 +9243,6 @@ u8 bshipb_state::read_k()
// config
-// buttons are same as bship set
-
void bshipb_state::bshipb(machine_config &config)
{
// basic machine hardware
@@ -8178,19 +9258,19 @@ void bshipb_state::bshipb(machine_config &config)
// 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_noise_params(RES_K(47), RES_K(100), CAP_P(47));
+ m_sn->set_decay_res(RES_M(3.3));
+ m_sn->set_attack_params(CAP_U(0.47), RES_K(15));
+ m_sn->set_amp_res(RES_K(100));
+ m_sn->set_feedback_res(RES_K(39));
+ m_sn->set_vco_params(5.0 * RES_VOLTAGE_DIVIDER(RES_K(47), RES_K(33)), CAP_U(0.01), RES_K(270));
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->set_slf_params(CAP_U(22), RES_K(750));
+ m_sn->set_oneshot_params(0, RES_INF);
+ m_sn->set_vco_mode(0);
+ m_sn->set_mixer_params(0, 0, 0);
+ m_sn->set_envelope_params(1, 0);
+ m_sn->set_enable(0);
m_sn->add_route(ALL_OUTPUTS, "mono", 0.35);
}
@@ -8203,14 +9283,14 @@ ROM_START( bshipb )
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_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // a corner of the die broke off
ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Simon (model 4850), created by Ralph Baer
* TMS1000 (die label: 1000C, MP3226), or MP3300 (die label: 1000C, MP3300)
@@ -8224,7 +9304,7 @@ ROM_END
The semi-sequel Super Simon uses a TMS1100 (see next minidriver).
-***************************************************************************/
+*******************************************************************************/
class simon_state : public hh_tms1k_state
{
@@ -8266,7 +9346,7 @@ u8 simon_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( simon )
PORT_START("IN.0") // R0
@@ -8302,6 +9382,8 @@ static INPUT_PORTS_START( simon )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f)
INPUT_PORTS_END
+// config
+
void simon_state::simon(machine_config &config)
{
// basic machine hardware
@@ -8345,7 +9427,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Super Simon
* TMS1100 MP3476NLL (die label: 1100E, MP3476)
@@ -8354,7 +9436,7 @@ ROM_END
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
{
@@ -8365,33 +9447,23 @@ public:
void ssimon(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); }
-
-protected:
- virtual void machine_reset() override;
+ DECLARE_INPUT_CHANGED_MEMBER(speed_switch);
private:
- void set_clock();
void write_r(u32 data);
u8 read_k();
};
-void ssimon_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
// handlers
-void ssimon_state::set_clock()
+INPUT_CHANGED_MEMBER(ssimon_state::speed_switch)
{
// 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));
+ static const u32 freq[3] = { 200000, 275000, 400000 };
+ m_maincpu->set_unscaled_clock(freq[newval % 3]);
}
void ssimon_state::write_r(u32 data)
@@ -8415,7 +9487,7 @@ u8 ssimon_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( ssimon )
PORT_START("IN.0") // R0
@@ -8471,10 +9543,12 @@ static INPUT_PORTS_START( ssimon )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03)
INPUT_PORTS_END
+// config
+
void ssimon_state::ssimon(machine_config &config)
{
// basic machine hardware
- TMS1100(config, m_maincpu, 275000); // see set_clock
+ TMS1100(config, m_maincpu, 275000); // see speed_switch
m_maincpu->read_k().set(FUNC(ssimon_state::read_k));
m_maincpu->write_r().set(FUNC(ssimon_state::write_r));
@@ -8504,7 +9578,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Big Trak
* TMS1000NLL MP3301A or MP3301ANLL E (rev. E!) (die label: 1000E, MP3301)
@@ -8519,7 +9593,11 @@ ROM_END
The In command was canceled midst production, it is basically a nop. Newer
releases and the European version removed the button completely.
-***************************************************************************/
+ There's also an unofficial Soviet Version: Elektronika IM-11 (УУ-1 MCU and
+ КМ1010КТ1), Lunokhod and later Planetokhod. The software is presumed to be
+ identical to Big Trak, УУ-1 is very likely a TMS1000 clone.
+
+*******************************************************************************/
class bigtrak_state : public hh_tms1k_state
{
@@ -8539,20 +9617,21 @@ protected:
virtual void machine_start() override;
private:
- void update_speaker();
- void write_r(u32 data);
- void write_o(u16 data);
- u8 read_k();
-
- TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick);
- bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); }
- int m_gearbox_pos = 0;
-
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;
+
+ int m_gearbox_pos = 0;
+
+ TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick);
+ bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); }
+
+ void update_speaker();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
void bigtrak_state::machine_start()
@@ -8576,7 +9655,7 @@ 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;
+ const int speed = 17;
if (m_gearbox_pos >= speed)
m_gearbox_pos = -speed;
@@ -8631,7 +9710,7 @@ u8 bigtrak_state::read_k()
return read_inputs(7) | (sensor_state() ? 8 : 0);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -8688,6 +9767,8 @@ static INPUT_PORTS_START( bigtrak )
PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void bigtrak_state::bigtrak(machine_config &config)
{
// basic machine hardware
@@ -8726,10 +9807,10 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Dark Tower
- * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label:
+ * TMS1400NLL MP7332-N1.U1(rev. B) or MP7332-N2LL(rev. C) (die label:
TMS1400, MP7332, 28L 01D D100 R100) (assume same ROM between revisions)
* SN75494N MOS-to-LED digit driver
* motorized rotating reel + lightsensor, 1bit-sound
@@ -8743,7 +9824,7 @@ ROM_END
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
{
@@ -8761,9 +9842,6 @@ 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;
@@ -8774,6 +9852,9 @@ private:
bool m_motor_on = false;
bool m_sensor_blind = false;
+ void update_display();
+ bool sensor_led_on() { return m_display->element_on(0, 0); }
+
TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick);
void write_r(u32 data);
@@ -8785,6 +9866,7 @@ void mbdtower_state::machine_start()
{
hh_tms1k_state::machine_start();
+ // resolve handlers
m_motor_pos_out.resolve();
m_card_pos_out.resolve();
m_motor_on_out.resolve();
@@ -8895,7 +9977,7 @@ u8 mbdtower_state::read_k()
return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -8935,6 +10017,8 @@ static INPUT_PORTS_START( mbdtower )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin")
INPUT_PORTS_END
+// config
+
void mbdtower_state::mbdtower(machine_config &config)
{
// basic machine hardware
@@ -8972,16 +10056,16 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Milton Bradley Electronic Arcade Mania
- * TMS1100 M34078A-N2LL (die label: 1100G, M34078A)
+ * 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
{
@@ -9025,7 +10109,7 @@ u8 arcmania_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -9061,6 +10145,8 @@ static INPUT_PORTS_START( arcmania )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void arcmania_state::arcmania(machine_config &config)
{
// basic machine hardware
@@ -9097,7 +10183,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Code Name: Sector, by Bob Doyle
* TMS0970 MCU, MP0905BNL ZA0379 (die label: 0970F-05B)
@@ -9107,7 +10193,7 @@ ROM_END
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
{
@@ -9148,7 +10234,7 @@ u8 cnsector_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -9178,7 +10264,7 @@ static INPUT_PORTS_START( cnsector )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) 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")
@@ -9186,7 +10272,7 @@ static INPUT_PORTS_START( cnsector )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) 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")
@@ -9195,6 +10281,8 @@ static INPUT_PORTS_START( cnsector )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
INPUT_PORTS_END
+// config
+
void cnsector_state::cnsector(machine_config &config)
{
// basic machine hardware
@@ -9220,7 +10308,7 @@ ROM_START( cnsector )
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_LOAD( "tms0970_common3_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 )
@@ -9231,7 +10319,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Merlin handheld game, by Bob Doyle
* TMS1100NLL MP3404 or MP3404A-N2
@@ -9251,7 +10339,7 @@ ROM_END
Refer to the official manual for more information on the games.
-***************************************************************************/
+*******************************************************************************/
class merlin_state : public hh_tms1k_state
{
@@ -9299,7 +10387,7 @@ u8 merlin_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( merlin )
PORT_START("IN.0") // O0
@@ -9327,6 +10415,8 @@ static INPUT_PORTS_START( merlin )
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
+// config
+
void merlin_state::merlin(machine_config &config)
{
// basic machine hardware
@@ -9363,7 +10453,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Master Merlin
* TMS1400 MP7351-N2LL (die label: 1400CR, MP7351)
@@ -9383,7 +10473,7 @@ ROM_END
8: Patterns
9: Hot Potato
-***************************************************************************/
+*******************************************************************************/
class mmerlin_state : public merlin_state
{
@@ -9397,7 +10487,7 @@ public:
// handlers: uses the ones in merlin_state
-// config
+// inputs
static INPUT_PORTS_START( mmerlin )
PORT_INCLUDE( merlin )
@@ -9406,6 +10496,8 @@ static INPUT_PORTS_START( mmerlin )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") // instead of Hit Me
INPUT_PORTS_END
+// config
+
void mmerlin_state::mmerlin(machine_config &config)
{
merlin(config);
@@ -9435,7 +10527,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Electronic Master Mind
* TMS1000NLL MP3200 (die label: 1000E, MP3200)
@@ -9445,7 +10537,7 @@ ROM_END
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
{
@@ -9482,7 +10574,7 @@ u8 pbmastm_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( pbmastm )
PORT_START("IN.0") // O0
@@ -9522,6 +10614,8 @@ static INPUT_PORTS_START( pbmastm )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void pbmastm_state::pbmastm(machine_config &config)
{
// basic machine hardware
@@ -9553,7 +10647,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Stop Thief, by Bob Doyle
* TMS0980NLL MP6101B (die label: 0980B-01A)
@@ -9564,7 +10658,7 @@ ROM_END
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
{
@@ -9608,7 +10702,7 @@ u8 stopthief_state::read_k()
return m_inputs[2]->read() | read_inputs(2);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -9635,7 +10729,7 @@ static INPUT_PORTS_START( stopthief )
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_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")
@@ -9643,6 +10737,8 @@ static INPUT_PORTS_START( stopthief )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
+// config
+
void stopthief_state::stopthief(machine_config &config)
{
// basic machine hardware
@@ -9699,7 +10795,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen
* TMS1400NLL MP7313-N2 (die label: TMS1400, MP7313, 28L 01D D000 R000)
@@ -9716,7 +10812,7 @@ ROM_END
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
{
@@ -9767,7 +10863,7 @@ u8 bankshot_state::read_k()
return read_inputs(2);
}
-// config
+// inputs
/* physical button layout and labels are like this:
(note: remember that you can rotate the display in MAME)
@@ -9795,6 +10891,8 @@ static INPUT_PORTS_START( bankshot )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void bankshot_state::bankshot(machine_config &config)
{
// basic machine hardware
@@ -9830,7 +10928,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Parker Brothers Split Second
* TMS1400NLL MP7314-N2 (die label: TMS1400, MP7314, 28L 01D D000 R000)
@@ -9860,7 +10958,7 @@ ROM_END
50 60 52 62 54 64 56
70 72 74
-***************************************************************************/
+*******************************************************************************/
class splitsec_state : public hh_tms1k_state
{
@@ -9912,7 +11010,7 @@ u8 splitsec_state::read_k()
return read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( splitsec )
PORT_START("IN.0") // R9
@@ -9928,6 +11026,8 @@ static INPUT_PORTS_START( splitsec )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void splitsec_state::splitsec(machine_config &config)
{
// basic machine hardware
@@ -9962,16 +11062,16 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Parker Brothers Lost Treasure - The Electronic Deep-Sea Diving Game,
+ 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
{
@@ -10014,7 +11114,7 @@ u8 lostreas_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
/* physical button layout and labels are like this:
(note: Canadian version differs slightly to accomodoate dual-language)
@@ -10055,6 +11155,8 @@ static INPUT_PORTS_START( lostreas )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up")
INPUT_PORTS_END
+// config
+
void lostreas_state::lostreas(machine_config &config)
{
// basic machine hardware
@@ -10094,7 +11196,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Playskool Alphie
* TMS1000 (label not known yet)
@@ -10111,7 +11213,7 @@ ROM_END
- X symbol: used with Robot Land board game
- music note: play a selection of 5 tunes
-***************************************************************************/
+*******************************************************************************/
class alphie_state : public hh_tms1k_state
{
@@ -10157,7 +11259,7 @@ u8 alphie_state::read_k()
return read_rotated_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( alphie )
PORT_START("IN.0") // K1
@@ -10195,6 +11297,8 @@ static INPUT_PORTS_START( alphie )
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
+// config
+
// output PLA is guessed
static const u16 alphie_output_pla[0x20] =
{
@@ -10237,7 +11341,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tandy Championship Football (model 60-2150)
* PCB label: CYG-316
@@ -10247,7 +11351,7 @@ ROM_END
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
{
@@ -10303,7 +11407,7 @@ u8 tcfball_state::read_k()
return read_inputs(3);
}
-// config
+// inputs
static INPUT_PORTS_START( tcfball )
PORT_START("IN.0") // R5
@@ -10325,6 +11429,8 @@ static INPUT_PORTS_START( tcfball )
PORT_CONFSETTING( 0x08, "2" ) // professional
INPUT_PORTS_END
+// config
+
void tcfball_state::tcfball(machine_config &config)
{
// basic machine hardware
@@ -10362,7 +11468,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tandy Championship Football (model 60-2151)
* TMS1100NLL MP1183 (no decap)
@@ -10375,7 +11481,7 @@ ROM_END
- World(2): Super-Pro Football, no brand
- USA: Championship Football (model 60-2151), published by Tandy
-***************************************************************************/
+*******************************************************************************/
class tcfballa_state : public tcfball_state
{
@@ -10389,7 +11495,7 @@ public:
// handlers: uses the ones in tcfball_state
-// config
+// inputs
static INPUT_PORTS_START( tcfballa )
PORT_INCLUDE( tcfball )
@@ -10399,6 +11505,8 @@ static INPUT_PORTS_START( tcfballa )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Display")
INPUT_PORTS_END
+// config
+
void tcfballa_state::tcfballa(machine_config &config)
{
tcfball(config);
@@ -10428,25 +11536,27 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- Tandy Computerized Arcade (model 60-2159 or 60-2159A)
- * TMS1100 MCU, label CD7282SL
+ Tandy Computerized Arcade (model 60-2159)
+ * PCB label: HP-805 or CDC-805
+ * TMS1100 MCU, label MP1272 or 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!
+ - World: Tandy-12: Computerized Arcade, published by Tandy, model 60-2159.
+ - World: Computerized Arcade, Radio Shack brand, also model 60-2159 and same
+ hardware as above. "Tandy-12" on the side of the handheld was changed to
+ "Radio Shack-12", but there's no title prefix on the box.
+ - World: Computerized Arcade, Radio Shack brand, model 60-2159A, COP421 MCU,
+ see hh_cop400.cpp driver
+ - World: Computerized Arcade, Radio Shack brand, model 60-2495, 28-pin Motorola
+ LSC417570DW, should be 68HC05 family
- 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.
+ This handheld contains 12 minigames. It looks and plays like Takatoku Toys'
+ Game Robot 9 from 1980 (aka Mego's Fabulous Fred).
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,
@@ -10455,16 +11565,16 @@ ROM_END
See below at the input defs for a list of the games.
-***************************************************************************/
+*******************************************************************************/
-class tandy12_state : public hh_tms1k_state
+class comparc_state : public hh_tms1k_state
{
public:
- tandy12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ comparc_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
- void tandy12(machine_config &config);
+ void comparc(machine_config &config);
private:
void update_display();
@@ -10475,12 +11585,12 @@ private:
// handlers
-void tandy12_state::update_display()
+void comparc_state::update_display()
{
m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00));
}
-void tandy12_state::write_r(u32 data)
+void comparc_state::write_r(u32 data)
{
// R10: speaker out
m_speaker->level_w(data >> 10 & 1);
@@ -10493,20 +11603,20 @@ void tandy12_state::write_r(u32 data)
update_display();
}
-void tandy12_state::write_o(u16 data)
+void comparc_state::write_o(u16 data)
{
// O0-O7: button lamps 1-8
m_o = data;
update_display();
}
-u8 tandy12_state::read_k()
+u8 comparc_state::read_k()
{
// K: multiplexed inputs
return read_inputs(5);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -10529,7 +11639,7 @@ u8 tandy12_state::read_k()
START SELECT PLAY-2/HIT-7
*/
-static INPUT_PORTS_START( tandy12 )
+static INPUT_PORTS_START( comparc )
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")
@@ -10544,9 +11654,7 @@ static INPUT_PORTS_START( tandy12 )
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_BIT( 0x0e, 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")
@@ -10561,8 +11669,10 @@ static INPUT_PORTS_START( tandy12 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
INPUT_PORTS_END
+// config
+
// output PLA is not decapped, this was made by hand
-static const u16 tandy12_output_pla[0x20] =
+static const u16 comparc_output_pla[0x20] =
{
// these are certain
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
@@ -10574,18 +11684,18 @@ static const u16 tandy12_output_pla[0x20] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-void tandy12_state::tandy12(machine_config &config)
+void comparc_state::comparc(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->read_k().set(FUNC(tandy12_state::read_k));
- m_maincpu->write_r().set(FUNC(tandy12_state::write_r));
- m_maincpu->write_o().set(FUNC(tandy12_state::write_o));
+ TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF
+ m_maincpu->set_output_pla(comparc_output_pla);
+ m_maincpu->read_k().set(FUNC(comparc_state::read_k));
+ m_maincpu->write_r().set(FUNC(comparc_state::write_r));
+ m_maincpu->write_o().set(FUNC(comparc_state::write_o));
// video hardware
PWM_DISPLAY(config, m_display).set_size(1, 13);
- config.set_default_layout(layout_tandy12);
+ config.set_default_layout(layout_comparc);
// sound hardware
SPEAKER(config, "mono").front_center();
@@ -10595,23 +11705,23 @@ void tandy12_state::tandy12(machine_config &config)
// roms
-ROM_START( tandy12 )
+ROM_START( comparc )
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_LOAD( "tms1100_comparc_output.pla", 0, 365, NO_DUMP )
ROM_END
-/***************************************************************************
+/*******************************************************************************
- Tandy(Radio Shack division) Monkey See (1982 version)
+ 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
@@ -10623,7 +11733,7 @@ ROM_END
- USA(1): Monkey See, published by Tandy
- USA(2): Heathcliff, published by McNaught Syndicate in 1983
-***************************************************************************/
+*******************************************************************************/
class monkeysee_state : public hh_tms1k_state
{
@@ -10664,7 +11774,7 @@ u8 monkeysee_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( monkeysee )
PORT_START("IN.0") // R0
@@ -10686,8 +11796,8 @@ static INPUT_PORTS_START( monkeysee )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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("-")
@@ -10698,6 +11808,8 @@ static INPUT_PORTS_START( monkeysee )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
INPUT_PORTS_END
+// config
+
void monkeysee_state::monkeysee(machine_config &config)
{
// basic machine hardware
@@ -10732,12 +11844,12 @@ 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
+ * 2x2-digit 7seg LED display + 45+2 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.
@@ -10748,7 +11860,7 @@ ROM_END
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
{
@@ -10775,17 +11887,17 @@ void t3in1sa_state::update_display()
void t3in1sa_state::write_r(u32 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();
+
+ // R0,R1,R5,R7-R9: input mux
+ m_inp_mux = (data & 3) | (data >> 3 & 4) | (data >> 4 & 0x38);
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
}
void t3in1sa_state::write_o(u16 data)
@@ -10801,7 +11913,7 @@ u8 t3in1sa_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
/* physical button layout and labels are like this:
@@ -10863,6 +11975,8 @@ static INPUT_PORTS_START( t3in1sa )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Team-Mate")
INPUT_PORTS_END
+// config
+
void t3in1sa_state::t3in1sa(machine_config &config)
{
// basic machine hardware
@@ -10899,7 +12013,450 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Tandy (Micronta) VoxClock 3 (sold by Radio Shack, model 63-906)
+ * PCB label: VOXCLOCK 3
+ * TMS1100 MP1343 (die label: 1100E, MP1343)
+ * TMS5110AN2L-1 speech chip, 4KB VSM CM72010NL (die label: T0355C, 72010U)
+ * 4-digit 7seg LED display, 6 other LEDs
+
+ Even though it has a 60 Hz inputline, it doesn't use it to sync the clock.
+ Instead, it relies on the MCU frequency, which is not very accurate when
+ using a simple R/C osc. In 60 Hz mode, it expects a CPU clock of around
+ 375 kHz, and in 50 Hz mode around 369 kHz.
+
+ Micronta is not a company, but one of the Radio Shack house brands.
+ Schematics are included in the manual, they also mention a CM72005 VSM.
+
+ Spartus AVT from 1982 is nearly the same as VoxClock 3.
+
+*******************************************************************************/
+
+class vclock3_state : public hh_tms1k_state
+{
+public:
+ vclock3_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_ac_power(*this, "ac_power")
+ { }
+
+ void vclock3(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(switch_hz) { m_ac_power->set_clock(newval ? 50 : 60); }
+
+private:
+ required_device<tms5110_device> m_tms5100;
+ required_device<tms6100_device> m_tms6100;
+ required_device<clock_device> m_ac_power;
+
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void vclock3_state::update_display()
+{
+ m_display->matrix(m_r, m_o | (m_r << 2 & 0x180));
+}
+
+void vclock3_state::write_r(u32 data)
+{
+ // R0-R4,R8: input mux
+ m_inp_mux = (data & 0x1f) | (data >> 3 & 0x20);
+
+ // R0-R3: select digit
+ // R5,R6: led data
+ m_r = data;
+ update_display();
+
+ // R7: TMS5100 PDC
+ m_tms5100->pdc_w(BIT(data, 7));
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
+}
+
+void vclock3_state::write_o(u16 data)
+{
+ // O0-O3: TMS5100 CTL
+ m_tms5100->ctl_w(data & 0xf);
+
+ // O0-O6: digit segments
+ m_o = data & 0x7f;
+ update_display();
+}
+
+u8 vclock3_state::read_k()
+{
+ // K1-K4: multiplexed inputs
+ u8 data = read_inputs(6) & 7;
+
+ // K4: TMS5100 CTL1
+ // K8: AC power osc
+ data |= m_tms5100->ctl_r() << 2 & 4;
+ data |= (m_inputs[6]->read() & m_ac_power->signal_r()) << 3;
+ return data;
+}
+
+// inputs
+
+/* physical button layout and labels are like this:
+
+ [ ] [ ] [ ] [ ]
+ CALENDAR-SET-TIME CHIME ANNOUNCE
+
+ [ ] [ ] [ ] [ ]
+ HOUR FWD↑ MIN FWD↑ SET ALARM 1-ON/OFF
+
+ [ ] [ ] [ ] [ ]
+ HOUR REV↓ MIN REV↓ SET ALARM 2-ON/OFF
+
+ [ ] --------------- LOW[ ]HIGH
+ SENTINEL LOW VOLUME HIGH DIMMER
+
+ CALENDAR
+ [ ] [ ]
+ SNOOZE/DATE TIME
+*/
+
+static INPUT_PORTS_START( vclock3 )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Snooze / Date")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Alarm 2 On/Off")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Alarm 1 On/Off")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Announce")
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Set Alarm 2")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Set Alarm 1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Chime")
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Minute Reverse")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Minute Forward")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set Time")
+
+ PORT_START("IN.4") // R4 (factory-set jumpers)
+ PORT_CONFNAME( 0x01, 0x00, "AC Frequency") PORT_CHANGED_MEMBER(DEVICE_SELF, vclock3_state, switch_hz, 0)
+ PORT_CONFSETTING( 0x01, "50 Hz" )
+ PORT_CONFSETTING( 0x00, "60 Hz" )
+ PORT_CONFNAME( 0x02, 0x00, "Chime / Announce" )
+ PORT_CONFSETTING( 0x02, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+ PORT_CONFNAME( 0x04, 0x00, "Recall" )
+ PORT_CONFSETTING( 0x04, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN.5") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Hour Reverse")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Hour Forward")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Set Calendar")
+
+ PORT_START("IN.6")
+ PORT_CONFNAME( 0x01, 0x01, "Power Source" )
+ PORT_CONFSETTING( 0x00, "Battery" )
+ PORT_CONFSETTING( 0x01, "Mains" )
+ PORT_CONFNAME( 0x02, 0x00, "Battery Status" )
+ PORT_CONFSETTING( 0x02, "Low" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
+INPUT_PORTS_END
+
+// config
+
+void vclock3_state::vclock3(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF
+ m_maincpu->read_k().set(FUNC(vclock3_state::read_k));
+ m_maincpu->write_r().set(FUNC(vclock3_state::write_r));
+ m_maincpu->write_o().set(FUNC(vclock3_state::write_o));
+
+ CLOCK(config, m_ac_power, 60); // from mains power
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(4, 9);
+ m_display->set_segmask(0xf, 0x7f);
+ m_display->set_segmask(0x1, 0x06); // 1st digit only has segments B,C
+ config.set_default_layout(layout_vclock3);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+
+ TMS5110A(config, m_tms5100, 640000); // approximation - RC osc. R=47K, C=47pF
+ 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.25);
+
+ TMS6100(config, m_tms6100, 640000/4);
+
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( vclock3 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1343.u1", 0x0000, 0x0800, CRC(d8fac397) SHA1(65003ec70ae3d45296c08b10aff85ca29c0f573e) )
+
+ 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_vclock3_output.pla", 0, 365, CRC(e5b0e95b) SHA1(6d624bfefd302fd04c02177081cea9416ba344ee) )
+
+ ROM_REGION( 0x1000, "tms6100", 0 )
+ ROM_LOAD( "cm72010.u3", 0x0000, 0x1000, CRC(2054847c) SHA1(716592f4cd01a9edf16b1061431bd6dc934d9053) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
+
+ Technasonic Weight Talker
+ * PCB label: BHP_8338A8
+ * TMS1100 MP1362 (no decap)
+ * TMS5110AN2L-1 speech chip, 16KB VSM CM62088N2L
+ * CD40114BE (4x16 RAM, battery-backed)
+
+ There's also an older version (BHP_8338A2 PCB, M34137N2, CM62074). It can be
+ identified by the missing (unpopulated) language switch.
+
+ It has a normal mechanical scale hidden from view, with a quadrature encoder.
+ In MAME, it's simulated with a dial control. Turn it left to increase pressure,
+ right to decrease. After around 0.5s of inactivity, it will tell your 'weight'.
+
+*******************************************************************************/
+
+class wtalker_state : public hh_tms1k_state
+{
+public:
+ wtalker_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
+ m_nvram(*this, "nvram", 0x10, ENDIANNESS_BIG),
+ m_tms5100(*this, "tms5100"),
+ m_tms6100(*this, "tms6100")
+ { }
+
+ void wtalker(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(sensor_r) { return m_dial & 1; }
+ DECLARE_CUSTOM_INPUT_MEMBER(pulse_r) { return (m_pulse > machine().time()) ? 1 : 0; }
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ memory_share_creator<u8> m_nvram;
+ required_device<tms5110_device> m_tms5100;
+ required_device<tms6100_device> m_tms6100;
+
+ attotime m_pulse;
+ u8 m_dial = 0;
+ u8 m_ram_address = 0;
+
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+
+ TIMER_DEVICE_CALLBACK_MEMBER(sense_weight);
+};
+
+void wtalker_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_pulse));
+ save_item(NAME(m_dial));
+ save_item(NAME(m_ram_address));
+}
+
+// handlers
+
+TIMER_DEVICE_CALLBACK_MEMBER(wtalker_state::sense_weight)
+{
+ const u8 mask = 3;
+ u8 inp = m_inputs[7]->read() & mask;
+
+ // short pulse on rising edge or falling edge, depending on direction
+ if (inp != m_dial && BIT(mask + inp - m_dial, 1) != BIT(inp, 0))
+ m_pulse = machine().time() + attotime::from_usec(250);
+
+ m_dial = inp;
+}
+
+void wtalker_state::write_r(u32 data)
+{
+ // R2,R3,R9: input mux part
+ m_inp_mux = (m_inp_mux & 7) | (data << 1 & 0x18) | (data >> 4 & 0x20);
+
+ // R8: TMS5100 PDC
+ m_tms5100->pdc_w(BIT(data, 8));
+
+ // R10: power off on rising edge
+ if (data & ~m_r & 0x400)
+ power_off();
+
+ // R0: RAM ME
+ // R1: RAM WE
+ // R4-R7: RAM D-A
+
+ // latch RAM address
+ if (data & ~m_r & 1)
+ m_ram_address = bitswap<4>(data,4,5,6,7);
+
+ // write RAM
+ if ((data & 3) == 3 && (m_r & 3) != 3)
+ m_nvram[m_ram_address] = m_o & 0xf;
+
+ m_r = data;
+}
+
+void wtalker_state::write_o(u16 data)
+{
+ // O4-O6: input mux part
+ // O7: N/C
+ m_inp_mux = (m_inp_mux & ~7) | (data >> 4 & 7);
+
+ // O0-O3: TMS5100 CTL, RAM data
+ m_tms5100->ctl_w(data & 0xf);
+ m_o = data;
+}
+
+u8 wtalker_state::read_k()
+{
+ // K2-K8: multiplexed inputs
+ u8 data = read_inputs(6) << 1 & 0xe;
+
+ // read RAM (complemented)
+ if ((m_r & 3) == 1)
+ data |= ~m_nvram[m_ram_address] & 0xf;
+
+ // K1: TMS5100 CTL1
+ data |= m_tms5100->ctl_r() & 1;
+ return data;
+}
+
+// inputs
+
+static INPUT_PORTS_START( wtalker )
+ PORT_START("IN.0") // O4
+ 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_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+
+ PORT_START("IN.1") // O5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Guest")
+ 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_START("IN.2") // O6
+ PORT_CONFNAME( 0x01, 0x01, "Memory")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
+ PORT_CONFNAME( 0x02, 0x00, "Weight Unit")
+ PORT_CONFSETTING( 0x02, "Kilogram" )
+ PORT_CONFSETTING( 0x00, "Pound" )
+ PORT_CONFNAME( 0x04, 0x00, "Shutdown Message")
+ PORT_CONFSETTING( 0x04, "Good Bye" ) PORT_CONDITION("IN.5", 0x02, NOTEQUALS, 0x02)
+ PORT_CONFSETTING( 0x00, "Have a Nice Day" ) PORT_CONDITION("IN.5", 0x02, NOTEQUALS, 0x02)
+ PORT_CONFSETTING( 0x04, "Auf Wiedersehen" ) PORT_CONDITION("IN.5", 0x02, EQUALS, 0x02)
+ PORT_CONFSETTING( 0x00, "Guten Tag" ) PORT_CONDITION("IN.5", 0x02, EQUALS, 0x02)
+
+ PORT_START("IN.3") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(wtalker_state, sensor_r)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(wtalker_state, pulse_r)
+
+ PORT_START("IN.4") // R3
+ PORT_CONFNAME( 0x01, 0x00, "Battery Status" )
+ PORT_CONFSETTING( 0x01, "Low" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_CONFNAME( 0x02, 0x00, DEF_STR( Language ) ) // unpopulated switch
+ PORT_CONFSETTING( 0x00, DEF_STR( English ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( German ) )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.6")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
+
+ PORT_START("IN.7")
+ PORT_BIT( 0x03, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10)
+INPUT_PORTS_END
+
+// config
+
+void wtalker_state::wtalker(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 550000); // approximation - RC osc. R=36K, C=33pF
+ m_maincpu->read_k().set(FUNC(wtalker_state::read_k));
+ m_maincpu->write_r().set(FUNC(wtalker_state::write_r));
+ m_maincpu->write_o().set(FUNC(wtalker_state::write_o));
+
+ TIMER(config, "sense_weight").configure_periodic(FUNC(wtalker_state::sense_weight), attotime::from_usec(1));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ // no visual feedback!
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+
+ TMS5110A(config, m_tms5100, 640000); // approximation - trimpot
+ 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.25);
+
+ TMS6100(config, m_tms6100, 640000/4);
+}
+
+// roms
+
+ROM_START( wtalker )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1362", 0x0000, 0x0800, CRC(99247fad) SHA1(30e48f235f821491643554c9e58a72459cf1d834) )
+
+ 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_wtalker_output.pla", 0, 365, NO_DUMP )
+
+ ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump
+ ROM_LOAD16_BYTE( "tms1100_wtalker_output.bin", 0, 0x20, CRC(fb51ad7c) SHA1(5972665fbc154ebb18e4eb2663c6088643651489) )
+
+ ROM_REGION( 0x4000, "tms6100", 0 )
+ ROM_LOAD( "cm62088", 0x0000, 0x4000, CRC(0c7a6d26) SHA1(2dbdc54019d02531adbd3c7515a8995710a4267c) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Telesensory Systems, Inc.(TSI) Speech+
* TMS1000 MCU, label TMS1007NL (die label: 1000B, 1007A)
@@ -10910,7 +12467,7 @@ ROM_END
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
{
@@ -10926,9 +12483,9 @@ private:
required_device<s14001a_device> m_speech;
void update_display();
- virtual void write_r(u32 data);
- virtual void write_o(u16 data);
- virtual u8 read_k();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
};
// handlers
@@ -10967,7 +12524,7 @@ u8 speechp_state::read_k()
return m_inputs[10]->read() | (read_inputs(10) & 7);
}
-// config
+// inputs
static INPUT_PORTS_START( speechp )
PORT_START("IN.0") // R0
@@ -11002,8 +12559,8 @@ static INPUT_PORTS_START( speechp )
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_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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")
@@ -11012,7 +12569,7 @@ static INPUT_PORTS_START( speechp )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221a") // U+221A = √
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.9") // R9
@@ -11028,6 +12585,8 @@ static INPUT_PORTS_START( speechp )
PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
INPUT_PORTS_END
+// config
+
void speechp_state::speechp(machine_config &config)
{
// basic machine hardware
@@ -11066,17 +12625,17 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI SR-16 (1974, first consumer product with TMS1000 series MCU)
+ Texas Instruments 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)
+ Texas Instruments 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
{
@@ -11126,7 +12685,7 @@ u8 tisr16_state::read_k()
return read_inputs(11);
}
-// config
+// inputs
static INPUT_PORTS_START( tisr16 )
PORT_START("IN.0") // R0
@@ -11143,13 +12702,13 @@ static INPUT_PORTS_START( tisr16 )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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")
@@ -11161,31 +12720,31 @@ static INPUT_PORTS_START( tisr16 )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(u8"Σ")
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( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME(u8"yˣ")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME(u8"10ˣ")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME(u8"eˣ")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
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")
@@ -11222,7 +12781,7 @@ static INPUT_PORTS_START( tisr16ii )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
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")
@@ -11234,7 +12793,7 @@ static INPUT_PORTS_START( tisr16ii )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
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")
@@ -11247,27 +12806,29 @@ static INPUT_PORTS_START( tisr16ii )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME(u8"eˣ")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(u8"Σ")
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME(u8"yˣ")
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( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(u8"π")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
INPUT_PORTS_END
+// config
+
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)
+ TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq)
m_maincpu->read_k().set(FUNC(tisr16_state::read_k));
m_maincpu->write_o().set(FUNC(tisr16_state::write_o));
m_maincpu->write_r().set(FUNC(tisr16_state::write_r));
@@ -11306,9 +12867,9 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI-1250/TI-1200 (1975 version), Spirit of '76
+ Texas Instruments TI-1250/TI-1200 (1975 version), Spirit of '76
* TMS0950 MCU label TMC0952NL, K0952 (die label: 0950A 0952)
* 9-digit 7seg LED display
@@ -11329,7 +12890,7 @@ ROM_END
* 8-digit 7seg LED display
* notes: almost same hardware as TMS0972 TI-1250, minor scientific functions
-***************************************************************************/
+*******************************************************************************/
class ti1250_state : public hh_tms1k_state
{
@@ -11369,7 +12930,7 @@ u8 ti1250_state::read_k()
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( ti1250 )
PORT_START("IN.0") // O1
@@ -11394,13 +12955,13 @@ static INPUT_PORTS_START( ti1250 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
PORT_START("IN.5") // O7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("MC")
@@ -11418,15 +12979,17 @@ static INPUT_PORTS_START( ti1270 )
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_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(u8"π")
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
INPUT_PORTS_END
+// config
+
void ti1250_state::ti1250(machine_config &config)
{
// basic machine hardware
@@ -11471,7 +13034,7 @@ ROM_START( ti1250 )
ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
ROM_END
-ROM_START( ti125076 )
+ROM_START( ti1250a )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) )
@@ -11503,16 +13066,160 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Texas Instruments TI-2550 II, more (see below)
+ * TMS1070 TMS1071NL (die label: 1070A, 1071A)
+ * 9-digit cyan VFD
+
+ This chip was also used in 3rd-party calculators, like Citizen 831RD,
+ Prinztronic M800, Lloyd's E311, Privileg 861MD.
+
+*******************************************************************************/
+
+class ti25502_state : public hh_tms1k_state
+{
+public:
+ ti25502_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void ti25502(machine_config &config);
+
+private:
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
+};
+
+// handlers
+
+void ti25502_state::update_display()
+{
+ m_display->matrix(m_r, m_o);
+}
+
+void ti25502_state::write_r(u32 data)
+{
+ // R0-R6,R9: input mux
+ m_inp_mux = (data & 0x7f) | (data >> 2 & 0x80);
+
+ // R0-R8: select digit
+ m_r = data;
+ update_display();
+}
+
+void ti25502_state::write_o(u16 data)
+{
+ // O0-O7: digit segments
+ m_o = data;
+ update_display();
+}
+
+u8 ti25502_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(8);
+}
+
+// inputs
+
+static INPUT_PORTS_START( ti25502 )
+ 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(u8"×")
- TI-2550 III, TI-1650/TI-1600, TI-1265 (they have the same chip)
+ PORT_START("IN.4") // R4
+ 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_DEL) PORT_NAME("C")
+ 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(u8"÷")
+
+ 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_MINUS) PORT_NAME("+/-") // N/A on TI-2550 II
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x")
+
+ PORT_START("IN.7") // R9
+ PORT_CONFNAME( 0x0f, 0x00, "Decimal" )
+ PORT_CONFSETTING( 0x00, "F" )
+ PORT_CONFSETTING( 0x01, "1" ) // N/A on TI-2550 II
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x04, "4" ) // "
+INPUT_PORTS_END
+
+// config
+
+void ti25502_state::ti25502(machine_config &config)
+{
+ // basic machine hardware
+ TMS1070(config, m_maincpu, 350000); // approximation - RC osc. R=43K, C=68pF
+ m_maincpu->read_k().set(FUNC(ti25502_state::read_k));
+ m_maincpu->write_o().set(FUNC(ti25502_state::write_o));
+ m_maincpu->write_r().set(FUNC(ti25502_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_ti25502);
+
+ // no sound!
+}
+
+// roms
+
+ROM_START( ti25502 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1071nl", 0x0000, 0x0400, CRC(0f5640c9) SHA1(6e8b54d8ceed8850d1186204ea26b6657add3d48) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ti25502_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) )
+ ROM_REGION( 406, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1070_ti25502_output.pla", 0, 406, CRC(c1df3ae6) SHA1(f106caaea1ac4787d8b579f16177dbf2f35b094d) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
+
+ Texas Instruments 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
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
{
@@ -11558,7 +13265,7 @@ u8 ti25503_state::read_k()
return read_inputs(7);
}
-// config
+// inputs
static INPUT_PORTS_START( ti25503 )
PORT_START("IN.0") // R0
@@ -11583,13 +13290,13 @@ static INPUT_PORTS_START( ti25503 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
PORT_START("IN.5") // R5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM")
@@ -11599,15 +13306,17 @@ static INPUT_PORTS_START( ti25503 )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x")
INPUT_PORTS_END
+// config
+
void ti25503_state::ti25503(machine_config &config)
{
// basic machine hardware
- TMS1040(config, m_maincpu, 250000); // approximation
+ TMS1040(config, m_maincpu, 350000); // approximation
m_maincpu->read_k().set(FUNC(ti25503_state::read_k));
m_maincpu->write_o().set(FUNC(ti25503_state::write_o));
m_maincpu->write_r().set(FUNC(ti25503_state::write_r));
@@ -11615,7 +13324,7 @@ void ti25503_state::ti25503(machine_config &config)
// video hardware
PWM_DISPLAY(config, m_display).set_size(9, 8);
m_display->set_segmask(0x1ff, 0xff);
- config.set_default_layout(layout_ti25503);
+ config.set_default_layout(layout_ti25502);
// no sound!
}
@@ -11636,9 +13345,9 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI-5100, more (see below)
+ Texas Instruments TI-5100, more (see below)
* TMS1070 MCU label TMS1073NL or TMC1073NL (die label: 1070B, 1073)
* 11-digit 7seg VFD (1 custom digit)
@@ -11646,7 +13355,7 @@ ROM_END
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
{
@@ -11669,7 +13378,7 @@ private:
void ti5100_state::update_display()
{
// extra segment on R10
- m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o);
+ m_display->matrix(m_r, m_o | ((m_r & 0x400) ? 0x180 : 0));
}
void ti5100_state::write_r(u32 data)
@@ -11692,22 +13401,22 @@ u8 ti5100_state::read_k()
return read_inputs(11);
}
-// config
+// inputs
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_CONFNAME( 0x08, 0x00, "Mode" )
+ PORT_CONFSETTING( 0x08, "K" ) // constant
+ PORT_CONFSETTING( 0x00, "C" ) // chain
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_CONFNAME( 0x08, 0x00, "Decimal" )
+ PORT_CONFSETTING( 0x00, "F" ) // floating
PORT_CONFSETTING( 0x08, "2" )
PORT_START("IN.3") // R3
@@ -11717,7 +13426,7 @@ static INPUT_PORTS_START( ti5100 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(u8"Δ%")
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")
@@ -11745,28 +13454,30 @@ static INPUT_PORTS_START( ti5100 )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
INPUT_PORTS_END
+// config
+
void ti5100_state::ti5100(machine_config &config)
{
// basic machine hardware
- TMS1070(config, m_maincpu, 250000); // approximation
+ TMS1070(config, m_maincpu, 350000); // approximation
m_maincpu->read_k().set(FUNC(ti5100_state::read_k));
m_maincpu->write_o().set(FUNC(ti5100_state::write_o));
m_maincpu->write_r().set(FUNC(ti5100_state::write_r));
// video hardware
PWM_DISPLAY(config, m_display).set_size(11, 9);
- m_display->set_segmask(0x7ff, 0xff);
+ m_display->set_segmask(0x3ff, 0xff);
config.set_default_layout(layout_ti5100);
// no sound!
@@ -11780,17 +13491,157 @@ ROM_START( ti5100 )
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_REGION( 406, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1070_ti5100_output.pla", 0, 406, CRC(b4a3aa6e) SHA1(812b5483a26ae3aa05661c86841d2d3d163e6c46) )
ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Texas Instruments TI-5200
+ * TMS1270 MCU label TMS1278NL or TMC1278NL (die label: 1070B, 1278A)
+ * 13-digit 7seg VFD Itron FG139A1 (1 custom digit)
- TMC098x series Majestic-line calculators
+*******************************************************************************/
+
+class ti5200_state : public hh_tms1k_state
+{
+public:
+ ti5200_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void ti5200(machine_config &config);
+
+private:
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
+};
+
+// handlers
+
+void ti5200_state::update_display()
+{
+ m_display->matrix(m_r, m_o);
+}
+
+void ti5200_state::write_r(u32 data)
+{
+ // R0-R5,R9,R12: input mux
+ m_inp_mux = (data & 0x3f) | (data >> 3 & 0x40) | (data >> 5 & 0x80);
+
+ // R0-R12: select digit
+ m_r = data;
+ update_display();
+}
+
+void ti5200_state::write_o(u16 data)
+{
+ // O1-O9: digit segments
+ m_o = bitswap<9>(data,7,8,3,6,5,4,9,2,1);
+ update_display();
+}
+
+u8 ti5200_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(8);
+}
+
+// inputs
+
+static INPUT_PORTS_START( ti5200 )
+ PORT_START("IN.0") // R0
+ 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_V) PORT_NAME("RV")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%")
+
+ PORT_START("IN.1") // R1
+ 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.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ 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.3") // R3
+ 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.4") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_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(u8"×")
+
+ PORT_START("IN.5") // R5
+ 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(u8"÷")
+
+ PORT_START("IN.6") // R9
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x08, 0x00, "Mode" )
+ PORT_CONFSETTING( 0x08, "K" ) // constant
+ PORT_CONFSETTING( 0x00, "C" ) // chain
+
+ PORT_START("IN.7") // R12
+ PORT_CONFNAME( 0x01, 0x00, "Decimal" )
+ PORT_CONFSETTING( 0x01, "S" ) // set DP with number key
+ PORT_CONFSETTING( 0x00, "R" )
+ PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+// config
+
+void ti5200_state::ti5200(machine_config &config)
+{
+ // basic machine hardware
+ TMS1270(config, m_maincpu, 350000); // approximation - RC osc. R=43K, C=68pF
+ m_maincpu->read_k().set(FUNC(ti5200_state::read_k));
+ m_maincpu->write_o().set(FUNC(ti5200_state::write_o));
+ m_maincpu->write_r().set(FUNC(ti5200_state::write_r));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(13, 9);
+ m_display->set_segmask(0xfff, 0xff);
+ config.set_default_layout(layout_ti5200);
+
+ // no sound!
+}
+
+// roms
+
+ROM_START( ti5200 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1278nl", 0x0000, 0x0400, CRC(6829f24d) SHA1(d7cf358a26a347d6a2ca4313cb7ffd5082e19885) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ti5200_micro.pla", 0, 867, CRC(61bd20fc) SHA1(fbdc87138975e2e10f92f75dcae5ca900f78475a) )
+ ROM_REGION( 406, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1070_ti5200_output.pla", 0, 406, CRC(6f37c393) SHA1(5252a5ac05c65326ee189f859904007e11b0009d) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
+
+ Texas Instruments 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)
@@ -11801,13 +13652,9 @@ ROM_END
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)
+ See further below for TI Business Analyst and TI Programmer.
-***************************************************************************/
+*******************************************************************************/
class ti30_state : public hh_tms1k_state
{
@@ -11846,18 +13693,18 @@ u8 ti30_state::read_k()
return m_inputs[7]->read() | read_inputs(7);
}
-// config
+// inputs
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME(u8"yˣ")
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( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME(u8"EE\u2193") // U+2193 = ↓
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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")
@@ -11871,8 +13718,8 @@ static INPUT_PORTS_START( ti30 )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(u8"π")
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(")")
@@ -11899,84 +13746,79 @@ static INPUT_PORTS_START( ti30 )
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_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( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"\u221ax") // U+221A = √
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"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
-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")
+// config
- 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")
+void ti30_state::ti30(machine_config &config)
+{
+ // basic machine hardware
+ TMS0980(config, m_maincpu, 400000); // guessed
+ m_maincpu->read_k().set(FUNC(ti30_state::read_k));
+ m_maincpu->write_o().set(FUNC(ti30_state::write_o));
+ m_maincpu->write_r().set(FUNC(ti30_state::write_r));
+ m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off));
- 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")
+ // 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);
- 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")
+ // no sound!
+}
- 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")
+// roms
- 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("(")
+ROM_START( ti30 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) )
- 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("+/-")
+ 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
- // 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
+
+
+
+
+/*******************************************************************************
+
+ TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41
+ * TMS0980 MCU label TMC0982NL (die label: 0980B-82F)
+ * 9-digit 7seg LED display
+
+ It's on the same hardware as TI-30.
+
+*******************************************************************************/
+
+// class/handlers: uses the ones in ti30_state
+
+// inputs
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME(u8"yˣ ˣ\u221ay") // U+221A = √ - 2nd one implies xth root of y
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME(u8"% Δ%")
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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")
@@ -11990,15 +13832,15 @@ static INPUT_PORTS_START( tibusan )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(u8"Σ+ Σ-")
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( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME(u8"x\u2194y L.R.") // U+2194 = ↔
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME(u8"SUM xʹ")
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")
@@ -12012,54 +13854,22 @@ static INPUT_PORTS_START( tibusan )
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( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME(u8"EXC xʹ")
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_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( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x² \u221ax") // U+221A = √
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME(u8"ln(x) eˣ")
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->read_k().set(FUNC(ti30_state::read_k));
- m_maincpu->write_o().set(FUNC(ti30_state::write_o));
- m_maincpu->write_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) )
@@ -12074,16 +13884,95 @@ ROM_START( tibusan )
ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
ROM_END
+
+
+
+
+/*******************************************************************************
+
+ TI Programmer
+ * TMS0980 MCU label ZA0675NL, JP0983AT (die label: 0980B-83)
+ * 9-digit 7seg LED display
+
+ Like TI Business Analyst, it's on the same hardware as TI-30.
+
+*******************************************************************************/
+
+// class/handlers: uses the ones in ti30_state
+
+// inputs
+
+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(u8"×")
+ 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(u8"÷")
+ 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
+
+// roms
+
ROM_START( tiprog )
ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983
+ ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) )
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_LOAD( "tms0980_tiprog_output.pla", 0, 352, CRC(125c4ee6) SHA1(b8d865c42fd37c3d9b92c5edbecfc831be558597) )
ROM_REGION( 157, "maincpu:spla", 0 )
ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
ROM_END
@@ -12092,16 +13981,16 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI-1000 (1977 version)
+ Texas Instruments TI-1000 (1977 version)
* TMS1990 MCU label TMC1991NL (die label: 1991-91A)
* 8-digit 7seg LED display
- TI-1000 (1978 version)
+ Texas Instruments TI-1000 (1978 version)
* TMS1990 MCU label TMC1992-4NL **not dumped yet
-***************************************************************************/
+*******************************************************************************/
class ti1000_state : public hh_tms1k_state
{
@@ -12128,9 +14017,9 @@ void ti1000_state::write_r(u32 data)
void ti1000_state::write_o(u16 data)
{
- // O0-O3,O5(?): input mux
+ // O0-O2,O4,O5: input mux
// O0-O7: digit segments
- m_inp_mux = (data & 0xf) | (data >> 1 & 0x10);
+ m_inp_mux = (data & 7) | (data >> 1 & 0x18);
m_o = bitswap<8>(data,7,4,3,2,1,0,6,5);
}
@@ -12140,7 +14029,7 @@ u8 ti1000_state::read_k()
return read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( ti1000 )
PORT_START("IN.0") // O0
@@ -12159,14 +14048,14 @@ static INPUT_PORTS_START( ti1000 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
// note: even though power buttons are on the matrix, they are not CPU-controlled
- PORT_START("IN.3") // O3 or O4?
+ PORT_START("IN.3") // 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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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)
@@ -12175,6 +14064,8 @@ static INPUT_PORTS_START( ti1000 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
INPUT_PORTS_END
+// config
+
void ti1000_state::ti1000(machine_config &config)
{
// basic machine hardware
@@ -12211,37 +14102,45 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI WIZ-A-TRON
- * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label: 0970F-07B)
+ Texas Instruments Little Professor (1976 version, rev. A)
+ * TMS0970 MCU label TMS0975NL ZA0356, AP (die label: 0970D-75A)
* 9-digit 7seg LED display(one custom digit)
-***************************************************************************/
+ Texas Instruments Little Professor (1976 version, rev. B)
+ * TMS0970 MCU label TMS0975NL ZA0356, BP (die label: 0970D-75B)
+
+ Texas Instruments Little Professor (1976 version, rev. C)
+ * TMS0970 MCU label TMS0975NL ZA0356, CSP/GP0975CS (die label: 0970D-75C)
-class wizatron_state : public hh_tms1k_state
+*******************************************************************************/
+
+class lilprofo_state : public hh_tms1k_state
{
public:
- wizatron_state(const machine_config &mconfig, device_type type, const char *tag) :
+ lilprofo_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
- void wizatron(machine_config &config);
+ void lilprofo(machine_config &config);
+ void lilprofoc(machine_config &config);
protected:
- virtual void write_o(u16 data);
- virtual void write_r(u32 data);
- virtual u8 read_k();
+ void write_o(u16 data);
+ void write_o7(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
};
// handlers
-void wizatron_state::write_r(u32 data)
+void lilprofo_state::write_r(u32 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
+ // (goes for both lilprof and wizatron) use a custom equals-sign digit here
// 6th digit is custom(not 7seg), for math symbols, like this:
// \./ GAB
@@ -12250,28 +14149,34 @@ void wizatron_state::write_r(u32 data)
m_display->matrix(data, m_o);
}
-void wizatron_state::write_o(u16 data)
+void lilprofo_state::write_o(u16 data)
{
- // O1-O4: input mux
+ // O1-O5: input mux
// O0-O6: digit segments A-G
- // O7: N/C
- m_inp_mux = data >> 1 & 0xf;
+ m_inp_mux = (data >> 1 & 0x1f);
m_o = data & 0x7f;
}
-u8 wizatron_state::read_k()
+void lilprofo_state::write_o7(u16 data)
+{
+ // level switch is on O7
+ write_o(data);
+ m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10);
+}
+
+u8 lilprofo_state::read_k()
{
// K: multiplexed inputs
- return read_inputs(4);
+ return read_inputs(5);
}
-// config
+// inputs
-static INPUT_PORTS_START( wizatron )
+static INPUT_PORTS_START( lilprofo )
PORT_START("IN.0") // O1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set")
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( 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("+")
PORT_START("IN.1") // O2
@@ -12284,131 +14189,133 @@ static INPUT_PORTS_START( wizatron )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
+
+ PORT_START("IN.4") // O5/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 wizatron_state::wizatron(machine_config &config)
+// config
+
+void lilprofo_state::lilprofo(machine_config &config)
{
// basic machine hardware
TMS0970(config, m_maincpu, 250000); // approximation
- m_maincpu->read_k().set(FUNC(wizatron_state::read_k));
- m_maincpu->write_o().set(FUNC(wizatron_state::write_o));
- m_maincpu->write_r().set(FUNC(wizatron_state::write_r));
+ m_maincpu->read_k().set(FUNC(lilprofo_state::read_k));
+ m_maincpu->write_o().set(FUNC(lilprofo_state::write_o));
+ m_maincpu->write_r().set(FUNC(lilprofo_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(0x1f7, 0x7f);
m_display->set_segmask(8, 0x41); // equals sign
- config.set_default_layout(layout_wizatron);
+ config.set_default_layout(layout_lilprof);
// no sound!
}
+void lilprofo_state::lilprofoc(machine_config &config)
+{
+ lilprofo(config);
+ m_maincpu->write_o().set(FUNC(lilprofo_state::write_o7));
+}
+
// roms
-ROM_START( wizatron )
+ROM_START( lilprofo )
ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) )
+ ROM_LOAD( "tms0975nl_za0356_csp", 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_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
+ ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) )
+ ROM_LOAD( "tms0980_lilprofo_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
+ROM_START( lilprofob )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms0975nl_za0356_bp", 0x0000, 0x0400, CRC(00c8357f) SHA1(32ab47e979e117bda889ab1c72c1c239cfa0f386) )
+ 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_lilprofo_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
+ROM_START( lilprofoa )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms0975nl_za0356_ap", 0x0000, 0x0400, CRC(ab77b595) SHA1(8ec5a00d9eb0780b9bb2937c4c023efb2470b287) )
+ 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_lilprofo_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 (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);
+ Texas Instruments WIZ-A-TRON
+ * TMS0970 MCU label TMC0907NL ZA0379 BSP, DP0907BS (die label: 0970F-07B)
+ * 9-digit 7seg LED display(one custom digit)
-private:
- virtual void write_o(u16 data) override;
- virtual u8 read_k() override;
-};
+ The hardware is nearly identical to Little Professor (1976 version). The same
+ ZA0379 BSP MCU (should be same ROM) was also used in TI Math Magic.
-// 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);
-}
+// class/handlers: uses the ones in lilprofo_state
-// config
+// inputs
-static INPUT_PORTS_START( lilprof )
- PORT_INCLUDE( wizatron )
+static INPUT_PORTS_START( wizatron )
+ PORT_INCLUDE( lilprofo )
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_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
- 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" )
+ PORT_MODIFY("IN.4")
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void lilprof_state::lilprof(machine_config &config)
-{
- wizatron(config);
-
- // basic machine hardware
- m_maincpu->read_k().set(FUNC(lilprof_state::read_k));
- m_maincpu->write_o().set(FUNC(lilprof_state::write_o));
-}
-
// roms
-ROM_START( lilprof )
+ROM_START( wizatron )
ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) )
+ ROM_LOAD( "tmc0907nl_za0379_bsp", 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_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
+ ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) )
+ 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
@@ -12417,25 +14324,25 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI Little Professor (1978 version)
+ Texas Instruments 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
+class lilprof_state : public hh_tms1k_state
{
public:
- lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) :
+ lilprof_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
- void lilprof78(machine_config &config);
+ void lilprof(machine_config &config);
private:
void write_o(u16 data);
@@ -12445,7 +14352,7 @@ private:
// handlers
-void lilprof78_state::write_r(u32 data)
+void lilprof_state::write_r(u32 data)
{
// update leds state
u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f;
@@ -12455,28 +14362,28 @@ void lilprof78_state::write_r(u32 data)
// 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)
+ // 6th digit is a custom 7seg for math symbols (see lilprofo_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)
+void lilprof_state::write_o(u16 data)
{
- // O0-O3,O5(?): input mux
+ // O0-O2,O4,O5: input mux
// O0-O6: digit segments A-G
// O7: 6th digit
- m_inp_mux = (data & 0xf) | (data >> 1 & 0x10);
+ m_inp_mux = (data & 7) | (data >> 1 & 0x18);
m_o = data;
}
-u8 lilprof78_state::read_k()
+u8 lilprof_state::read_k()
{
// K: multiplexed inputs
return read_inputs(5);
}
-// config
+// inputs
-static INPUT_PORTS_START( lilprof78 )
+static INPUT_PORTS_START( lilprof )
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")
@@ -12487,16 +14394,16 @@ static INPUT_PORTS_START( lilprof78 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
// note: even though power buttons are on the matrix, they are not CPU-controlled
- PORT_START("IN.3") // O3 or O4?
+ PORT_START("IN.3") // 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")
@@ -12509,25 +14416,27 @@ static INPUT_PORTS_START( lilprof78 )
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)
+// config
+
+void lilprof_state::lilprof(machine_config &config)
{
// basic machine hardware
TMS1990(config, m_maincpu, 250000); // approximation
- m_maincpu->read_k().set(FUNC(lilprof78_state::read_k));
- m_maincpu->write_o().set(FUNC(lilprof78_state::write_o));
- m_maincpu->write_r().set(FUNC(lilprof78_state::write_r));
+ m_maincpu->read_k().set(FUNC(lilprof_state::read_k));
+ m_maincpu->write_o().set(FUNC(lilprof_state::write_o));
+ m_maincpu->write_r().set(FUNC(lilprof_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);
+ config.set_default_layout(layout_lilprof);
// no sound!
}
// roms
-ROM_START( lilprof78 )
+ROM_START( lilprof )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) )
@@ -12536,7 +14445,7 @@ ROM_START( lilprof78 )
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_LOAD( "tms0980_lilprof_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
@@ -12545,9 +14454,9 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI-1680, TI-2550-IV
+ Texas Instruments TI-1680, TI-2550-IV
* TMS1980 MCU label TMC1981NL (die label: 1980A 81F)
* TMC0999NL 256x4 RAM (die label: 0999B)
* 9-digit cyan VFD(leftmost digit is custom)
@@ -12555,7 +14464,7 @@ ROM_END
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
{
@@ -12570,10 +14479,10 @@ public:
private:
required_device<tmc0999_device> m_ram;
- virtual void update_display();
- virtual void write_o(u16 data);
- virtual void write_r(u32 data);
- virtual u8 read_k();
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
};
// handlers
@@ -12615,7 +14524,7 @@ u8 ti1680_state::read_k()
return read_inputs(6) | m_ram->do_r();
}
-// config
+// inputs
static INPUT_PORTS_START( ti1680 )
PORT_START("IN.0") // R3
@@ -12628,13 +14537,13 @@ static INPUT_PORTS_START( ti1680 )
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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")
@@ -12655,6 +14564,8 @@ static INPUT_PORTS_START( ti1680 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
INPUT_PORTS_END
+// config
+
void ti1680_state::ti1680(machine_config &config)
{
// basic machine hardware
@@ -12692,13 +14603,13 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI DataMan
+ Texas Instruments DataMan
* TMS1980 MCU label TMC1982NL (die label: 1980A 82B)
* 10-digit cyan VFD(3 digits are custom)
-***************************************************************************/
+*******************************************************************************/
class dataman_state : public hh_tms1k_state
{
@@ -12710,10 +14621,10 @@ public:
void dataman(machine_config &config);
protected:
- virtual void update_display();
- virtual void write_o(u16 data);
- virtual void write_r(u32 data);
- virtual u8 read_k();
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u32 data);
+ u8 read_k();
};
// handlers
@@ -12746,7 +14657,7 @@ u8 dataman_state::read_k()
return m_inputs[5]->read() | read_inputs(5);
}
-// config
+// inputs
static INPUT_PORTS_START( dataman )
PORT_START("IN.0") // R0
@@ -12768,25 +14679,27 @@ static INPUT_PORTS_START( dataman )
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
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( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
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_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
+// config
+
void dataman_state::dataman(machine_config &config)
{
// basic machine hardware
@@ -12822,15 +14735,15 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
- TI Math Marvel
+ Texas Instruments Math Marvel
* TMS1980 MCU label TMC1986A-NL (die label: 1980A 86A)
* 9-digit cyan VFD(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
{
@@ -12840,23 +14753,11 @@ public:
{ }
void mathmarv(machine_config &config);
-
-private:
- virtual void write_r(u32 data) override;
};
-// handlers
-
-void mathmarv_state::write_r(u32 data)
-{
- // R8: speaker out
- m_speaker->level_w(data >> 8 & 1);
+// handlers: uses the ones in dataman_state
- // rest is same as dataman
- dataman_state::write_r(data);
-}
-
-// config
+// inputs
static INPUT_PORTS_START( mathmarv )
PORT_INCLUDE( dataman )
@@ -12866,18 +14767,20 @@ static INPUT_PORTS_START( mathmarv )
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_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
+// config
+
void mathmarv_state::mathmarv(machine_config &config)
{
dataman(config);
// basic machine hardware
- m_maincpu->write_r().set(FUNC(mathmarv_state::write_r));
+ m_maincpu->write_r().append(m_speaker, FUNC(speaker_sound_device::level_w)).bit(8);
config.set_default_layout(layout_mathmarv);
@@ -12904,7 +14807,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Texas Instruments maze game (unreleased, from patent GB2040172A)
* TMS1000 (development version)
@@ -12919,7 +14822,7 @@ ROM_END
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
{
@@ -12956,7 +14859,7 @@ u8 timaze_state::read_k()
return read_inputs(1);
}
-// config
+// inputs
static INPUT_PORTS_START( timaze )
PORT_START("IN.0") // R0
@@ -12966,6 +14869,8 @@ static INPUT_PORTS_START( timaze )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
INPUT_PORTS_END
+// config
+
void timaze_state::timaze(machine_config &config)
{
// basic machine hardware
@@ -12998,7 +14903,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Texas Instruments Electronic Digital Thermostat
* TMS0970 MCU, label TMS0970NLL TMC0910B (die label: 0970F-10E)
@@ -13008,20 +14913,20 @@ ROM_END
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")
+ m_ac_power(*this, "ac_power")
{ }
void tithermos(machine_config &config);
private:
- required_device<clock_device> m_60hz;
+ required_device<clock_device> m_ac_power;
void write_r(u32 data);
void write_o(u16 data);
@@ -13055,16 +14960,16 @@ u8 tithermos_state::read_k()
// when SB/SD/SP is high:
if (m_inp_mux & 0x8a)
{
- // K1: 60hz from AC line
+ // K1: 60hz from AC power
// K2: battery low?
// K8: A/D output (TODO)
- data |= (m_60hz->signal_r()) ? 1 : 0;
+ data |= m_ac_power->signal_r() ? 1 : 0;
}
return data;
}
-// config
+// inputs
static INPUT_PORTS_START( tithermos )
PORT_START("IN.0") // SA
@@ -13083,7 +14988,7 @@ static INPUT_PORTS_START( tithermos )
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_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC power osc
PORT_CONFNAME( 0x06, 0x04, "System")
PORT_CONFSETTING( 0x04, "Heat" )
PORT_CONFSETTING( 0x00, "Off" )
@@ -13109,7 +15014,7 @@ static INPUT_PORTS_START( tithermos )
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_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC power osc
PORT_CONFNAME( 0x06, 0x04, "Mode")
PORT_CONFSETTING( 0x04, "Constant" )
PORT_CONFSETTING( 0x00, "Day/Night" )
@@ -13122,6 +15027,8 @@ static INPUT_PORTS_START( tithermos )
PORT_CONFSETTING( 0x01, "Auto" ) // same output as heat/cool
INPUT_PORTS_END
+// config
+
void tithermos_state::tithermos(machine_config &config)
{
// basic machine hardware
@@ -13130,7 +15037,7 @@ void tithermos_state::tithermos(machine_config &config)
m_maincpu->write_r().set(FUNC(tithermos_state::write_r));
m_maincpu->write_o().set(FUNC(tithermos_state::write_o));
- CLOCK(config, "ac_line", 60);
+ CLOCK(config, m_ac_power, 60); // from mains power
// video hardware
PWM_DISPLAY(config, m_display).set_size(4, 7);
@@ -13160,7 +15067,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Sub Wars (model 7-490)
* PCB label: CSG201A(main), CSG201B(leds)
@@ -13172,7 +15079,7 @@ ROM_END
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
{
@@ -13214,7 +15121,7 @@ void subwars_state::write_o(u16 data)
m_speaker->level_w(BIT(data, 7));
}
-// config
+// inputs
static INPUT_PORTS_START( subwars )
PORT_START("IN.0")
@@ -13224,6 +15131,8 @@ static INPUT_PORTS_START( subwars )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void subwars_state::subwars(machine_config &config)
{
// basic machine hardware
@@ -13259,7 +15168,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A)
* TMS1100 MP1215 (die label: 1100B, MP1215)
@@ -13277,7 +15186,7 @@ ROM_END
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
{
@@ -13292,8 +15201,8 @@ protected:
virtual void machine_start() override;
private:
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
u8 m_notch = 0; // cartridge K1/K2
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void update_display();
void write_r(u32 data);
@@ -13314,16 +15223,13 @@ void playmaker_state::machine_start()
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;
- }
+ return std::make_pair(image_error::UNSUPPORTED, "Can only load through software list");
// get cartridge notch
const char *notch = image.get_feature("notch");
m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0;
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}
void playmaker_state::update_display()
@@ -13358,7 +15264,7 @@ u8 playmaker_state::read_k()
return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0);
}
-// config
+// inputs
static INPUT_PORTS_START( playmaker )
PORT_START("IN.0") // R0
@@ -13380,6 +15286,8 @@ static INPUT_PORTS_START( playmaker )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill")
INPUT_PORTS_END
+// config
+
void playmaker_state::playmaker(machine_config &config)
{
// basic machine hardware
@@ -13423,7 +15331,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Deluxe Football with Instant Replay (model 7-550)
* TMS1400NLL MP7302 (die label: TMS1400, MP7302, 28L 01D D000 R000)
@@ -13436,7 +15344,7 @@ ROM_END
Booting the handheld with the Score and Replay buttons held down will
initiate a halftime show.
-***************************************************************************/
+*******************************************************************************/
class dxfootb_state : public hh_tms1k_state
{
@@ -13491,7 +15399,7 @@ u8 dxfootb_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( dxfootb )
PORT_START("IN.0") // R3
@@ -13518,6 +15426,8 @@ static INPUT_PORTS_START( dxfootb )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
INPUT_PORTS_END
+// config
+
void dxfootb_state::dxfootb(machine_config &config)
{
// basic machine hardware
@@ -13555,7 +15465,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Electronics Copy Cat (model 7-520)
* PCB label: CC REV B
@@ -13567,7 +15477,7 @@ ROM_END
- USA(1): Follow Me, published by Sears
- USA(2): Electronic Repeat, published by Tandy
-***************************************************************************/
+*******************************************************************************/
class copycat_state : public hh_tms1k_state
{
@@ -13609,7 +15519,7 @@ u8 copycat_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( copycat )
PORT_START("IN.0") // R4
@@ -13639,6 +15549,8 @@ static INPUT_PORTS_START( copycat )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void copycat_state::copycat(machine_config &config)
{
// basic machine hardware
@@ -13675,7 +15587,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Electronics Copy Cat (model 7-522)
* PCB label: WS 8107-1
@@ -13691,16 +15603,16 @@ ROM_END
- 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
+class copycata_state : public hh_tms1k_state
{
public:
- copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ copycata_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
- void copycatm2(machine_config &config);
+ void copycata(machine_config &config);
private:
void write_r(u32 data);
@@ -13709,21 +15621,21 @@ private:
// handlers
-void copycatm2_state::write_r(u32 data)
+void copycata_state::write_r(u32 data)
{
// R1-R4: leds
m_display->matrix(1, data >> 1 & 0xf);
}
-void copycatm2_state::write_o(u16 data)
+void copycata_state::write_o(u16 data)
{
// O0,O6: speaker out
m_speaker->level_w((data & 1) | (data >> 5 & 2));
}
-// config
+// inputs
-static INPUT_PORTS_START( copycatm2 )
+static INPUT_PORTS_START( copycata )
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")
@@ -13731,17 +15643,19 @@ static INPUT_PORTS_START( copycatm2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button")
INPUT_PORTS_END
-void copycatm2_state::copycatm2(machine_config &config)
+// config
+
+void copycata_state::copycata(machine_config &config)
{
// basic machine hardware
TMS1730(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF
m_maincpu->read_k().set_ioport("IN.0");
- m_maincpu->write_r().set(FUNC(copycatm2_state::write_r));
- m_maincpu->write_o().set(FUNC(copycatm2_state::write_o));
+ m_maincpu->write_r().set(FUNC(copycata_state::write_r));
+ m_maincpu->write_o().set(FUNC(copycata_state::write_o));
// video hardware
PWM_DISPLAY(config, m_display).set_size(1, 4);
- config.set_default_layout(layout_copycatm2);
+ config.set_default_layout(layout_copycata);
// sound hardware
SPEAKER(config, "mono").front_center();
@@ -13753,21 +15667,21 @@ void copycatm2_state::copycatm2(machine_config &config)
// roms
-ROM_START( copycatm2 )
+ROM_START( copycata )
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_LOAD( "tms1000_copycata_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_LOAD( "tms1000_copycata_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) )
ROM_END
-/***************************************************************************
+/*******************************************************************************
Tiger Ditto (model 7-530)
* TMS1700 MCU, label MP1801-N2LL (die label: 1700, MP1801)
@@ -13778,7 +15692,7 @@ ROM_END
- 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
{
@@ -13808,7 +15722,7 @@ void ditto_state::write_o(u16 data)
m_speaker->level_w(data >> 5 & 3);
}
-// config
+// inputs
static INPUT_PORTS_START( ditto )
PORT_START("IN.0")
@@ -13818,6 +15732,8 @@ static INPUT_PORTS_START( ditto )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Red Button")
INPUT_PORTS_END
+// config
+
void ditto_state::ditto(machine_config &config)
{
// basic machine hardware
@@ -13854,7 +15770,136 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Tiger Finger Bowl (model 7-545)
+ * TMS1100 MP1288 (no decap)
+ * 3 7seg LEDs, 1-bit sound
+
+ It's a track & field electronic board game, played by sliding or tapping
+ your finger. Instructions on how to play the events are written on the
+ device itself. 5 hurdles were included, though they're not essential.
+
+*******************************************************************************/
+
+class fingbowl_state : public hh_tms1k_state
+{
+public:
+ fingbowl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void fingbowl(machine_config &config);
+
+private:
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void fingbowl_state::update_display()
+{
+ m_display->matrix(m_r, m_o);
+}
+
+void fingbowl_state::write_r(u32 data)
+{
+ // R8: speaker out
+ m_speaker->level_w(BIT(data, 8));
+
+ // R4-R7: input mux
+ m_inp_mux = data >> 4 & 0xf;
+
+ // R0-R2: digit select
+ m_r = data;
+ update_display();
+}
+
+void fingbowl_state::write_o(u16 data)
+{
+ // O0-O6: led data
+ m_o = data;
+ update_display();
+}
+
+u8 fingbowl_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(4);
+}
+
+// inputs
+
+static INPUT_PORTS_START( fingbowl )
+ PORT_START("IN.0") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+
+ PORT_START("IN.1") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 )
+
+ PORT_START("IN.2") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON12 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON11 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON10 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON9 )
+
+ PORT_START("IN.3") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON16 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON15 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON14 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON13 )
+INPUT_PORTS_END
+
+// config
+
+void fingbowl_state::fingbowl(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 250000); // approximation - RC osc. R=68K, C=47pF
+ m_maincpu->read_k().set(FUNC(fingbowl_state::read_k));
+ m_maincpu->write_r().set(FUNC(fingbowl_state::write_r));
+ m_maincpu->write_o().set(FUNC(fingbowl_state::write_o));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(3, 7);
+ m_display->set_segmask(7, 0x7f);
+ config.set_default_layout(layout_fingbowl);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( fingbowl )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1288", 0x0000, 0x0800, CRC(8eb489ad) SHA1(65efe9fb25f6a5e0a1319558388d84053e003e93) )
+
+ 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_fingbowl_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_fingbowl_output.bin", 0, 0x20, CRC(b84a8afb) SHA1(777c06c1ebb7884a268385b0f9d6d064400ff757) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
Tiger 7 in 1 Sports Stadium (model 7-555)
* TMS1400 MP7304 (die label: TMS1400, MP7304A, 28L 01D D000 R300)
@@ -13868,7 +15913,7 @@ ROM_END
- World: 7 in 1 Sports Stadium, published by Tiger
- USA: 7 in 1 Sports, published by Sears
-***************************************************************************/
+*******************************************************************************/
class t7in1ss_state : public hh_tms1k_state
{
@@ -13920,7 +15965,7 @@ u8 t7in1ss_state::read_k()
return read_inputs(4);
}
-// config
+// inputs
static INPUT_PORTS_START( t7in1ss )
PORT_START("IN.0") // R0
@@ -13949,6 +15994,8 @@ static INPUT_PORTS_START( t7in1ss )
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void t7in1ss_state::t7in1ss(machine_config &config)
{
// basic machine hardware
@@ -13985,9 +16032,153 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ Tomy Volleyball
+ * TMS1000 MP0159 TOMY VOLLEY (die label: 1000B, MP0159)
+ * 2 7seg LEDs, 14 other LEDs, 1-bit sound
+
+*******************************************************************************/
+
+class tmvolleyb_state : public hh_tms1k_state
+{
+public:
+ tmvolleyb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void tmvolleyb(machine_config &config);
+
+private:
+ void update_display();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void tmvolleyb_state::update_display()
+{
+ // O7 goes to left digit segments B/C
+ m_display->matrix_partial(0, 1, BIT(m_r, 4), BIT(m_o, 7) * 6);
+ m_display->matrix_partial(1, 3, m_r >> 4, m_o);
+}
+
+void tmvolleyb_state::write_r(u32 data)
+{
+ // R0-R3,R7-R9: input mux
+ m_inp_mux = (data & 0xf) | (data >> 3 & 0x70);
+
+ // R4: digit select
+ // R5,R6: led select
+ m_r = data;
+ update_display();
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
+}
+
+void tmvolleyb_state::write_o(u16 data)
+{
+ // O0-O7: digit segment/led data
+ m_o = data;
+ update_display();
+}
+
+u8 tmvolleyb_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(7);
+}
+
+// inputs
+
+static INPUT_PORTS_START( tmvolleyb )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Score")
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Serve")
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Serve")
- Tomy(tronics) Break Up (manufactured in Japan)
+ PORT_START("IN.4") // R7
+ PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("IN.7", 0x01, EQUALS, 0x01) // Game 2
+ PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // R8
+ PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.7", 0x01, EQUALS, 0x00) // Game 1
+ PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.6") // R9
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) )
+ PORT_CONFSETTING( 0x08, "1" )
+ PORT_CONFSETTING( 0x00, "2" )
+
+ PORT_START("IN.7") // fake
+ PORT_CONFNAME( 0x01, 0x00, "Game" )
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x01, "2" )
+INPUT_PORTS_END
+
+// config
+
+void tmvolleyb_state::tmvolleyb(machine_config &config)
+{
+ // basic machine hardware
+ TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF
+ m_maincpu->read_k().set(FUNC(tmvolleyb_state::read_k));
+ m_maincpu->write_r().set(FUNC(tmvolleyb_state::write_r));
+ m_maincpu->write_o().set(FUNC(tmvolleyb_state::write_o));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(4, 8);
+ m_display->set_segmask(3, 0x7f);
+ config.set_default_layout(layout_tmvolleyb);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( tmvolleyb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0159_tomy_volley", 0x0000, 0x0400, CRC(0088b0cc) SHA1(90f222d6a3bef7b27709ef2816c15867921a8d4c) )
+
+ 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_tmvolleyb_output.pla", 0, 365, CRC(01af7efd) SHA1(d90656a7884b37c7fd49989f8d38dd376b74557b) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
+
+ Tomy Break Up (manufactured in Japan)
* PCB label: TOMY B.O.
* TMS1040 MP2726 TOMY WIPE (die label: 1040B, MP2726A)
* TMS1025N2LL I/O expander
@@ -14018,7 +16209,7 @@ ROM_END
8.* 13.*
10.* 12.*
-***************************************************************************/
+*******************************************************************************/
class tbreakup_state : public hh_tms1k_state
{
@@ -14030,18 +16221,17 @@ public:
void tbreakup(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
protected:
- virtual void machine_reset() override;
virtual void machine_start() override;
private:
required_device<tms1025_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(u32 data);
void write_o(u16 data);
@@ -14054,18 +16244,12 @@ void tbreakup_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()
+INPUT_CHANGED_MEMBER(tbreakup_state::skill_switch)
{
// 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);
+ m_maincpu->set_unscaled_clock((newval & 1) ? 500000 : 325000);
}
void tbreakup_state::update_display()
@@ -14122,7 +16306,7 @@ u8 tbreakup_state::read_k()
return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8);
}
-// config
+// inputs
static INPUT_PORTS_START( tbreakup )
PORT_START("IN.0") // R7 K8
@@ -14136,16 +16320,18 @@ static INPUT_PORTS_START( tbreakup )
PORT_CONFSETTING( 0x00, "3" )
PORT_CONFSETTING( 0x04, "5" )
- PORT_START("IN.3") // fake
+ PORT_START("CPU") // 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" )
+ PORT_CONFSETTING( 0x00, "1" ) // PRO 1
+ PORT_CONFSETTING( 0x01, "2" ) // PRO 2
INPUT_PORTS_END
+// config
+
void tbreakup_state::tbreakup(machine_config &config)
{
// basic machine hardware
- TMS1040(config, m_maincpu, 325000); // see set_clock
+ TMS1040(config, m_maincpu, 325000); // see skill_switch
m_maincpu->read_k().set(FUNC(tbreakup_state::read_k));
m_maincpu->write_r().set(FUNC(tbreakup_state::write_r));
m_maincpu->write_o().set(FUNC(tbreakup_state::write_o));
@@ -14174,7 +16360,7 @@ void tbreakup_state::tbreakup(machine_config &config)
ROM_START( tbreakup )
ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) )
+ ROM_LOAD( "mp2726_tomy_wipe", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
@@ -14186,7 +16372,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tomy Power House Pinball
* PCB label: TOMY P-B
@@ -14213,7 +16399,7 @@ ROM_END
NOTE!: MAME external artwork is required
-***************************************************************************/
+*******************************************************************************/
class phpball_state : public hh_tms1k_state
{
@@ -14271,19 +16457,21 @@ u8 phpball_state::read_k()
return m_inputs[1]->read() | read_inputs(1);
}
-// config
+// inputs
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_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
+// config
+
void phpball_state::phpball(machine_config &config)
{
// basic machine hardware
@@ -14307,7 +16495,7 @@ void phpball_state::phpball(machine_config &config)
ROM_START( phpball )
ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) )
+ ROM_LOAD( "mp1180_tomy_pinb", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
@@ -14319,7 +16507,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Tsukuda The Dracula
* PCB label: TOFL-001A / B
@@ -14331,7 +16519,7 @@ ROM_END
- Japan: The Dracula, published by Tsukuda
- France: Dracula/The Dracula, published by Euro Toy
-***************************************************************************/
+*******************************************************************************/
class tdracula_state : public hh_tms1k_state
{
@@ -14384,7 +16572,7 @@ u8 tdracula_state::read_k()
return read_inputs(2);
}
-// config
+// inputs
static INPUT_PORTS_START( tdracula )
PORT_START("IN.0") // R20
@@ -14404,6 +16592,8 @@ static INPUT_PORTS_START( tdracula )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
INPUT_PORTS_END
+// config
+
void tdracula_state::tdracula(machine_config &config)
{
// basic machine hardware
@@ -14436,17 +16626,17 @@ ROM_START( tdracula )
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_tdracula_output.pla", 0, 557, CRC(54408672) SHA1(8fdc6910a27c22c1df2cadeb25c74118d5774481) )
+ ROM_LOAD( "tms1400_tdracula_output.pla", 0, 557, CRC(52e2258e) SHA1(3dcbef72d2309aeb2375041522acd1a879b9e881) )
- ROM_REGION( 416612, "screen", 0)
- ROM_LOAD( "tdracula.svg", 0, 416612, CRC(b4e723dc) SHA1(7d90aa92755727fc21f3b2913cd5d86f8594ea20) )
+ ROM_REGION( 417508, "screen", 0)
+ ROM_LOAD( "tdracula.svg", 0, 417508, CRC(4f093a2f) SHA1(2c0f9a18720ff1e694b267274967a60115fa2593) )
ROM_END
-/***************************************************************************
+/*******************************************************************************
Tsukuda Slot Elepachi 「スロットエレパチ」
* PCB label: TOFL003
@@ -14458,7 +16648,7 @@ ROM_END
and one with a blue trigger button and red slot button. The game itself is
assumed to be the same.
-***************************************************************************/
+*******************************************************************************/
class slepachi_state : public hh_tms1k_state
{
@@ -14472,11 +16662,12 @@ public:
private:
required_device<tms1024_device> m_expander;
+
void expander_w(offs_t offset, u8 data);
void update_display();
- virtual void write_r(u32 data);
- virtual void write_o(u16 data);
+ void write_r(u32 data);
+ void write_o(u16 data);
};
// handlers
@@ -14519,7 +16710,7 @@ void slepachi_state::write_o(u16 data)
update_display();
}
-// config
+// inputs
static INPUT_PORTS_START( slepachi )
PORT_START("IN.0") // K
@@ -14537,6 +16728,8 @@ static INPUT_PORTS_START( slepachi )
PORT_CONFSETTING( 0x08, "2" )
INPUT_PORTS_END
+// config
+
void slepachi_state::slepachi(machine_config &config)
{
// basic machine hardware
@@ -14585,11 +16778,172 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
+
+ U.S. Games Space Cruiser (model TF2)
+ * PCB label: TF2
+ * TMS1100 MP1209 (no decap)
+ * 4 7seg LEDs, 40+2 other LEDs, 1-bit sound
+
+ It's a 2-in-1 handheld, Strategy Football and Space Game. MAME external
+ artwork is recommended for the switchable overlays.
+
+ known releases:
+ - USA(1): Space Cruiser, published by U.S. Games
+ - USA(2): Pro-Action Strategy Football, published by Calfax / Caprice
+
+*******************************************************************************/
+
+class scruiser_state : public hh_tms1k_state
+{
+public:
+ scruiser_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void scruiser(machine_config &config);
+
+private:
+ void update_display();
+ void update_input();
+ void write_r(u32 data);
+ void write_o(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void scruiser_state::update_display()
+{
+ m_display->matrix(m_r, m_o | (m_r & 0x300));
+}
+
+void scruiser_state::update_input()
+{
+ // switches from O7+R7
+ m_inp_mux = (m_r & 0xf) | (BIT(m_o, 7) << ((BIT(m_r, 7)) + 4));
+}
+
+void scruiser_state::write_r(u32 data)
+{
+ // R0-R3: 7seg select
+ // R4-R7: led select
+ // R8,R9: led data
+ m_r = data;
+ update_display();
+
+ // R0-R3,R7: input mux
+ update_input();
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
+}
+
+void scruiser_state::write_o(u16 data)
+{
+ // O0-O7: led data
+ m_o = data;
+ update_display();
+
+ // O7: select switches
+ update_input();
+}
+
+u8 scruiser_state::read_k()
+{
+ // K: multiplexed inputs
+ return read_inputs(6);
+}
+
+// inputs
+
+static INPUT_PORTS_START( scruiser )
+ PORT_START("IN.0") // R0
+ 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.1") // R1
+ 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.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Info")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Kick")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 QB / WB")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass")
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Info")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 QB / WB")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass")
+
+ PORT_START("IN.4") // O7+!R7
+ PORT_CONFNAME( 0x02, 0x02, "Game Select" )
+ PORT_CONFSETTING( 0x02, "Space" )
+ PORT_CONFSETTING( 0x00, "Football" )
+ PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // O7+R7
+ PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) )
+ PORT_CONFSETTING( 0x04, "1" )
+ PORT_CONFSETTING( 0x00, "2" )
+ PORT_CONFNAME( 0x08, 0x00, "Speed" )
+ PORT_CONFSETTING( 0x08, "Fast" ) // F
+ PORT_CONFSETTING( 0x00, "Slow" ) // S
+INPUT_PORTS_END
+
+// config
+
+void scruiser_state::scruiser(machine_config &config)
+{
+ // basic machine hardware
+ TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF
+ m_maincpu->read_k().set(FUNC(scruiser_state::read_k));
+ m_maincpu->write_r().set(FUNC(scruiser_state::write_r));
+ m_maincpu->write_o().set(FUNC(scruiser_state::write_o));
+
+ // video hardware
+ PWM_DISPLAY(config, m_display).set_size(8, 10);
+ m_display->set_segmask(0xf, 0x7f);
+ m_display->set_bri_levels(0.0075, 0.075); // offense leds are brighter
+ config.set_default_layout(layout_scruiser);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( scruiser )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1209", 0x0000, 0x0800, CRC(a0280de4) SHA1(52beb30d8a5e4c85433db5722024f4011a07345b) )
+
+ 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_scruiser_output.pla", 0, 365, NO_DUMP )
+
+ ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump
+ ROM_LOAD16_BYTE( "tms1100_scruiser_output.bin", 0, 0x20, CRC(cd6f162f) SHA1(3348edb697e996b5ab82be54076b9cd444e0f2b1) )
+ROM_END
+
+
+
+
+
+/*******************************************************************************
- U.S. Games Super Sports-4
+ U.S. Games Super Sports-4 (model TH42)
* TMS1100 MP1219 (no decap)
- * 4 7seg LEDs, 49 other LEDs, 1-bit sound
+ * 4 7seg LEDs, 47+2 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
@@ -14598,7 +16952,7 @@ ROM_END
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
{
@@ -14611,6 +16965,7 @@ public:
private:
void update_display();
+ void update_input();
void write_r(u32 data);
void write_o(u16 data);
u8 read_k();
@@ -14620,19 +16975,28 @@ private:
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(u32 data)
+void ssports4_state::update_input()
{
- // R10: speaker out
- m_speaker->level_w(data >> 10 & 1);
+ // switches from O7+R5
+ m_inp_mux = (m_r & 3) | (m_r >> 6 & 0xc) | (BIT(m_o, 7) << ((BIT(m_r, 5)) + 4));
+}
- // R0-R9: led select/data
- // R0,R1 and R8,R9 are 7segs
+void ssports4_state::write_r(u32 data)
+{
+ // R0,R1,R8,R9: 7seg select
+ // R3-R7: led select
+ // R2: led data
m_r = data;
update_display();
+
+ // R0,R1,R5,R8,R9: input mux
+ update_input();
+
+ // R10: speaker out
+ m_speaker->level_w(BIT(data, 10));
}
void ssports4_state::write_o(u16 data)
@@ -14640,16 +17004,18 @@ void ssports4_state::write_o(u16 data)
// O0-O7: led data
m_o = data;
update_display();
+
+ // O7: select switches
+ update_input();
}
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);
+ // K: multiplexed inputs
return read_inputs(6);
}
-// config
+// inputs
static INPUT_PORTS_START( ssports4 )
PORT_START("IN.0") // R0
@@ -14664,36 +17030,38 @@ static INPUT_PORTS_START( ssports4 )
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.2") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Up-Left / Kick")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Up-Right / Info")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pass")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) 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.3") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Up-Left / Kick")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Up-Right / Info")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pass")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 O.P.")
- PORT_START("IN.5") // O7
+ PORT_START("IN.4") // O7+!R5
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 )
+
+ PORT_START("IN.5") // O7+R5
+ PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x04, 0x00, "Speed" )
+ PORT_CONFSETTING( 0x04, "High" ) // HI
+ PORT_CONFSETTING( 0x00, "Low" ) // LO
+ PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) )
+ PORT_CONFSETTING( 0x08, "1" )
+ PORT_CONFSETTING( 0x00, "2" )
INPUT_PORTS_END
+// config
+
void ssports4_state::ssports4(machine_config &config)
{
// basic machine hardware
@@ -14733,7 +17101,7 @@ ROM_END
-/***************************************************************************
+/*******************************************************************************
Vulcan XL 25
* TMS1000SLC MP4486A (die label: 1000C/, MP4486A)
@@ -14742,7 +17110,7 @@ ROM_END
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
{
@@ -14814,7 +17182,7 @@ u8 xl25_state::read_k()
return read_inputs(10);
}
-// config
+// inputs
static INPUT_PORTS_START( xl25 )
PORT_START("IN.0") // R0
@@ -14878,10 +17246,12 @@ static INPUT_PORTS_START( xl25 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+// config
+
void xl25_state::xl25(machine_config &config)
{
// basic machine hardware
- TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=5.6K, C=47pF
+ TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF
m_maincpu->read_k().set(FUNC(xl25_state::read_k));
m_maincpu->write_r().set(FUNC(xl25_state::write_r));
m_maincpu->write_o().set(FUNC(xl25_state::write_o));
@@ -14912,150 +17282,167 @@ 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 )
-
-SYST( 1977, cchime, 0, 0, cchime, cchime, cchime_state, empty_init, "Chromatronics", "Chroma-Chime", MACHINE_SUPPORTS_SAVE )
-
-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 )
-
-COMP( 1978, mrmusical, 0, 0, mrmusical, mrmusical, mrmusical_state, empty_init, "Concept 2000", "Mr. Mus-I-Cal", MACHINE_SUPPORTS_SAVE )
-
-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( 1981, 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", 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( 1982, tdracula, 0, 0, tdracula, tdracula, tdracula_state, empty_init, "Tsukuda", "The Dracula (Tsukuda)", MACHINE_SUPPORTS_SAVE )
-CONS( 1983, slepachi, 0, 0, slepachi, slepachi, slepachi_state, empty_init, "Tsukuda", "Slot Elepachi", MACHINE_SUPPORTS_SAVE )
-
-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 )
+*******************************************************************************/
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+SYST( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+
+SYST( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // ***
+SYST( 1980, racetime, 0, 0, racetime, racetime, racetime_state, empty_init, "Bandai", "Race Time", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE )
+SYST( 1982, uboat, 0, 0, uboat, uboat, uboat_state, empty_init, "Bandai", "U-Boat", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8 (Multi 8)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+
+SYST( 1977, cchime, 0, 0, cchime, cchime, cchime_state, empty_init, "Chromatronics", "Chroma-Chime", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // ***
+SYST( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac: The Astrology Computer", MACHINE_SUPPORTS_SAVE )
+SYST( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // ***
+SYST( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+
+SYST( 1978, litelrn, 0, 0, litelrn, litelrn, litelrn_state, empty_init, "Concept 2000", "Lite 'n Learn: Electronic Organ", MACHINE_SUPPORTS_SAVE )
+SYST( 1978, mrmusical, 0, 0, mrmusical, mrmusical, mrmusical_state, empty_init, "Concept 2000", "Mr. Mus-I-Cal", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, ebball2, 0, 0, ebball2, ebball2, ebball2_state, empty_init, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, ebball3, 0, 0, ebball3, ebball3, ebball3_state, empty_init, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, esbattle, 0, 0, esbattle, esbattle, esbattle_state, empty_init, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, blastit, 0, 0, blastit, blastit, blastit_state, empty_init, "Entex", "Blast It", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, einvader, 0, 0, einvader, einvader, einvader_state, empty_init, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, empty_init, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+
+SYST( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+
+SYST( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE )
+SYST( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // ***
+SYST( 1981, skywriter, 0, 0, skywriter, skywriter, skywriter_state, empty_init, "Ideal Toy Corporation", "Sky-Writer: The Electronic Message Sender", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_CONTROLS )
+
+SYST( 1978, starwlb, 0, 0, starwlb, starwlb, starwlb_state, empty_init, "Kenner", "Star Wars: Electronic Laser Battle Game", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game (patent)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+
+SYST( 1980, strobe, 0, 0, strobe, strobe, strobe_state, empty_init, "Lakeside", "Strobe", MACHINE_SUPPORTS_SAVE )
+
+SYST( 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 ) // ***
+
+SYST( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons: Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // ***
+
+SYST( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // ***
+SYST( 1978, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // ***
+SYST( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. A)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. F)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // ***
+SYST( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // ***
+SYST( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // ***
+
+SYST( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // ***
+SYST( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin: The Electronic Wizard", MACHINE_SUPPORTS_SAVE )
+SYST( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // ***
+SYST( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief: Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE ) // ***
+SYST( 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 ) // ***
+SYST( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot: Electronic Pool", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE )
+SYST( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE )
+SYST( 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 ) // ***
+
+SYST( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie: The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // ***
+
+SYST( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, comparc, 0, 0, comparc, comparc, comparc_state, empty_init, "Tandy Corporation", "Computerized Arcade (TMS1100 version, model 60-2159)", MACHINE_SUPPORTS_SAVE ) // some of the games: ***
+SYST( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1984, vclock3, 0, 0, vclock3, vclock3, vclock3_state, empty_init, "Tandy Corporation", "VoxClock 3", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1985, wtalker, 0, 0, wtalker, wtalker, wtalker_state, empty_init, "Technasonic", "Weight Talker", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS )
+
+SYST( 1976, speechp, 0, 0, speechp, speechp, speechp_state, empty_init, "Telesensory Systems, Inc.", "Speech+", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1975 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, ti1250a, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1975, ti25502, 0, 0, ti25502, ti25502, ti25502_state, empty_init, "Texas Instruments", "TI-2550 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, ti5200, 0, 0, ti5200, ti5200, ti5200_state, empty_init, "Texas Instruments", "TI-5200", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1978, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, lilprofoa, lilprof, 0, lilprofo, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, lilprofob, lilprof, 0, lilprofo, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1976, lilprofo, lilprof, 0, lilprofoc, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, wizatron, 0, 0, lilprofo, wizatron, lilprofo_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+SYST( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE )
+SYST( 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 )
+
+SYST( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE )
+SYST( 1989, copycata, copycat, 0, copycata, copycata, copycata_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE )
+SYST( 1981, fingbowl, 0, 0, fingbowl, fingbowl, fingbowl_state, empty_init, "Tiger Electronics", "Finger Bowl", MACHINE_SUPPORTS_SAVE ) // some of the games: ***
+SYST( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1979, tmvolleyb, 0, 0, tmvolleyb, tmvolleyb, tmvolleyb_state, empty_init, "Tomy", "Volleyball (Tomy)", MACHINE_SUPPORTS_SAVE )
+SYST( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE )
+SYST( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1982, tdracula, 0, 0, tdracula, tdracula, tdracula_state, empty_init, "Tsukuda", "The Dracula (Tsukuda)", MACHINE_SUPPORTS_SAVE )
+SYST( 1983, slepachi, 0, 0, slepachi, slepachi, slepachi_state, empty_init, "Tsukuda", "Slot Elepachi", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1980, scruiser, 0, 0, scruiser, scruiser, scruiser_state, empty_init, "U.S. Games Corporation", "Space Cruiser (U.S. Games)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+SYST( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games Corporation", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+
+SYST( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "Vulcan Electronics", "XL 25", 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.