summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-02-27 18:09:54 +0100
committer couriersud <couriersud@arcor.de>2015-02-27 18:09:54 +0100
commitdfbb61232cebe6f3e5a00c2d8b916874d8e99eac (patch)
tree5b9c9f68d830df959acd170da003d4d7e3312ee6
parent218c388088596393c94bcca6257993f65f904bd8 (diff)
parent7e79ecf59de0266f68d94489dd5266b495c89624 (diff)
Merge branch 'master' of https://github.com/mamedev/mame.git
-rw-r--r--src/build/makelist.py1
-rw-r--r--src/build/verinfo.py15
-rw-r--r--src/emu/drivers/xtal.h1
-rw-r--r--src/mame/drivers/neogeo.c14
-rw-r--r--src/mame/drivers/neogeo_noslot.c186
-rw-r--r--src/mame/drivers/opwolf.c5
-rw-r--r--src/mame/mame.lst1
-rw-r--r--src/mess/drivers/cnsector.c254
-rw-r--r--src/mess/drivers/elecdet.c313
-rw-r--r--src/mess/drivers/hh_tms1k.c1543
-rw-r--r--src/mess/drivers/hh_ucom4.c226
-rw-r--r--src/mess/drivers/mathmagi.c273
-rw-r--r--src/mess/drivers/merlin.c199
-rw-r--r--src/mess/drivers/splitsec.c363
-rw-r--r--src/mess/drivers/starwbc.c297
-rw-r--r--src/mess/drivers/stopthie.c313
-rw-r--r--src/mess/drivers/tandy12.c229
-rw-r--r--src/mess/drivers/unk3403.c211
-rw-r--r--src/mess/layout/cnsector.lay8
-rw-r--r--src/mess/layout/tmpacman.lay186
-rw-r--r--src/mess/mess.lst1
-rw-r--r--src/mess/mess.mak35
22 files changed, 2089 insertions, 2585 deletions
diff --git a/src/build/makelist.py b/src/build/makelist.py
index d58abce0c1d..190f0aad9e3 100644
--- a/src/build/makelist.py
+++ b/src/build/makelist.py
@@ -3,7 +3,6 @@
from __future__ import with_statement
import sys
-import os
drivlist = []
diff --git a/src/build/verinfo.py b/src/build/verinfo.py
index b6bb2f65e80..dfd4cc2f889 100644
--- a/src/build/verinfo.py
+++ b/src/build/verinfo.py
@@ -2,7 +2,6 @@
from __future__ import with_statement
-import os
import re
import sys
@@ -85,13 +84,13 @@ else:
if build == "mess":
# MESS
- author = "MESS Team";
- comments = "Multi Emulation Super System";
- company_name = "MESS Team";
- file_description = "Multi Emulation Super System";
- internal_name = "MESS";
- original_filename = "MESS";
- product_name = "MESS";
+ author = "MESS Team"
+ comments = "Multi Emulation Super System"
+ company_name = "MESS Team"
+ file_description = "Multi Emulation Super System"
+ internal_name = "MESS"
+ original_filename = "MESS"
+ product_name = "MESS"
bundle_identifier = "org.mamedev.mess"
elif build == "ume":
# UME
diff --git a/src/emu/drivers/xtal.h b/src/emu/drivers/xtal.h
index 7487c434db1..495db259a71 100644
--- a/src/emu/drivers/xtal.h
+++ b/src/emu/drivers/xtal.h
@@ -233,6 +233,7 @@ enum
XTAL_384kHz = 384000, /* Commonly used for driving OKI MSM5205 */
XTAL_400kHz = 400000, /* OKI MSM5205 on Great Swordman h/w */
+ XTAL_430kHz = 430000,
XTAL_455kHz = 455000, /* OKI MSM5205 on Gladiator h/w */
XTAL_512kHz = 512000, /* Toshiba TC8830F */
XTAL_640kHz = 640000, /* NEC UPD7759, Texas Instruments Speech Chips @ 8khz */
diff --git a/src/mame/drivers/neogeo.c b/src/mame/drivers/neogeo.c
index de21769c8b8..52918dd89b1 100644
--- a/src/mame/drivers/neogeo.c
+++ b/src/mame/drivers/neogeo.c
@@ -238,7 +238,9 @@
. NEO-AEG CHA42G-3
. NEO-AEG CHA42G-4
. NEO-AEG CHA256
+ . NEO-AEG CHA256 B
. NEO-AEG CHA256[B]
+ . NEO-AEG CHA256BY
. NEO-AEG CHA256RY
. NEO-AEG CHA512Y
. NEO-AEG CHAFIO (1999.8.10) - used with NEO-CMC 90G06C7042 or NEO-CMC 90G06C7050
@@ -261,6 +263,7 @@
. NEO-AEG PROG4096 B
. NEO-AEG PROGGS
. NEO-AEG PROGTOP2
+ . NEO-AEG PROGTOP2Y
. NEO-AEG PROGEOP (1999.4.2)
. NEO-AEG PROGLBA (1999.7.6)
. NEO-AEG PROGRK
@@ -307,7 +310,16 @@
GIGA PROG Board 1.0
GIGA PROG Board 1.5
-
+
+ Unofficial pcb's from NEOBITZ:
+
+ MVS CHA:
+ CHARBITZ1 2013.12.01
+
+ MVS PROG:
+ PROGBITZ1 2013.12.01
+
+
Neo-Geo game PCB infos by Johnboy
diff --git a/src/mame/drivers/neogeo_noslot.c b/src/mame/drivers/neogeo_noslot.c
index f44878f9476..dea6d008728 100644
--- a/src/mame/drivers/neogeo_noslot.c
+++ b/src/mame/drivers/neogeo_noslot.c
@@ -679,6 +679,7 @@ ROM_END
NEO-MVS PROG42G / NEO-MVS CHA42G
. NGH-007
NEO-AEG PROG42G / NEO-AEG CHA42G
+ NEO-AEG PROG42G / NEO-AEG CHA-8M
****************************************/
ROM_START( alpham2 ) /* MVS AND AES VERSION */
@@ -734,7 +735,7 @@ ROM_END
/****************************************
ID-0008
- Sunshine (prototype) 1990 SNK
+ Sun Shine (prototype) 1990 SNK / Alpha
****************************************/
/****************************************
@@ -770,7 +771,7 @@ ROM_START( ncombat ) /* MVS VERSION */
ROM_LOAD16_BYTE( "009-c6.c6", 0x200001, 0x80000, CRC(2eca8b19) SHA1(16764ef10e404325ba0a1a2ad3a4c0af287be21f) ) /* Plane 2,3 */ /* TC534200 */
ROM_END
-ROM_START( ncombath ) /* AES VERSION */
+ROM_START( ncombath ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "009-pg1.p1", 0x000000, 0x080000, CRC(8e9f0add) SHA1(d0b908a86a58f2537eea73a431038f1cd74a5a2f) ) /* TC534200 */
@@ -800,6 +801,7 @@ ROM_END
. NGM-010
NEO-MVS PROG-EP / NEO-MVS CHA-32
. NGH-010
+ NEO-AEG PROG-B / NEO-AEG CHA-32
****************************************/
ROM_START( cyberlip )
@@ -910,6 +912,7 @@ ROM_END
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
. NGH-016
NEO-AEG PROG42G / NEO-AEG CHA42G
+ NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( kotm ) /* MVS VERSION */
@@ -962,6 +965,7 @@ ROM_END
NEO-MVS PROG42G / NEO-MVS CHA42G
. NGH-017
NEO-AEG PROG42G / NEO-AEG CHA42G
+ NEO-AEG PRO42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( sengoku ) /* MVS AND AES VERSION */
@@ -1233,6 +1237,8 @@ ROM_END
ID-0023
. NGM-023
NEO-MVS PROG42G / NEO-MVS CHA42G
+ NEO-MVS PROGTOP / NEO-MVS CHA-256
+ Boards used for the Korean release
. NGH-023
NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
@@ -1368,7 +1374,7 @@ ROM_END
/****************************************
ID-0028
- Dunk Star (prototype) Sammy
+ Dunk Star (prototype) 1991 Sammy
****************************************/
/****************************************
@@ -1618,6 +1624,7 @@ ROM_END
ID-0036
. MOM-002
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
+ NEO-MVS PROG42G-COM / NEO-MVS CHA42G-1
. MOH-002
NEO-AEG PROG42G / NEO-AEG CHA42G
****************************************/
@@ -1775,6 +1782,7 @@ ROM_END
. NGM-040
NEO-MVS PROG 4096 / NEO-MVS CHA 42G-2
. NGH-040
+ NEO-AEG PROG16 / NEO-AEG CHA42G-1
****************************************/
ROM_START( sengoku2 )
@@ -1805,6 +1813,7 @@ ROM_END
. NGM-041
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
. NGH-041
+ NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( bstars2 )
@@ -1862,6 +1871,7 @@ ROM_END
ID-0043
. NGM-043
NEO-MVS PROG 4096 / NEO-MVS CHA 42G-2
+ NEO-MVS PROG-G2 / NEO-MVS CHA 42G-2
. NGH-043
NEO-AEG PROG16 / NEO-AEG CHA42G-1
****************************************/
@@ -1896,6 +1906,7 @@ ROM_END
ID-0044
. NGM-044
NEO-MVS PROG16 / NEO-MVS CHA42G-1
+ NEO-MVS PROG4096 / NEO-MVS CHA42G-1
. NGH-044
NEO-AEG PROG16 / NEO-AEG CHA42G-1
****************************************/
@@ -1903,7 +1914,8 @@ ROM_END
ROM_START( aof ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "044-p1.p1", 0x000000, 0x080000, CRC(ca9f7a6d) SHA1(4d28ef86696f7e832510a66d3e8eb6c93b5b91a1) ) /* TC534200 */
-
+ /* also found sets with ep1 or p1 on eprom. */
+
NEO_SFIX_128K( "044-s1.s1", CRC(89903f39) SHA1(a04a0c244a5d5c7a595fcf649107969635a6a8b6) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "044-m1.m1", CRC(0987e4bb) SHA1(8fae4b7fac09d46d4727928e609ed9d3711dbded) ) /* TC531001 */
@@ -1937,7 +1949,8 @@ ROM_START( samsho ) /* MVS VERSION */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "045-p1.p1", 0x000000, 0x100000, CRC(dfe51bf0) SHA1(2243af3770a516ae698b69bcd9daf53632d9128d) ) /* TC538200 */
ROM_LOAD16_WORD_SWAP( "045-pg2.sp2", 0x100000, 0x100000, CRC(46745b94) SHA1(d9e959fd1f88c9402915c1d0dcdb4a9e3d49cdcb) ) /* TC538200 */
-
+ /* also found set with ep1 / ep2 on eprom and sp2 on maskrom; same rom data as samshoh is used. */
+
NEO_SFIX_128K( "045-s1.s1", CRC(9142a4d3) SHA1(54088e99fcfd75fd0f94852890a56350066a05a3) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "045-m1.m1", CRC(95170640) SHA1(125c502db0693e8d11cef619b090081c14a9a300) ) /* TC531001 */
@@ -2051,6 +2064,7 @@ ROM_END
NEO-MVS PROG-G2 (SNK-9201) / NEO-MVS CHA42G-1
. NGH-047
NEO-AEG PROG-G2 (PRO-CT0) / NEO-AEG CHA42G-2B
+ NEO-AEG PROG-G2 (PRO-CT0) / NEO-AEG CHA42G-2
****************************************/
ROM_START( fatfury2 ) /* MVS AND AES VERSION */
@@ -2137,6 +2151,7 @@ ROM_END
. ALM-004
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
. ALH-004
+ NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( ncommand )
@@ -2164,6 +2179,7 @@ ROM_END
ID-0051
. AIM-051
NEO-MVS PROG-G2 / NEO-MVS CHA42G-1
+ NEO-MVS PROG 4096 / NEO-MVS CHA 42G-2
. AIH-051
****************************************/
@@ -2194,6 +2210,7 @@ ROM_END
. NGM-052
NEO-MVS PROG-G2 (SNK-9201) / NEO-MVS CHA 42G-2
. NGH-052
+ NEO-AEG PROG-G2 (SNK-9201) / NEO-AEG CHA42G-2
****************************************/
ROM_START( ssideki )
@@ -2222,6 +2239,7 @@ ROM_END
NEO-MVS PROG16 / NEO-MVS CHA42G-1
. ALH-005
NEO-AEG PROG16 / NEO-AEG CHA42G-1
+ NEO-AEG PROG-G2 / NEO-AEG CHA42G-2C
****************************************/
ROM_START( wh1 ) /* MVS VERSION */
@@ -2253,7 +2271,7 @@ ROM_START( wh1h ) /* AES VERSION */
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "053-p1.p1", 0x000000, 0x080000, CRC(95b574cb) SHA1(b7b7af6a04c3d902e7f8852897741ecaf0b1062c) ) /* TC534200 */
ROM_LOAD16_WORD_SWAP( "053-p2.p2", 0x080000, 0x080000, CRC(f198ed45) SHA1(24ccc091e97f63796562bb5b30df51f39bd504ef) ) /* TC534200 */
-
+
NEO_SFIX_128K( "053-s1.s1", CRC(8c2c2d6b) SHA1(87fa79611c6f8886dcc8766814829c669c65b40f) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "053-m1.m1", CRC(1bd9d04b) SHA1(65cd7b002123ed1a3111e3d942608d0082799ff3) ) /* TC531001 */
@@ -2307,6 +2325,7 @@ ROM_END
ID-0055
. NGM-055
NEO-MVS PROGTOP / NEO-MVS CHA256
+ NEO-MVS PROGTOP / NEO-MVS CHA256B
. NGH-055
NEO-AEG PROGRK / NEO-AEG CHA256
****************************************/
@@ -2437,7 +2456,8 @@ ROM_END
/****************************************
ID-0058
. NGM-058
- NEO-MVS PROGGSC / NEO-MVS CHA 42G-3B
+ NEO-MVS PROGGSC / NEO-MVS CHA42G-3B
+ NEO-MVS PROGGSC / NEO-MVS CHA 42G-3
. NGH-058
NEO-AEG PROGGS / NEO-AEG CHA42G-4
****************************************/
@@ -2499,6 +2519,7 @@ ROM_END
ID-0059
. NGM-059
NEO-MVS PROGTOP / NEO-MVS CHA256
+ NEO-MVS PROG 4096 B / NEO-MVS CHA 42G-3
. NGH-059
****************************************/
@@ -2584,6 +2605,8 @@ ROM_END
ID-0061
. NGM-061
NEO-MVS PROGGSC / NEO-MVS CHA256
+ NEO-MVS PROGTOP / NEO-MVS CHA256
+ NEO-MVS PROG 4096 B / NEO-MVS CHA256
. NGH-061
NEO-AEG PROGRKB / NEO-AEG CHA256[B]
****************************************/
@@ -2591,7 +2614,8 @@ ROM_END
ROM_START( ssideki2 ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "061-p1.p1", 0x000000, 0x100000, CRC(5969e0dc) SHA1(78abea880c125ec5a85bef6404478512a34b5513) ) /* mask rom TC538200 */
-
+ /* also found MVS sets with ep1 / ep2 on eprom; correct chip label unknown. */
+
NEO_SFIX_128K( "061-s1.s1", CRC(226d1b68) SHA1(de010f6fda3ddadb181fe37daa6105f22e78b970) ) /* mask rom TC531000 */
NEO_BIOS_AUDIO_128K( "061-m1.m1", CRC(156f6951) SHA1(49686f615f109a02b4f23931f1c84fee13872ffd) ) /* mask rom TC531001 */
@@ -2654,7 +2678,8 @@ ROM_START( samsho2 ) /* MVS AND AES VERSION */
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "063-p1.p1", 0x100000, 0x100000, CRC(22368892) SHA1(0997f8284aa0f57a333be8a0fdea777d0d01afd6) ) /* TC5316200 */
ROM_CONTINUE( 0x000000, 0x100000 )
-
+ /* also found MVS sets with ep1 / ep2 on eprom and p1 / sp2 on maskrom; correct chip label unknown */
+
NEO_SFIX_128K( "063-s1.s1", CRC(64a5cd66) SHA1(12cdfb27bf9ccd5a8df6ddd4628ef7cf2c6d4964) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "063-m1.m1", CRC(56675098) SHA1(90429fc40d056d480d0e2bbefbc691d9fa260fc4) ) /* TC531001 */
@@ -2716,6 +2741,7 @@ ROM_END
NEO-MVS PROGGSC / NEO-MVS CHA256
. ADH-007
NEO-AEG PROGRK / NEO-AEG CHA256
+ NEO-AEG PROGRKB / NEO-AEG CHA256[B]
****************************************/
ROM_START( wh2j ) /* MVS AND AES VERSION */
@@ -2734,6 +2760,7 @@ ROM_START( wh2j ) /* MVS AND AES VERSION */
NO_DELTAT_REGION
ROM_REGION( 0x1000000, "sprites", 0 )
+ /* Different layout with 4xC (32 mbit) also exists; chip labels are 064-C13, 064-C24, 064-C57 and 064-c68. */
ROM_LOAD16_BYTE( "064-c1.c1", 0x000000, 0x200000, CRC(2ec87cea) SHA1(e713ec7839a7665edee6ee3f82a6e530b3b4bd7c) ) /* Plane 0,1 */ /* TC5316200 */
ROM_LOAD16_BYTE( "064-c2.c2", 0x000001, 0x200000, CRC(526b81ab) SHA1(b5f0a2f04489539ed6b9d0810b12787356c64b23) ) /* Plane 2,3 */ /* TC5316200 */
ROM_LOAD16_BYTE( "064-c3.c3", 0x400000, 0x200000, CRC(436d1b31) SHA1(059776d77b91377ed0bcfc278802d659c917fc0f) ) /* Plane 0,1 */ /* TC5316200 */
@@ -2749,6 +2776,7 @@ ROM_END
. DEM-002
NEO-MVS PROG42G-1 / NEO-MVS CHA42G-1
. DEH-002
+ NEO-AEG PROG42G-1 / NEO-AEG CHA42G-1
****************************************/
ROM_START( wjammers )
@@ -2807,6 +2835,7 @@ ROM_END
ID-0067
. ??M-067
NEO-MVS PROG16 / NEO-MVS CHA256B
+ NEO-MVS PROG16 / NEO-MVS CHA256
****************************************/
ROM_START( gururin ) /* MVS ONLY RELEASE */
@@ -2925,7 +2954,8 @@ ROM_END
/****************************************
ID-0071
Bang Bang Busters (prototype) 1994 Visco
- Released in 2010 for MVS and AES (Releaser claims that it is officially licensed by VISCO)
+ Prepared for release in 2000/2001, but apparently Zupapa was favored
+ The 2000 version was released in 2010 for MVS and AES (Releaser claims that it is officially licensed by VISCO)
Reported UNIVERSE BIOS CRC32:
ROM EC861CAF
@@ -2935,6 +2965,23 @@ ROM_END
BANK 3 NOT USED
****************************************/
+ ROM_START( b2b )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "071.p1", 0x000000, 0x080000, CRC(7687197d) SHA1(4bb9cb7819807f7a7e1f85f1c4faac4a2f8761e8) )
+
+ NEO_SFIX_128K( "071.s1", CRC(44e5f154) SHA1(b3f80051789e60e5d8c5df0408f1aba51616e92d) )
+
+ NEO_BIOS_AUDIO_128K( "071.m1", CRC(6da739ad) SHA1(cbf5f55c54b4ee00943e2a411eeee4e465ce9c34) )
+
+ ROM_REGION( 0x100000, "ymsnd", 0 )
+ ROM_LOAD( "071.v1", 0x000000, 0x100000, CRC(50feffb0) SHA1(00127dae0130889995bfa7560bc4b0662f74fba5) )
+
+ ROM_REGION( 0x400000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "071.c1", 0x000000, 0x200000, CRC(23d84a7a) SHA1(9034658ad40e2c45558abc3db312aa2764102fc4) ) /* Plane 0,1 */
+ ROM_LOAD16_BYTE( "071.c2", 0x000001, 0x200000, CRC(ce7b6248) SHA1(ad1cd5adae5c151e183ff88b68afe10f7009f48e) ) /* Plane 2,3 */
+ROM_END
+
+
/****************************************
ID-0072
Last Odyssey Pinball Fantasia (prototype) 1995 Monolith
@@ -3005,6 +3052,7 @@ ROM_END
. NGM-075
NEO-MVS PROGGSC / NEO-MVS CHA256
. NGH-075
+ NEO-AEG PROGRK / NEO-AEG CHA256
****************************************/
ROM_START( sonicwi2 )
@@ -3059,7 +3107,8 @@ ROM_END
/****************************************
ID-0077
- The Warlocks of the Fates (prototype) 1995 Astec
+ The Warlocks of the Fates / Shinryu Senki (prototype) 1995 SNK/Astec21
+ a video of intro and full gameplay was on youtube in 2014.
****************************************/
/****************************************
@@ -3130,6 +3179,8 @@ ROM_END
ID-0080
. SAM-080
NEO-MVS PROGGSC / NEO-MVS CHA256
+ NEO-MVS PROGTOP / NEO-MVS CHA256
+ Boards used for the Korean release
. SAH-080
NEO-AEG PROGTOP2 / NEO-AEG CHA256 B
****************************************/
@@ -3185,7 +3236,10 @@ ROM_END
. NGM-081
NEO-MVS PROGTOP / NEO-MVS CHA42G-3B
NEO-MVS PROGTOP / NEO-MVS CHA256
+ NEO-MVS PROG 4096 B / NEO-MVS CHA 42G-3
+ NEO-MVS PROGBK1 / NEO-MVS CHA256B
. NGH-081
+ NEO-AEG PROGTOP2 / NEO-AEG CHA256 B
****************************************/
ROM_START( ssideki3 )
@@ -3219,6 +3273,8 @@ ROM_END
NEO-MVS PROGTOP / NEO-MVS CHA256
NEO-MVS PROGTOP / NEO-MVS CHA 42G-3
NEO-MVS PROGBK1 / NEO-MVS CHA256
+ NEO-MVS PROGTOP / NEO-MVS CHA256B
+ NEO-MVS PROG 4096 B / NEO-MVS CHA 42G-3
. NGH-082
****************************************/
@@ -3417,6 +3473,7 @@ ROM_END
ID-0087
. NGM-087
NEO-MVS PROGSS3 / NEO-MVS CHA256
+ NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-087
NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
@@ -3508,6 +3565,7 @@ ROM_END
. NGM-088
NEO-MVS PROGBK1 / NEO-MVS CHA42-3B
. NGH-088
+ NEO-AEG PROGRKB / NEO-AEG CHA256[B]
****************************************/
ROM_START( stakwin )
@@ -3536,6 +3594,7 @@ ROM_END
. NGM-089
NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-089
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( pulstar )
@@ -3568,6 +3627,9 @@ ROM_END
ID-0090
. ADM-009
NEO-MVS PROGTOP / NEO-MVS CHA256
+ NEO-MVS PROGGSC / NEO-MVS CHA256
+ NEO-MVS PROGGSC / NEO-MVS CHA256B
+ NEO-MVS PROGBK1 / NEO-MVS CHA256B
. ADH-009
****************************************/
@@ -3602,13 +3664,14 @@ ROM_END
/****************************************
ID-0091
- unknown
+ ADK World / ADK Special 1995 ADK (CD only)
****************************************/
/****************************************
ID-0092
. NGM-092
NEO-MVS PROGBK1 / NEO-MVS CHA256
+ NEO-MVS PROGTOP / NEO-MVS CHA256
. NGH-092
****************************************/
@@ -3830,6 +3893,7 @@ ROM_END
. NGM-097
NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-097
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( sonicwi3 )
@@ -3886,6 +3950,7 @@ ROM_END
ID-0200
. NGM-200
NEO-MVS PROGBK1 / NEO-MVS CHA256B
+ NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-200
****************************************/
@@ -3915,6 +3980,7 @@ ROM_END
ID-0201
. NGM-201
NEO-MVS PROGBK1 / NEO-MVS CHA256
+ NEO-MVS PROGBK1 / NEO-MVS CHA256B
. NGH-201
****************************************/
@@ -3991,7 +4057,7 @@ ROM_END
/****************************************
ID-0204
- QP (prototype)
+ QP (prototype) 1997 Success
****************************************/
/****************************************
@@ -4031,6 +4097,7 @@ ROM_END
ID-0207
. ??M-207
NEO-MVS PROGBK1 / NEO-MVS CHA42G-3B
+ NEO-MVS PROG 4096 / NEO-MVS CHA42G-3B
****************************************/
ROM_START( neomrdo ) /* MVS ONLY RELEASE */
@@ -4175,14 +4242,17 @@ ROM_END
ID-0214
. NGM-214
NEO-MVS PROGBK1 / NEO-MVS CHA256
+ NEO-MVS PROGSS3 / NEO-MVS CHA256
. NGH-214
+ NEO-AEG PROGBK1Y / NEO-GEO AEG CHA256RY
****************************************/
ROM_START( kof96 ) /* MVS VERSION */
ROM_REGION( 0x300000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "214-p1.p1", 0x000000, 0x100000, CRC(52755d74) SHA1(4232d627f1d2e6ea9fc8cf01571d77d4d5b8a1bb) ) /* TC538200 */
ROM_LOAD16_WORD_SWAP( "214-p2.sp2", 0x100000, 0x200000, CRC(002ccb73) SHA1(3ae8df682c75027ca82db25491021eeba00a267e) ) /* TC5316200 */
-
+ /* also found sets with ep1 / ep2 / ep3 / ep4 on eprom and 214-P5 on TC5316200; correct chip labels for eproms is unknown */
+
NEO_SFIX_128K( "214-s1.s1", CRC(1254cbdb) SHA1(fce5cf42588298711a3633e9c9c1d4dcb723ac76) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "214-m1.m1", CRC(dabc427c) SHA1(b76722ed142ee7addceb4757424870dbd003e8b3) ) /* TC531001 */
@@ -4205,7 +4275,7 @@ ROM_START( kof96 ) /* MVS VERSION */
ROM_LOAD16_BYTE( "214-c8.c8", 0x1800001, 0x400000, CRC(fa1461ad) SHA1(6c71a7f08e4044214223a6bf80984582ab5e0328) ) /* Plane 2,3 */ /* TC5332205 */
ROM_END
-ROM_START( kof96h )
+ROM_START( kof96h ) /* AES VERSION */
ROM_REGION( 0x300000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "214-pg1.p1", 0x000000, 0x100000, CRC(bd3757c9) SHA1(35392a044117e46c088ff0fdd07d69a3faa4f96e) )
ROM_LOAD16_WORD_SWAP( "214-p2.sp2", 0x100000, 0x200000, CRC(002ccb73) SHA1(3ae8df682c75027ca82db25491021eeba00a267e) ) /* TC5316200 */
@@ -4237,6 +4307,7 @@ ROM_END
. NGM-215
NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-215
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( ssideki4 )
@@ -4268,6 +4339,7 @@ ROM_END
. ??M-216
NEO-MVS PROGTOP / NEO-MVS CHA256
. ??H-216
+ NEO-AEG PROGTOP2Y / NEO-AEG CHA256BY
****************************************/
ROM_START( kizuna )
@@ -4346,6 +4418,7 @@ ROM_END
. ADM-012
NEO-MVS PROGBK1 / NEO-MVS CHA256
. ADH-012
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( ninjamas )
@@ -4485,6 +4558,7 @@ ROM_END
ID-0221
. NGM-221
NEO-MVS PROGBK1 / NEO-MVS CHA256B
+ NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-221
****************************************/
@@ -4573,6 +4647,7 @@ ROM_END
. NGM-223
NEO-MVS PROGBK1 / NEO-MVS CHA256B
. NGH-223
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( rbffspec )
@@ -4605,7 +4680,7 @@ ROM_END
ROM_START( rbffspeck ) /* KOREAN VERSION */
ROM_REGION( 0x500000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "223-p1k.p1", 0x000000, 0x100000, CRC(b78c8391) SHA1(936b356ac135331b10a37bc10882ec2e4f6b400b) )
- /* Chip label is correct. They used Cart ID 0124 as 0123 was allready used by quizdaisk */
+ /* Chip label is correct. They used Cart ID 0124 as 0123 was already used by quizdaisk */
ROM_LOAD16_WORD_SWAP( "223-p2.sp2", 0x100000, 0x400000, CRC(addd8f08) SHA1(abaf5b86c8ec915c07ef2d83fce9ad03acaa4817) ) /* TC5332205 */
NEO_SFIX_128K( "223-s1.s1", CRC(7ecd6e8c) SHA1(465455afc4d83cbb118142be4671b2539ffafd79) ) /* TC531000 */
@@ -4635,6 +4710,7 @@ ROM_END
. ADM-013
NEO-MVS PROGBK1 / NEO-MVS CHA256B
. ADH-013
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( twinspri )
@@ -4700,6 +4776,7 @@ ROM_END
. NGM-227
NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-227
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( stakwin2 )
@@ -4761,6 +4838,7 @@ ROM_END
. NGM-2300
NEO-MVS PROGBK1 / NEO-MVS CHA256B
. NGH-2300
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( breakers )
@@ -4899,6 +4977,7 @@ ROM_END
. NGM-2330
NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-2330
+ NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/
ROM_START( magdrop3 )
@@ -4934,7 +5013,9 @@ ROM_START( lastblad ) /* MVS VERSION */
ROM_REGION( 0x500000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "234-p1.p1", 0x000000, 0x100000, CRC(e123a5a3) SHA1(a3ddabc00feeb54272b145246612ad4632b0e413) ) /* TC538200 */
ROM_LOAD16_WORD_SWAP( "234-p2.sp2", 0x100000, 0x400000, CRC(0fdc289e) SHA1(1ff31c0b0f4f9ddbedaf4bcf927faaae81892ec7) ) /* TC5332205 */
-
+ /* also found sets with p1 / sp2 / ep1 / ep2 / m1 on eprom with sticker */
+ /* chip label is 0234-P1, 0234-SP2, 0234-EP1, 0234-EP2 and 0234-M1 */
+
NEO_SFIX_128K( "234-s1.s1", CRC(95561412) SHA1(995de272f572fd08d909d3d0af4251b9957b3640) ) /* TC531000 */
NEO_BIOS_AUDIO_128K( "234-m1.m1", CRC(087628ea) SHA1(48dcf739bb16699af4ab8ed632b7dcb25e470e06) ) /* TC531001 */
@@ -5151,6 +5232,7 @@ ROM_END
. NGM-2390
NEO-MVS PROGBK1 / NEO-MVS CHA512Y
. NGH-2390
+ NEO-AEG PROGBK1Y / NEO-AEG CHA512Y
****************************************/
ROM_START( blazstar )
@@ -5269,6 +5351,7 @@ ROM_END
ID-0241
. NGM-2410
NEO-MVS PROGBK1 / NEO-MVS CHA512Y
+ NEO-MVS PROGBK1 / NEO-MVS CHA256
. NGH-2410
NEO-AEG PROGBK1Y / NEO-AEG CHA512Y
****************************************/
@@ -5289,6 +5372,7 @@ ROM_START( mslug2 ) /* MVS AND AES VERSION */
NO_DELTAT_REGION
ROM_REGION( 0x2000000, "sprites", 0 )
+ /* Different layout with 8xC (16 mbit) also exists; naming sheme 241-Cx */
ROM_LOAD16_BYTE( "241-c1.c1", 0x0000000, 0x800000, CRC(394b5e0d) SHA1(4549926f5054ee6aa7689cf920be0327e3908a50) ) /* Plane 0,1 */ /* TC5364205 */
ROM_LOAD16_BYTE( "241-c2.c2", 0x0000001, 0x800000, CRC(e5806221) SHA1(1e5475cfab129c77acc610f09369ca42ba5aafa5) ) /* Plane 2,3 */ /* TC5364205 */
ROM_LOAD16_BYTE( "241-c3.c3", 0x1000000, 0x800000, CRC(9f6bfa6f) SHA1(a4319b48004e723f81a980887678e3e296049a53) ) /* Plane 0,1 */ /* TC5364205 */
@@ -5298,8 +5382,8 @@ ROM_END
/****************************************
ID-0242
. NGM-2420
- NEO-MVS PROGSF1 (protected board) / NEO-MVS CHA512Y
- NEO-MVS PROGSF1E (protected board) / NEO-MVS CHA512Y
+ NEO-MVS PROGSF1 (1998.6.17) (protected board) / NEO-MVS CHA512Y
+ NEO-MVS PROGSF1E (1998.6.18) (protected board) / NEO-MVS CHA512Y
NEO-MVS PROGBK1 / NEO-MVS CHA512Y
. NGH-2420
NEO-AEG PROGBK1Y / NEO-AEG CHA512Y
@@ -5422,7 +5506,7 @@ ROM_START( kof98ka ) /* encrypted code + protection, only z80 rom is different t
ROM_LOAD16_BYTE( "242-c8.c8", 0x3000001, 0x800000, CRC(c823e045) SHA1(886fbf64bcb58bc4eabb1fc9262f6ac9901a0f28) ) /* Plane 2,3 */ /* TC5364205 */
ROM_END
-ROM_START( kof98h ) /* AES VERSION */
+ROM_START( kof98h ) /* MVS AND AES VERSION */
ROM_REGION( 0x500000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "242-pn1.p1", 0x000000, 0x100000, CRC(61ac868a) SHA1(26577264aa72d6af272952a876fcd3775f53e3fa) ) /* TC538200 */
ROM_LOAD16_WORD_SWAP( "242-p2.sp2", 0x100000, 0x400000, CRC(980aba4c) SHA1(5e735929ec6c3ca5b2efae3c7de47bcbb8ade2c5) ) /* TC5332205 */
@@ -5689,11 +5773,11 @@ ROM_END
ID-0251
. NGM-2510
SMA protected version found on:
- NEO-MVS PROGLBA (NEO-SMA) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
+ NEO-MVS PROGLBA (NEO-SMA) (1999.4.12) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
Non SMA protected version found on:
NEO-MVS PROGBK1 / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
. NGH-2510
- NEO-AEG PROGLBA / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
+ NEO-AEG PROGLBA (1999.7.6) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
****************************************/
ROM_START( kof99 ) /* Original Version - Encrypted Code & GFX */ /* MVS VERSION */
@@ -5908,9 +5992,9 @@ ROM_END
/****************************************
ID-0253
. NGM-2530
- NEO-MVS PROGLBA (NEO-SMA) (LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
+ NEO-MVS PROGLBA (1999.4.12) (NEO-SMA)(LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
. NGH-2530
- NEO-AEG PROGLBA (NEO-SMA) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
+ NEO-AEG PROGLBA (1999.7.6) (NEO-SMA) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
****************************************/
ROM_START( garou ) /* Original Version - Encrypted GFX */ /* MVS VERSION - later revision */
@@ -6096,10 +6180,11 @@ ROM_END
ID-0256
. NGM-2560
SMA protected version found on:
- NEO-MVS PROGLBA (NEO-SMA)(LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
+ NEO-MVS PROGLBA (1999.4.12) (NEO-SMA)(LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
Non SMA protected version found on:
NEO-MVS PROGBK1 / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
. NGH-2560
+ NEO-AEG PROGLBA (1999.7.6) (NEO-SMA)(LBA-SUB) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
****************************************/
ROM_START( mslug3 ) /* Original Version - Encrypted Code & GFX */ /* revision 2000.4.1 */ /* MVS VERSION */
@@ -6108,7 +6193,7 @@ ROM_START( mslug3 ) /* Original Version - Encrypted Code & GFX */ /* revision 20
/* The SMA for this release has a green colour marking; the older revision has a white colour marking */
ROM_LOAD16_WORD_SWAP( "256-pg1.p1", 0x100000, 0x400000, CRC(b07edfd5) SHA1(dcbd9e500bfae98d754e55cdbbbbf9401013f8ee) ) /* TC5332202 */
ROM_LOAD16_WORD_SWAP( "256-pg2.p2", 0x500000, 0x400000, CRC(6097c26b) SHA1(248ec29d21216f29dc6f5f3f0e1ad1601b3501b6) ) /* TC5332202 */
-
+
ROM_Y_ZOOM
/* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
@@ -6143,7 +6228,9 @@ ROM_START( mslug3h ) /* Original Version - Encrypted GFX */ /* revision 2000.3.1
ROM_REGION( 0x500000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "256-ph1.p1", 0x000000, 0x100000, CRC(9c42ca85) SHA1(7a8f77a89867b889295ae9b9dfd4ba28f02d234d) )
ROM_LOAD16_WORD_SWAP( "256-ph2.sp2", 0x100000, 0x400000, CRC(1f3d8ce8) SHA1(08b05a8abfb86ec09a5e758d6273acf1489961f9) )
-
+ /* also found AES set with p1 / p2 on maskrom on NEO-AEG PROGLBA (NEO-SMA); chip labels is 256-PG1 and 256-PG2 */
+ /* The SMA for this release has a pink color marking */
+
ROM_Y_ZOOM
/* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
@@ -6178,7 +6265,7 @@ ROM_END
ID-0257
. NGM-2570
SMA protected version found on:
- NEO-MVS PROGLBA (NEO-SMA)(LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
+ NEO-MVS PROGLBA (1999.4.12) (NEO-SMA)(LBA-SUB) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
Non SMA protected version found on:
NEO-MVS PROGBK1 / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
. NGH-2570
@@ -6330,6 +6417,7 @@ ROM_END
. NGM-2610
NEO-MVS PROGBK1 / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7042)
. NGH-2610
+ NEO-AEG PROGBK1F / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7042)
****************************************/
ROM_START( sengoku3 ) /* Original Version - Encrypted GFX */
@@ -6449,7 +6537,7 @@ ROM_END
. NGM-2630
NEO-MVS PROGBK2 (NEO-PCM2 SNK)/ NEO-MVS CHAFIO (NEO-CMC 7050)
. NGH-2630
- NEO-AEG PROGBK2 (NEO-PCM2 SNK) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
+ NEO-AEG PROGBK2 (2002.4.1) (NEO-PCM2 SNK) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
****************************************/
ROM_START( mslug4 ) /* Original Version - Encrypted GFX */ /* MVS VERSION */
@@ -6524,9 +6612,9 @@ ROM_END
/****************************************
ID-0264
. NGM-264?
- NEO-MVS PROGBK2 (NEO-PCM2 SNK) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
+ NEO-MVS PROGBK2 (2000.3.21) (NEO-PCM2 SNK) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
. NGH-2641
- NEO-AEG PROGBK2 (NEO-PCM2 SNK) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
+ NEO-AEG PROGBK2 (2002.4.1) (NEO-PCM2 SNK) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
- Distribution by BrezzaSoft
****************************************/
@@ -6567,7 +6655,7 @@ ROM_END
/****************************************
ID-0265
. NGM-2650
- NEO-MVS PROGBK2 (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
+ NEO-MVS PROGBK2 (2000.3.21) (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
. NGH-2650
NEO-AEG PROGBK2 (NEO-PCM2 PLAYMORE) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
****************************************/
@@ -6610,9 +6698,9 @@ ROM_END
/****************************************
ID-0266
. NGM-2660
- NEO-MVS PROGBK2 (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
+ NEO-MVS PROGBK2 (2000.3.21) (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
. NGH-2660
- NEO-AEG PROGBK2 (NEO-PCM2 PLAYMORE) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
+ NEO-AEG PROGBK2 (2002.4.1) (NEO-PCM2 PLAYMORE) / NEO-AEG CHAFIO (1999.8.10) (NEO-CMC 7050)
****************************************/
ROM_START( matrim ) /* Encrypted Set */ /* MVS AND AES VERSION */
@@ -6659,7 +6747,8 @@ ROM_END
ROM_START( pnyaa ) /* Encrypted Set */ /* MVS ONLY RELEASE */
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "267-p1.p1", 0x000000, 0x100000, CRC(112fe2c0) SHA1(01420e051f0bdbd4f68ce306a3738161b96f8ba8) ) /* mask rom TC538200 */
-
+ /* also found set with p1 and m1 on eprom with sticker; chip labels is PN 2.02 and M1 */
+
ROM_Y_ZOOM
/* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
@@ -6686,8 +6775,9 @@ ROM_END
/****************************************
ID-0268
. NGM-2680
- NEO-MVS PROGBK3S (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-MVS PROGBK3S (2003.10.1) (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
. NGH-2680
+ NEO-AEG PROGBK3S (2003.10.6) (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-AEG CHAFIO (2003.7.24) (NEO-CMC 7050)
****************************************/
ROM_START( mslug5 ) /* Encrypted Set */ /* MVS VERSION */
@@ -6729,7 +6819,8 @@ ROM_START( mslug5h ) /* Encrypted Set */ /* AES release of the game but is also
ROM_REGION( 0x800000, "maincpu", 0 )
ROM_LOAD32_WORD_SWAP( "268-p1c.p1", 0x000000, 0x400000, CRC(3636690a) SHA1(e0da714b4bdc6efffe1250ded02ebddb3ab6d7b3) )
ROM_LOAD32_WORD_SWAP( "268-p2c.p2", 0x000002, 0x400000, CRC(8dfc47a2) SHA1(27d618cfbd0107a4d2a836797e967b39d2eb4851) )
-
+ /* also found AES set with p1 / p2 on maskrom; chip labels is 268-P1CR2 and 268-P2CR2 */
+
ROM_Y_ZOOM
/* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
@@ -6804,9 +6895,9 @@ ROM_END
/****************************************
ID-0270
. NGM-2700
- NEO-MVS PROGBK2R (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-MVS PROGBK2R (2003.8.26) (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
. NGH-2700
- NEO-AEG PROGBK2S (NEO-PCM2 PLAYMORE) / NEO-AEG CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-AEG PROGBK2S (2003.10.16) (NEO-PCM2 PLAYMORE) / NEO-AEG CHAFIO (2003.7.24) (NEO-CMC 7050)
****************************************/
ROM_START( samsho5 ) /* Encrypted Set */ /* MVS VERSION */
@@ -6882,9 +6973,9 @@ ROM_END
/****************************************
ID-0271
. NGM-2710
- NEO-MVS PROGBK3S (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-MVS PROGBK3S (2003.10.1) (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
. NGH-2710
- NEO-AEG PROGBK3S (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-AEG CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-AEG PROGBK3S (2003.10.6) (NEO-PCM2 PLAYMORE) (NEO-PVC) / NEO-AEG CHAFIO (2003.7.24) (NEO-CMC 7050)
****************************************/
ROM_START( kof2003 ) /* Encrypted Code + Sound + GFX Roms */ /* MVS VERSION */
@@ -6963,7 +7054,7 @@ ROM_END
/****************************************
ID-0272
. NGM-2720
- NEO-MVS PROGBK2S (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
+ NEO-MVS PROGBK2S (2003.10.18) (NEO-PCM2 PLAYMORE) / NEO-MVS CHAFIO (2003.7.24) (NEO-CMC 7050)
. NGH-2720
****************************************/
@@ -7097,7 +7188,7 @@ ROM_END
/****************************************
B-J-02
. ???-????
- MVS PROGV (2000.11.17) / NEO-MVS CHAFIO (1999.6.14)
+ MVS PROGV (2000.11.17) / NEO-MVS CHAFIO (1999.6.14) (NEO-CMC 7050)
****************************************/
ROM_START( jockeygp ) /* MVS ONLY RELEASE */
@@ -9780,6 +9871,7 @@ GAME( 1998, flipshot, neogeo, neogeo_noslot, neogeo, neogeo_state, neoge
GAME( 1999, ctomaday, neogeo, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "Visco", "Captain Tomaday", GAME_SUPPORTS_SAVE )
GAME( 1999, ganryu, neogeo, neogeo_noslot, neogeo, neogeo_noslot_state, ganryu, ROT0, "Visco", "Ganryu / Musashi Ganryuki" , GAME_SUPPORTS_SAVE ) /* Encrypted GFX */
GAME( 2000, bangbead, neogeo, neogeo_noslot, neogeo, neogeo_noslot_state, bangbead, ROT0, "Visco", "Bang Bead", GAME_SUPPORTS_SAVE )
+GAME( 2000, b2b, neogeo, neogeo_noslot, neogeo, neogeo_state, neogeo, ROT0, "Visco", "Bang Bang Busters (2010 NCI release)" , GAME_SUPPORTS_SAVE )
/* Mega Enterprise */
GAME( 2002, mslug4, neogeo, neogeo_noslot, neogeo, neogeo_noslot_state, mslug4, ROT0, "Mega / Playmore", "Metal Slug 4 (NGM-2630)", GAME_SUPPORTS_SAVE )
@@ -9813,7 +9905,11 @@ GAME( 2004, sbp, neogeo, neogeo_noslot, neogeo, neogeo_noslot_state,
// Fast Striker (c)2010 - MVS/AES
// Fast Striker 1.5 (c)2010 - MVS/AES
// GunLord (c)2012 - MVS/AES
+// Neo XYX (c)2013 - MVS/AES
+// Razion (c)2014 - MVS/AES?
/* N.C.I - LE CORTEX */
-// Bang Bang Busters (c)2010 - MVS?/AES
-// Treasure of the Caribbean (c)2011 - MVS?/AES
+// Treasure of the Caribbean (c)2011 - AES only (no credits system if ran on an MVS, Freeplay)
+
+/* NEOBITZ */
+// Knight's Chance (c)2014 - MVS/AES
diff --git a/src/mame/drivers/opwolf.c b/src/mame/drivers/opwolf.c
index 3d969d47038..4db6ab0d309 100644
--- a/src/mame/drivers/opwolf.c
+++ b/src/mame/drivers/opwolf.c
@@ -825,9 +825,8 @@ ROM_START( opwolf )
ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) )
ROM_LOAD16_BYTE( "b20-20.29", 0x20001, 0x10000, CRC(d244431a) SHA1(cb6c1d330a526f05c205f68247328161b8d4a1ba) )
- ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
- ROM_LOAD( "b20-07.10", 0x00000, 0x04000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) )
- ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */
+ ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 32339c6e085..91053b729ce 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -7704,6 +7704,7 @@ kof2000 // 0257 (c) 2000 SNK
kof2000n // 0257 (c) 2000 SNK
// 0258 SNK vs. Capcom?
bangbead // 0259 (c) 2000 Visco
+b2b // 0071 (c) 2000 Visco (released by NCI in 2010)
nitd // 0260 (c) 2000 Eleven / Gavaking
nitdbl // bootleg
sengoku3 // 0261 (c) 2001 Noise Factory / SNK
diff --git a/src/mess/drivers/cnsector.c b/src/mess/drivers/cnsector.c
deleted file mode 100644
index 9153b3a3718..00000000000
--- a/src/mess/drivers/cnsector.c
+++ /dev/null
@@ -1,254 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Parker Brothers Code Name: Sector, by Bob Doyle
- * MP0905BNL ZA0379 (die labeled 0970F-05B)
-
- This is a tabletop submarine pursuit game. A grid board and small toy
- boats are used to remember your locations (a Paint app should be ok too).
- Refer to the official manual for more information, it is not a simple game.
-
-
- TODO:
- - MCU clock is unknown
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-
-#include "cnsector.lh"
-
-// master clock is unknown, the value below is an approximation
-#define MASTER_CLOCK (250000)
-
-
-class cnsector_state : public driver_device
-{
-public:
- cnsector_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<5> m_button_matrix;
-
- UINT16 m_o;
-
- UINT16 m_display_state[0x10];
- UINT16 m_display_cache[0x10];
- UINT8 m_display_decay[0x100];
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
-
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- LED Display
-
-***************************************************************************/
-
-// The device strobes the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-void cnsector_state::display_update()
-{
- UINT16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
- {
- active_state[i] = 0;
-
- for (int j = 0; j < 0x10; j++)
- {
- int di = j << 4 | i;
-
- // turn on powered segments
- if (m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
-
- // determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
- }
- }
-
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- if (m_display_cache[i] != active_state[i])
- output_set_digit_value(i, active_state[i]);
-
- memcpy(m_display_cache, active_state, sizeof(m_display_cache));
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(cnsector_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
-
- display_update();
-}
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(cnsector_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 5; i++)
- if (m_o >> i & 1)
- k |= m_button_matrix[i]->read();
-
- return k;
-}
-
-WRITE16_MEMBER(cnsector_state::write_r)
-{
- // R0-R5: select digit (right-to-left)
- for (int i = 0; i < 6; i++)
- m_display_state[i] = (data >> i & 1) ? m_o : 0;
- display_update();
-
- // R6-R9: direction leds
- for (int i = 6; i < 10; i++)
- output_set_lamp_value(i - 6, data >> i & 1);
-}
-
-WRITE16_MEMBER(cnsector_state::write_o)
-{
- // O0-O4: input mux
- // O0-O7: digit segments
- m_o = data;
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-static INPUT_PORTS_START( cnsector )
- PORT_START("IN.0") // O0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range")
-
- PORT_START("IN.1") // O1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.2") // O2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
-
- PORT_START("IN.3") // O3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
- 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_UNUSED )
-
- PORT_START("IN.4") // O4
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void cnsector_state::machine_start()
-{
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_cache, 0, sizeof(m_display_cache));
- memset(m_display_decay, 0, sizeof(m_display_decay));
-
- m_o = 0;
-
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_cache));
- save_item(NAME(m_display_decay));
-
- save_item(NAME(m_o));
-}
-
-
-static MACHINE_CONFIG_START( cnsector, cnsector_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS0970, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(cnsector_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cnsector_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cnsector_state, write_r))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", cnsector_state, display_decay_tick, attotime::from_msec(1))
-
- MCFG_DEFAULT_LAYOUT(layout_cnsector)
-
- /* no video! */
-
- /* no sound! */
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( cnsector )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_default_ipla.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_cnsector_mpla.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0970_cnsector_opla.pla", 0, 352, CRC(7c0bdcd6) SHA1(dade774097e8095dca5deac7b2367d0c701aca51) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0970_cnsector_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) )
-ROM_END
-
-
-CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
diff --git a/src/mess/drivers/elecdet.c b/src/mess/drivers/elecdet.c
deleted file mode 100644
index aab66ebc80e..00000000000
--- a/src/mess/drivers/elecdet.c
+++ /dev/null
@@ -1,313 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Ideal Electronic Detective
- * TMS0980NLL MP6100A (die labeled 0980B-00)
- hardware (and concept) is very similar to Parker Bros Stop Thief
-
- This is an electronic board game. It requires game cards with suspect info,
- and good old pen and paper to record game progress. To start the game, enter
- difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the
- manual for more information.
-
-
- TODO:
- - MCU clock is unknown
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "elecdet.lh"
-
-// master clock is unknown, the value below is an approximation
-#define MASTER_CLOCK (425000)
-
-
-class elecdet_state : public driver_device
-{
-public:
- elecdet_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<5> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_o;
- bool m_power_on;
-
- UINT16 m_display_state[0x10];
- UINT16 m_display_cache[0x10];
- UINT8 m_display_decay[0x100];
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- DECLARE_INPUT_CHANGED_MEMBER(power_button);
- DECLARE_WRITE_LINE_MEMBER(auto_power_off);
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
-
- virtual void machine_reset();
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- LED Display
-
-***************************************************************************/
-
-// The device strobes the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-void elecdet_state::display_update()
-{
- UINT16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
- {
- active_state[i] = 0;
-
- for (int j = 0; j < 0x10; j++)
- {
- int di = j << 4 | i;
-
- // turn on powered segments
- if (m_power_on && m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
-
- // determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
- }
- }
-
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- if (m_display_cache[i] != active_state[i])
- output_set_digit_value(i, active_state[i]);
-
- memcpy(m_display_cache, active_state, sizeof(m_display_cache));
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(elecdet_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
-
- display_update();
-}
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(elecdet_state::read_k)
-{
- // the Vss row is always on
- UINT8 k = m_button_matrix[4]->read();
-
- // read selected button rows
- for (int i = 0; i < 4; i++)
- {
- const int ki[4] = { 0, 1, 4, 6 };
- if (m_o >> ki[i] & 1)
- k |= m_button_matrix[i]->read();
- }
-
- return k;
-}
-
-WRITE16_MEMBER(elecdet_state::write_r)
-{
- // R0-R6: select digit
- UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3) & 0x7f;
- for (int i = 0; i < 7; i++)
- m_display_state[i] = (data >> i & 1) ? o : 0;
-
- display_update();
-
- // R7,R8: speaker on
- m_speaker->level_w((data & 0x180 && m_o & 0x80) ? 1 : 0);
-}
-
-WRITE16_MEMBER(elecdet_state::write_o)
-{
- // O0,O1,O4,O6: input mux
- // O0-O6: led segments A-G
- // O7: speaker out
- m_o = data;
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-INPUT_CHANGED_MEMBER(elecdet_state::power_button)
-{
- m_power_on = (bool)(FPTR)param;
- m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE);
-}
-
-/* physical button layout and labels is like this:
-
- [1] [2] [3] [SUSPECT]
- [4] [5] [6] [PRIVATE QUESTION]
- [7] [8] [9] [I ACCUSE]
- [0] [ENTER]
- [ON] [OFF] [END TURN]
-*/
-
-static INPUT_PORTS_START( elecdet )
- PORT_START("IN.0") // O0 pin18
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
-
- PORT_START("IN.1") // O1 pin17
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.2") // O4 pin14
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
-
- PORT_START("IN.3") // O6 pin12
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
-
- // note: even though power buttons are on the matrix, they are not CPU-controlled
- PORT_START("IN.4") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, elecdet_state, power_button, (void *)true)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, elecdet_state, power_button, (void *)false)
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-WRITE_LINE_MEMBER(elecdet_state::auto_power_off)
-{
- // TMS0980 auto power-off opcode
- if (state)
- {
- m_power_on = false;
- m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- }
-}
-
-
-void elecdet_state::machine_reset()
-{
- m_power_on = true;
-}
-
-void elecdet_state::machine_start()
-{
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_cache, 0, sizeof(m_display_cache));
- memset(m_display_decay, 0, sizeof(m_display_decay));
-
- m_o = 0;
- m_power_on = false;
-
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_cache));
- save_item(NAME(m_display_decay));
-
- save_item(NAME(m_o));
- save_item(NAME(m_power_on));
-}
-
-
-static MACHINE_CONFIG_START( elecdet, elecdet_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS0980, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(elecdet_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(elecdet_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(elecdet_state, write_r))
- MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(elecdet_state, auto_power_off))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", elecdet_state, display_decay_tick, attotime::from_msec(1))
-
- MCFG_DEFAULT_LAYOUT(layout_elecdet)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( elecdet )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "tms0980nll_mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) )
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_elecdet_opla.pla", 0, 352, CRC(652d19c3) SHA1(75550c2b293453b6b9efed88c8cc77195a53161f) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_elecdet_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-
-CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE )
diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c
index fe41dd32c4c..3a655fbd309 100644
--- a/src/mess/drivers/hh_tms1k.c
+++ b/src/mess/drivers/hh_tms1k.c
@@ -14,9 +14,18 @@
#include "sound/speaker.h"
#include "amaztron.lh"
+#include "bankshot.lh"
+#include "cnsector.lh"
#include "ebball.lh"
+#include "elecdet.lh"
#include "comp4.lh"
+#include "mathmagi.lh"
+#include "merlin.lh"
#include "simon.lh"
+#include "splitsec.lh"
+#include "starwbc.lh"
+#include "stopthie.lh"
+#include "tandy12.lh"
#include "tc4.lh"
@@ -28,22 +37,33 @@ public:
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN"),
m_speaker(*this, "speaker"),
+ m_display_wait(33),
m_display_maxy(1),
- m_display_maxx(0),
- m_display_wait(50)
+ m_display_maxx(0)
{ }
+ // devices
required_device<cpu_device> m_maincpu;
optional_ioport_array<7> m_inp_matrix; // max 7
optional_device<speaker_sound_device> m_speaker;
+ // misc common
UINT16 m_r;
UINT16 m_o;
UINT16 m_inp_mux;
+ bool m_power_on;
+ UINT8 read_inputs(int columns);
+ DECLARE_INPUT_CHANGED_MEMBER(tms0980_power_button);
+ DECLARE_WRITE_LINE_MEMBER(tms0980_auto_power_off);
+
+ virtual void machine_start();
+ virtual void machine_reset();
+
+ // display common
+ int m_display_wait;
int m_display_maxy;
int m_display_maxx;
- int m_display_wait;
UINT32 m_display_state[0x20];
UINT32 m_display_cache[0x20];
@@ -51,31 +71,71 @@ public:
UINT16 m_7seg_mask[0x20];
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- bool index_is_7segled(int index);
void display_update();
- UINT8 read_inputs(int columns);
-
// game-specific handlers
+ void mathmagi_display();
+ DECLARE_READ8_MEMBER(mathmagi_read_k);
+ DECLARE_WRITE16_MEMBER(mathmagi_write_r);
+ DECLARE_WRITE16_MEMBER(mathmagi_write_o);
+
void amaztron_display();
DECLARE_READ8_MEMBER(amaztron_read_k);
- DECLARE_WRITE16_MEMBER(amaztron_write_o);
DECLARE_WRITE16_MEMBER(amaztron_write_r);
+ DECLARE_WRITE16_MEMBER(amaztron_write_o);
void tc4_display();
DECLARE_READ8_MEMBER(tc4_read_k);
- DECLARE_WRITE16_MEMBER(tc4_write_o);
DECLARE_WRITE16_MEMBER(tc4_write_r);
+ DECLARE_WRITE16_MEMBER(tc4_write_o);
+
+ DECLARE_READ8_MEMBER(elecdet_read_k);
+ DECLARE_WRITE16_MEMBER(elecdet_write_r);
+ DECLARE_WRITE16_MEMBER(elecdet_write_o);
+
+ void starwbc_display();
+ DECLARE_READ8_MEMBER(starwbc_read_k);
+ DECLARE_WRITE16_MEMBER(starwbc_write_r);
+ DECLARE_WRITE16_MEMBER(starwbc_write_o);
DECLARE_READ8_MEMBER(comp4_read_k);
- DECLARE_WRITE16_MEMBER(comp4_write_o);
DECLARE_WRITE16_MEMBER(comp4_write_r);
+ DECLARE_WRITE16_MEMBER(comp4_write_o);
DECLARE_READ8_MEMBER(simon_read_k);
- DECLARE_WRITE16_MEMBER(simon_write_o);
DECLARE_WRITE16_MEMBER(simon_write_r);
+ DECLARE_WRITE16_MEMBER(simon_write_o);
- virtual void machine_start();
+ DECLARE_READ8_MEMBER(cnsector_read_k);
+ DECLARE_WRITE16_MEMBER(cnsector_write_r);
+ DECLARE_WRITE16_MEMBER(cnsector_write_o);
+
+ DECLARE_READ8_MEMBER(merlin_read_k);
+ DECLARE_WRITE16_MEMBER(merlin_write_r);
+ DECLARE_WRITE16_MEMBER(merlin_write_o);
+
+ DECLARE_READ8_MEMBER(stopthief_read_k);
+ DECLARE_WRITE16_MEMBER(stopthief_write_r);
+ DECLARE_WRITE16_MEMBER(stopthief_write_o);
+
+ void bankshot_display();
+ DECLARE_READ8_MEMBER(bankshot_read_k);
+ DECLARE_WRITE16_MEMBER(bankshot_write_r);
+ DECLARE_WRITE16_MEMBER(bankshot_write_o);
+
+ void splitsec_display();
+ DECLARE_READ8_MEMBER(splitsec_read_k);
+ DECLARE_WRITE16_MEMBER(splitsec_write_r);
+ DECLARE_WRITE16_MEMBER(splitsec_write_o);
+
+ void tandy12_display();
+ DECLARE_READ8_MEMBER(tandy12_read_k);
+ DECLARE_WRITE16_MEMBER(tandy12_write_r);
+ DECLARE_WRITE16_MEMBER(tandy12_write_o);
+
+ DECLARE_READ8_MEMBER(unk3403_read_k);
+ DECLARE_WRITE16_MEMBER(unk3403_write_r);
+ DECLARE_WRITE16_MEMBER(unk3403_write_o);
};
@@ -86,10 +146,11 @@ void hh_tms1k_state::machine_start()
memset(m_display_cache, 0, sizeof(m_display_cache));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_7seg_mask, 0, sizeof(m_7seg_mask));
-
+
m_o = 0;
m_r = 0;
m_inp_mux = 0;
+ m_power_on = false;
// register for savestates
save_item(NAME(m_display_maxy));
@@ -104,15 +165,33 @@ void hh_tms1k_state::machine_start()
save_item(NAME(m_o));
save_item(NAME(m_r));
save_item(NAME(m_inp_mux));
+ save_item(NAME(m_power_on));
}
+void hh_tms1k_state::machine_reset()
+{
+ m_power_on = true;
+}
+
/***************************************************************************
Helper Functions
***************************************************************************/
+// LED segments
+enum
+{
+ lA = 0x01,
+ lB = 0x02,
+ lC = 0x04,
+ lD = 0x08,
+ lE = 0x10,
+ lF = 0x20,
+ lG = 0x40,
+ lDP = 0x80
+};
// The device strobes the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
@@ -129,7 +208,7 @@ void hh_tms1k_state::display_update()
for (int x = 0; x < m_display_maxx; x++)
{
// turn on powered segments
- if (m_display_state[y] >> x & 1)
+ if (m_power_on && m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
@@ -177,7 +256,21 @@ UINT8 hh_tms1k_state::read_inputs(int columns)
return k;
}
+INPUT_CHANGED_MEMBER(hh_tms1k_state::tms0980_power_button)
+{
+ m_power_on = (bool)(FPTR)param;
+ m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE);
+}
+WRITE_LINE_MEMBER(hh_tms1k_state::tms0980_auto_power_off)
+{
+ // TMS0980 auto power-off opcode
+ if (state)
+ {
+ m_power_on = false;
+ m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+ }
+}
/***************************************************************************
@@ -187,6 +280,185 @@ UINT8 hh_tms1k_state::read_inputs(int columns)
/***************************************************************************
+ APF Mathemagician
+ * TMS1100 MCU, labeled MP1030
+ * 2 x DS8870N - Hex LED Digit Driver
+ * 2 x DS8861N - MOS-to-LED 5-Segment Driver
+
+ This is a tabletop educational calculator. It came with plastic overlays
+ for playing different kind of games. Refer to the manual on how to use it.
+ In short, to start from scratch, press [SEL]. By default the device is in
+ calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT],
+ one of the games is started.
+
+ 1) Number Machine
+ 2) Countin' On
+ 3) Walk The Plank
+ 4) Gooey Gumdrop
+ 5) Football
+ 6) Lunar Lander
+
+
+ TODO:
+ - some of the led symbols are probably wrong, output PLA is unknown
+ - microinstructions PLA is not verified
+
+***************************************************************************/
+
+void hh_tms1k_state::mathmagi_display()
+{
+ m_display_maxy = 11;
+ m_display_maxx = 8;
+
+ // R0-R7: 7seg leds
+ for (int y = 0; y < 8; y++)
+ {
+ m_7seg_mask[y] = 0x7f;
+ m_display_state[y] = (m_r >> y & 1) ? ((m_o >> 1 & 0x7f) | (m_o << 7 & 0x80)) : 0;
+ }
+
+ // R8: custom math symbols digit
+ // R9: custom equals digit
+ // R10: misc lamps
+ for (int y = 8; y < 11; y++)
+ m_display_state[y] = (m_r >> y & 1) ? m_o : 0;
+
+ display_update();
+}
+
+READ8_MEMBER(hh_tms1k_state::mathmagi_read_k)
+{
+ return read_inputs(6);
+}
+
+
+WRITE16_MEMBER(hh_tms1k_state::mathmagi_write_r)
+{
+ // R3,R5-R7,R9,R10: input mux
+ m_inp_mux = (data >> 3 & 1) | (data >> 4 & 0xe) | (data >> 5 & 0x30);
+
+ // +others:
+ m_r = data;
+ mathmagi_display();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::mathmagi_write_o)
+{
+ // O1-O7: led segments A-G
+ // O0: N/C
+ data = (data << 1 & 0xfe) | (data >> 7 & 1); // because opla is unknown
+ m_o = data;
+}
+
+/* physical button layout and labels is like this:
+
+ ON ONE [SEL] [NXT] [?] [/]
+ | | [7] [8] [9] [x]
+ OFF TWO [4] [5] [6] [-]
+ PLAYERS [1] [2] [3] [+]
+ [0] [_] [r] [=]
+*/
+
+static INPUT_PORTS_START( mathmagi )
+ PORT_START("IN.0") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
+
+ PORT_START("IN.1") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
+
+ PORT_START("IN.2") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+
+ PORT_START("IN.3") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
+
+ PORT_START("IN.4") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+
+ PORT_START("IN.5") // R10
+ PORT_CONFNAME( 0x01, 0x00, "Players")
+ PORT_CONFSETTING( 0x00, "1" )
+ PORT_CONFSETTING( 0x01, "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 )
+INPUT_PORTS_END
+
+static const UINT16 mathmagi_output_pla[0x20] =
+{
+ lA+lB+lC+lD+lE+lF, // 0
+ lB+lC, // 1
+ lA+lB+lG+lE+lD, // 2
+ lA+lB+lG+lC+lD, // 3
+ lF+lB+lG+lC, // 4
+ lA+lF+lG+lC+lD, // 5
+ lA+lF+lG+lC+lD+lE, // 6
+ lA+lB+lC, // 7
+ lA+lB+lC+lD+lE+lF+lG, // 8
+ lA+lB+lG+lF+lC+lD, // 9
+ lA+lB+lG+lE, // question mark
+ lE+lG, // r
+ lD, // underscore?
+ lA+lF+lG+lE+lD, // E
+ lG, // -
+ 0, // empty
+ 0, // empty
+ lG, // lamp 4 or MATH -
+ lD, // lamp 3
+ lF+lE+lD+lC+lG, // b
+ lB, // lamp 2
+ lB+lG, // MATH +
+ lB+lC, // MATH mul
+ lF+lG+lB+lC+lD, // y
+ lA, // lamp 1
+ lA+lG, // MATH div
+ lA+lD, // EQUALS
+ 0, // ?
+ 0, // ?
+ lE+lD+lC+lG, // o
+ 0, // ?
+ lA+lF+lE+lD+lC // G
+};
+
+
+static MACHINE_CONFIG_START( mathmagi, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 175000) // RC osc. R=68K, C=82pf -> ~175kHz
+ MCFG_TMS1XXX_OUTPUT_PLA(mathmagi_output_pla)
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, mathmagi_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, mathmagi_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, mathmagi_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_mathmagi)
+
+ /* no video! */
+
+ /* no sound! */
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
Coleco Amaze-A-Tron, by Ralph Baer
* TMS1100 MCU, labeled MP3405(die label too)
@@ -209,7 +481,7 @@ void hh_tms1k_state::amaztron_display()
m_display_state[y] = (m_r >> (y + 8) & 1) ? m_o : 0;
}
- // R6,R7: lamps -> lamp20, lamp21
+ // R6,R7: lamps (-> lamp20,21)
m_display_state[2] = m_r >> 6 & 3;
display_update();
@@ -296,11 +568,10 @@ static MACHINE_CONFIG_START( amaztron, hh_tms1k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1100, 350000) // RC osc. R=33K?, C=100pf -> ~350kHz
MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, amaztron_read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, amaztron_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, amaztron_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, amaztron_write_o))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
-
MCFG_DEFAULT_LAYOUT(layout_amaztron)
/* no video! */
@@ -354,6 +625,7 @@ MACHINE_CONFIG_END
void hh_tms1k_state::tc4_display()
{
+ m_display_wait = 50;
m_display_maxy = 10;
m_display_maxx = 9;
@@ -380,13 +652,6 @@ READ8_MEMBER(hh_tms1k_state::tc4_read_k)
return k;
}
-WRITE16_MEMBER(hh_tms1k_state::tc4_write_o)
-{
- // O0-O7: leds/7segment
- m_o = data;
- tc4_display();
-}
-
WRITE16_MEMBER(hh_tms1k_state::tc4_write_r)
{
// R10: speaker out
@@ -402,6 +667,13 @@ WRITE16_MEMBER(hh_tms1k_state::tc4_write_r)
tc4_display();
}
+WRITE16_MEMBER(hh_tms1k_state::tc4_write_o)
+{
+ // O0-O7: leds/7segment
+ m_o = data;
+ tc4_display();
+}
+
static INPUT_PORTS_START( tc4 )
PORT_START("IN.0") // R0
@@ -453,11 +725,10 @@ static MACHINE_CONFIG_START( tc4, hh_tms1k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1400, 450000) // approximation - RC osc. R=27.3K, C=100pf, but unknown RC curve
MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, tc4_read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, tc4_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, tc4_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, tc4_write_o))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
-
MCFG_DEFAULT_LAYOUT(layout_tc4)
/* no video! */
@@ -469,6 +740,281 @@ static MACHINE_CONFIG_START( tc4, hh_tms1k_state )
MACHINE_CONFIG_END
+/***************************************************************************
+
+ Entex Baseball
+ * TMS1000NLP MP0914 (die labeled MP0914A)
+
+***************************************************************************/
+
+// inputs
+static INPUT_PORTS_START( ebball )
+INPUT_PORTS_END
+
+// machine config
+static MACHINE_CONFIG_START( ebball, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1000, 350000) // RC osc. R=43K, C=47pf -> ~350kHz
+
+ MCFG_DEFAULT_LAYOUT(layout_ebball)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+/***************************************************************************
+
+ Ideal Electronic Detective
+ * TMS0980NLL MP6100A (die labeled 0980B-00)
+ hardware (and concept) is very similar to Parker Bros Stop Thief
+
+ This is an electronic board game. It requires game cards with suspect info,
+ and good old pen and paper to record game progress. To start the game, enter
+ difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the
+ manual for more information.
+
+
+ TODO:
+ - MCU clock is unknown
+
+***************************************************************************/
+
+
+READ8_MEMBER(hh_tms1k_state::elecdet_read_k)
+{
+ // note: the Vss row is always on
+ return m_inp_matrix[4]->read() | read_inputs(4);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::elecdet_write_r)
+{
+ m_display_maxy = 7;
+ m_display_maxx = 7;
+
+ // R0-R6: select digit
+ UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3);
+ for (int y = 0; y < m_display_maxy; y++)
+ {
+ m_7seg_mask[y] = 0x7f;
+ m_display_state[y] = (data >> y & 1) ? o : 0;
+ }
+
+ display_update();
+
+ // R7,R8: speaker on
+ m_speaker->level_w((data & 0x180 && m_o & 0x80) ? 1 : 0);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::elecdet_write_o)
+{
+ // O0,O1,O4,O6: input mux
+ m_inp_mux = (data & 3) | (data >> 2 & 4) | (data >> 3 & 8);
+
+ // O0-O6: led segments A-G
+ // O7: speaker out
+ m_o = data;
+}
+
+
+/* physical button layout and labels is like this:
+
+ [1] [2] [3] [SUSPECT]
+ [4] [5] [6] [PRIVATE QUESTION]
+ [7] [8] [9] [I ACCUSE]
+ [0] [ENTER]
+ [ON] [OFF] [END TURN]
+*/
+
+static INPUT_PORTS_START( elecdet )
+ PORT_START("IN.0") // O0 pin18
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+
+ PORT_START("IN.1") // O1 pin17
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // O4 pin14
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+
+ PORT_START("IN.3") // O6 pin12
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+
+ // note: even though power buttons are on the matrix, they are not CPU-controlled
+ PORT_START("IN.4") // Vss!
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)true)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)false)
+INPUT_PORTS_END
+
+
+static MACHINE_CONFIG_START( elecdet, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS0980, 425000) // approximation - unknown freq
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, elecdet_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, elecdet_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, elecdet_write_o))
+ MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, tms0980_auto_power_off))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_elecdet)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
+ Kenner Star Wars - Electronic Battle Command
+ * TMS1100 MCU, labeled MP3438A
+
+ This is a small tabletop space-dogfighting game. To start the game,
+ press BASIC/INTER/ADV and enter P#(number of players), then
+ START TURN. Refer to the official manual for more information.
+
+***************************************************************************/
+
+void hh_tms1k_state::starwbc_display()
+{
+ m_display_maxy = 10;
+ m_display_maxx = 8;
+
+ UINT8 o = (m_o << 4 & 0xf0) | (m_o >> 4 & 0x0f);
+ for (int y = 0; y < m_display_maxy; y+=2)
+ {
+ m_display_state[y] = (m_r >> y & 1) ? o : 0;
+
+ // R6,R8 are 7segs
+ if (y == 6 || y == 8)
+ m_7seg_mask[y] = 0x7f;
+ }
+
+ display_update();
+}
+
+READ8_MEMBER(hh_tms1k_state::starwbc_read_k)
+{
+ return read_inputs(5);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::starwbc_write_r)
+{
+ // R0,R1,R3,R5,R7: input mux
+ m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10);
+
+ // R9: piezo speaker
+ m_speaker->level_w(data >> 9 & 1);
+
+ // R0,R2,R4,R6,R8: leds
+ m_r = data;
+ starwbc_display();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::starwbc_write_o)
+{
+ // O0-O7: leds state
+ m_o = data;
+ starwbc_display();
+}
+
+
+
+/* physical button layout and labels is like this:
+
+ (reconnnaissance=yellow) (tactical reaction=green)
+ [MAGNA] [ENEMY] [EM] [BS] [SCR]
+
+ [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE]
+ [ADV] [P#] [<] [^] [>] [v]
+ (game=blue) (maneuvers=red)
+*/
+
+static INPUT_PORTS_START( starwbc )
+ PORT_START("IN.0") // R0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number")
+
+ PORT_START("IN.1") // R1
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn")
+
+ PORT_START("IN.2") // R3
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up")
+
+ PORT_START("IN.3") // R5
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Fire")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations")
+
+ PORT_START("IN.4") // R7
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right")
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START( starwbc, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 300000) // RC osc. R=51K, C=47pf -> ~300kHz
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, starwbc_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, starwbc_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, starwbc_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_starwbc)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
/***************************************************************************
@@ -542,11 +1088,10 @@ static MACHINE_CONFIG_START( comp4, hh_tms1k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS0970, 250000) // approximation - unknown freq
MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, comp4_read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, comp4_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, comp4_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, comp4_write_o))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
-
MCFG_DEFAULT_LAYOUT(layout_comp4)
/* no video! */
@@ -572,16 +1117,6 @@ MACHINE_CONFIG_END
***************************************************************************/
-
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
READ8_MEMBER(hh_tms1k_state::simon_read_k)
{
return read_inputs(4);
@@ -647,11 +1182,10 @@ static MACHINE_CONFIG_START( simon, hh_tms1k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS1000, 350000) // RC osc. R=33K, C=100pf -> ~350kHz
MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, simon_read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, simon_write_o))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, simon_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, simon_write_o))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
-
MCFG_DEFAULT_LAYOUT(layout_simon)
/* no video! */
@@ -665,25 +1199,683 @@ MACHINE_CONFIG_END
+/***************************************************************************
+
+ Parker Brothers Code Name: Sector, by Bob Doyle
+ * MP0905BNL ZA0379 (die labeled 0970F-05B)
+
+ This is a tabletop submarine pursuit game. A grid board and small toy
+ boats are used to remember your locations (a Paint app should be ok too).
+ Refer to the official manual for more information, it is not a simple game.
+
+
+ TODO:
+ - MCU clock is unknown
+
+***************************************************************************/
+
+READ8_MEMBER(hh_tms1k_state::cnsector_read_k)
+{
+ return read_inputs(5);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::cnsector_write_r)
+{
+ m_display_maxy = 7;
+ m_display_maxx = 8;
+
+ // R0-R5: select digit (right-to-left)
+ for (int y = 0; y < 6; y++)
+ {
+ m_7seg_mask[y] = 0xff;
+ m_display_state[y] = (data >> y & 1) ? m_o : 0;
+ }
+
+ // R6-R9: direction leds (-> lamp60-63)
+ m_display_state[6] = data >> 6 & 0xf;
+
+ display_update();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::cnsector_write_o)
+{
+ // O0-O4: input mux
+ m_inp_mux = data & 0x1f;
+
+ // O0-O7: digit segments
+ m_o = data;
+}
+
+
+
+static INPUT_PORTS_START( cnsector )
+ PORT_START("IN.0") // O0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range")
+
+ PORT_START("IN.1") // O1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // O2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
+
+ PORT_START("IN.3") // O3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
+ 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_UNUSED )
+
+ PORT_START("IN.4") // O4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
+INPUT_PORTS_END
+
+
+static MACHINE_CONFIG_START( cnsector, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS0970, 250000) // approximation - unknown freq
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, cnsector_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, cnsector_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, cnsector_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_cnsector)
+
+ /* no video! */
+
+ /* no sound! */
+MACHINE_CONFIG_END
+
+
+
/***************************************************************************
- Entex Baseball
- * TMS1000NLP MP0914 (die labeled MP0914A)
+ Parker Bros Merlin handheld computer game, by Bob Doyle
+ * TMS1100NLL MP3404A-N2
+
+ To start a game, press NEW GAME, followed by a number:
+ 1: Tic-Tac-Toe
+ 2: Music Machine
+ 3: Echo
+ 4: Blackjack 13
+ 5: Magic Square
+ 6: Mindbender
+
+ Refer to the official manual for more information on the games.
+
+
+ Other handhelds assumed to be on similar hardware:
+ - Dr. Smith - by Tomy, released in Japan (basically a white version of Merlin,
+ let's assume for now that the ROM contents is identical)
+ - Master Merlin
***************************************************************************/
-// inputs
-static INPUT_PORTS_START( ebball )
+READ8_MEMBER(hh_tms1k_state::merlin_read_k)
+{
+ return read_inputs(4);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::merlin_write_r)
+{
+ /* leds:
+
+ R0
+ R1 R2 R3
+ R4 R5 R6
+ R7 R8 R9
+ R10
+ */
+ m_display_maxx = 11;
+ m_display_state[0] = data;
+ display_update();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::merlin_write_o)
+{
+ // O4-O6: speaker out (paralleled for increased current driving capability)
+ static const int count[8] = { 0, 1, 1, 2, 1, 2, 2, 3 };
+ m_speaker->level_w(count[data >> 4 & 7]);
+
+ // O0-O3: input mux
+ // O7: N/C
+ m_inp_mux = data & 0xf;
+}
+
+
+
+static INPUT_PORTS_START( merlin )
+ PORT_START("IN.0") // O0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2")
+
+ PORT_START("IN.1") // O1
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6")
+
+ PORT_START("IN.2") // O2
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Same Game")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10")
+
+ PORT_START("IN.3") // O3
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game")
INPUT_PORTS_END
-// machine config
-static MACHINE_CONFIG_START( ebball, hh_tms1k_state )
+
+static const INT16 merlin_speaker_levels[] = { 0, 10922, 21845, 32767 };
+
+
+static MACHINE_CONFIG_START( merlin, hh_tms1k_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 350000) // RC osc. R=43K, C=47pf -> ~350kHz
+ MCFG_CPU_ADD("maincpu", TMS1100, 350000) // RC osc. R=33K, C=100pf -> ~350kHz
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, merlin_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, merlin_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, merlin_write_o))
- MCFG_DEFAULT_LAYOUT(layout_ebball)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_merlin)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SPEAKER_LEVELS(4, merlin_speaker_levels)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+/***************************************************************************
+
+ Parker Brothers Stop Thief, by Bob Doyle
+ * TMS0980NLL MP6101B (die labeled 0980B-01A)
+
+ Stop Thief is actually a board game, the electronic device emulated here
+ (called Electronic Crime Scanner) is an accessory. To start a game, press
+ the ON button. Otherwise, it is in test-mode where you can hear all sounds.
+
+
+ TODO:
+ - MCU clock is unknown
+ - stopthiep: unable to start a game (may be intentional?)
+
+***************************************************************************/
+
+READ8_MEMBER(hh_tms1k_state::stopthief_read_k)
+{
+ // note: the Vss row is always on
+ return m_inp_matrix[2]->read() | read_inputs(2);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::stopthief_write_r)
+{
+ m_display_maxy = 3;
+ m_display_maxx = 7;
+
+ // R0-R2: select digit
+ UINT8 o = BITSWAP8(m_o,3,5,2,1,4,0,6,7);
+ for (int y = 0; y < m_display_maxy; y++)
+ {
+ m_7seg_mask[y] = 0x7f;
+ m_display_state[y] = (data >> y & 1) ? o : 0;
+ }
+
+ display_update();
+
+ // R3-R8: speaker on
+ m_speaker->level_w((data & 0x1f8 && m_o & 8) ? 1 : 0);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::stopthief_write_o)
+{
+ // O0,O6: input mux
+ m_inp_mux = (data & 1) | (data >> 5 & 2);
+
+ // O3: speaker out
+ // O0-O2,O4-O7: led segments A-G
+ m_o = data;
+}
+
+
+/* physical button layout and labels is like this:
+
+ [1] [2] [OFF]
+ [3] [4] [ON]
+ [5] [6] [T, TIP]
+ [7] [8] [A, ARREST]
+ [9] [0] [C, CLUE]
+*/
+
+static INPUT_PORTS_START( stopthief )
+ PORT_START("IN.0") // O0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+
+ PORT_START("IN.1") // O6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+
+ // note: even though power buttons are on the matrix, they are not CPU-controlled
+ PORT_START("IN.2") // Vss!
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)true)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)false)
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START( stopthief, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS0980, 425000) // approximation - unknown freq
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, stopthief_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, stopthief_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, stopthief_write_o))
+ MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, tms0980_auto_power_off))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_stopthie)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+/***************************************************************************
+
+ Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen
+ * TMS1400NLL MP7313-N2 (die labeled MP7313)
+
+ Bank Shot is an electronic pool game. To select a game, repeatedly press
+ the [SELECT] button, then press [CUE UP] to start. Refer to the official
+ manual for more information. The game selections are:
+ 1: Straight Pool (1 player)
+ 2: Straight Pool (2 players)
+ 3: Poison Pool
+ 4: Trick Shots
+
+
+ TODO:
+ - bankshot: the cue ball led is strobed more often than other leds,
+ making it look brighter. We need more accurate led decay simulation
+ for this to work.
+ - MCU clock is unknown
+
+***************************************************************************/
+
+void hh_tms1k_state::bankshot_display()
+{
+ m_display_maxy = 11;
+ m_display_maxx = 7;
+
+ // update current state
+ for (int y = 0; y < m_display_maxy; y++)
+ m_display_state[y] = (m_r >> y & 1) ? m_o : 0;
+
+ display_update();
+}
+
+READ8_MEMBER(hh_tms1k_state::bankshot_read_k)
+{
+ return read_inputs(2);
+}
+
+
+WRITE16_MEMBER(hh_tms1k_state::bankshot_write_r)
+{
+ // R0: speaker out
+ m_speaker->level_w(data & 1);
+
+ // R2,R3: input mux
+ m_inp_mux = data >> 2 & 3;
+
+ // R2-R10: led rows
+ m_r = data & ~3;
+ bankshot_display();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::bankshot_write_o)
+{
+ // O0-O6: led columns
+ // O7: N/C
+ m_o = data;
+ bankshot_display();
+}
+
+
+
+
+/* physical button layout and labels is like this:
+ (note: remember that you can rotate the display in MESS)
+
+ [SELECT [BALL UP] [BALL OVER]
+ SCORE]
+
+ ------ led display ------
+
+ [ANGLE] [AIM] [CUE UP
+ SHOOT]
+*/
+
+static INPUT_PORTS_START( bankshot )
+ PORT_START("IN.0") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up / Shoot")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select / Score")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static MACHINE_CONFIG_START( bankshot, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf, but unknown RC curve
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, bankshot_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, bankshot_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, bankshot_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_bankshot)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+/***************************************************************************
+
+ Parker Brothers Split Second
+ * TMS1400NLL MP7314-N2 (die labeled MP7314)
+
+ This is an electronic handheld reflex gaming device, it's straightforward
+ to use. The included mini-games are:
+ 1, 2, 3: Mad Maze*
+ 4, 5: Space Attack*
+ 6: Auto Cross
+ 7: Stomp
+ 8: Speedball
+
+ *: higher number indicates higher difficulty
+
+***************************************************************************/
+
+
+/* display layout, where number xy is lamp R(x),O(y)
+
+ 00 02 04
+ 10 01 12 03 14 05 16
+ 11 13 15
+ 20 21 22 23 24 25 26
+ 31 33 35
+ 30 41 32 43 34 45 36
+ 51 53 55
+ 40 61 42 63 44 65 46
+ 71 73 75
+ 50 60 52 62 54 64 56
+ 70 72 74
+*/
+
+void hh_tms1k_state::splitsec_display()
+{
+ m_display_maxy = 8;
+ m_display_maxx = 7;
+
+ // update current state
+ for (int y = 0; y < m_display_maxy; y++)
+ m_display_state[y] = (m_r >> y & 1) ? m_o : 0;
+
+ display_update();
+}
+
+READ8_MEMBER(hh_tms1k_state::splitsec_read_k)
+{
+ return read_inputs(2);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::splitsec_write_r)
+{
+ // R8: speaker out
+ m_speaker->level_w(data >> 8 & 1);
+
+ // R9,R10: input mux
+ m_inp_mux = data >> 9 & 3;
+
+ // R0-R7: led rows
+ m_r = data;
+ display_update();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::splitsec_write_o)
+{
+ // O0-O6: led columns
+ // O7: N/C
+ m_o = data;
+ splitsec_display();
+}
+
+static INPUT_PORTS_START( splitsec )
+ PORT_START("IN.0") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 4 separate directional buttons, hence 16way
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R10
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START( splitsec, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf, but unknown RC curve
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, splitsec_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, splitsec_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, splitsec_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_splitsec)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+
+
+/***************************************************************************
+
+ Tandy Radio Shack Computerized Arcade (1981, 1982, 1995)
+ * TMS1100 CD7282SL
+
+ This handheld contains 12 minigames. It looks and plays like "Fabulous Fred"
+ by the Japanese company Mego Corp. in 1980, which in turn is a mix of Merlin
+ and Simon. Unlike Merlin and Simon, spin-offs like these were not successful.
+ 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; 4 C-cells and a 9-volt.
+
+ Some of the games require accessories included with the toy (eg. the Baseball
+ game is played with a board representing the playing field). To start a game,
+ hold the [SELECT] button, then press [START] when the game button lights up.
+ As always, refer to the official manual for more information.
+
+ See below at the input defs for a list of the games.
+
+
+ TODO:
+ - output PLA is not verified
+ - microinstructions PLA is not verified
+
+***************************************************************************/
+
+void hh_tms1k_state::tandy12_display()
+{
+ m_display_maxx = 13;
+
+ // O0-O7: button lamps 1-8, R0-R3: button lamps 9-12
+ m_display_state[0] = (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00);
+ display_update();
+}
+
+READ8_MEMBER(hh_tms1k_state::tandy12_read_k)
+{
+ return read_inputs(5);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::tandy12_write_r)
+{
+ // R10: speaker out
+ m_speaker->level_w(data >> 10 & 1);
+
+ // R5-R9: input mux
+ m_inp_mux = data >> 5 & 0x1f;
+
+ // other bits:
+ m_r = data;
+ tandy12_display();
+}
+
+WRITE16_MEMBER(hh_tms1k_state::tandy12_write_o)
+{
+ m_o = data;
+ tandy12_display();
+}
+
+
+/* physical button layout and labels is like this:
+
+ REPEAT-2 SPACE-2
+ [O] OFF--ON [O]
+
+ [purple]1 [blue]5 [l-green]9
+ ORGAN TAG-IT TREASURE HUNT
+
+ [l-orange]2 [turquoise]6 [red]10
+ SONG WRITER ROULETTE COMPETE
+
+ [pink]3 [yellow]7 [violet]11
+ REPEAT BASEBALL FIRE AWAY
+
+ [green]4 [orange]8 [brown]12
+ TORPEDO REPEAT PLUS HIDE 'N SEEK
+
+ [O] [O] [O]
+ START SELECT PLAY-2/HIT-7
+*/
+
+static INPUT_PORTS_START( tandy12 )
+ PORT_START("IN.0") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("12")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("11")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_START("IN.1") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start")
+
+ PORT_START("IN.2") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.3") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+
+ PORT_START("IN.4") // R9
+ 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_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ 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_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+INPUT_PORTS_END
+
+
+static const UINT16 tandy12_output_pla[0x20] =
+{
+ // these are certain
+ 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
+ 0x80, 0x00, 0x00, 0x00, 0x00,
+
+ // rest is unused?
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+
+static MACHINE_CONFIG_START( tandy12, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 400000) // RC osc. R=39K, C=47pf -> ~400kHz
+ MCFG_TMS1XXX_OUTPUT_PLA(tandy12_output_pla)
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, tandy12_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, tandy12_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, tandy12_write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_tandy12)
/* no video! */
@@ -697,11 +1889,112 @@ MACHINE_CONFIG_END
/***************************************************************************
+ TMS1100NLL MP3403 DBS 7836 SINGAPORE some game board with 7-segs.
+
+ What old electronic game is this?
+
+ some clues:
+ - it's from 1978
+ - Merlin is MP3404, Amaze-A-Tron is MP3405, this one is MP3403
+ - it plays some short jingles (you need to be lucky with button mashing),
+ jingles feel like maybe a horse racing game, or casino
+
+***************************************************************************/
+
+READ8_MEMBER(hh_tms1k_state::unk3403_read_k)
+{
+ return read_inputs(4);
+}
+
+WRITE16_MEMBER(hh_tms1k_state::unk3403_write_r)
+{
+ // R4-R7: input mux
+ m_inp_mux = data >> 4 & 0xf;
+
+ // R9: speaker out
+ m_speaker->level_w(data >> 9 & 1);
+
+ // R10: maybe a switch or other button row?
+ // others: ?
+}
+
+WRITE16_MEMBER(hh_tms1k_state::unk3403_write_o)
+{
+ // ?
+}
+
+static INPUT_PORTS_START( unk3403 )
+ PORT_START("IN.0") // R4
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)
+
+ PORT_START("IN.1") // R5
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)
+
+ PORT_START("IN.2") // R6
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) // reset/newgame?
+
+ PORT_START("IN.3") // R7
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)
+INPUT_PORTS_END
+
+static const UINT16 unk3403_output_pla[0x20] =
+{
+ /* O output PLA configuration currently unknown */
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
+};
+
+
+static MACHINE_CONFIG_START( unk3403, hh_tms1k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - unknown freq
+ MCFG_TMS1XXX_OUTPUT_PLA(unk3403_output_pla)
+ MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, unk3403_read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, unk3403_write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, unk3403_write_o))
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+/***************************************************************************
+
Game driver(s)
***************************************************************************/
+ROM_START( mathmagi )
+ ROM_REGION( 0x800, "maincpu", 0 )
+ ROM_LOAD( "mp1030", 0x0000, 0x800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_mathmagi_opla.pla", 0, 365, NO_DUMP )
+ROM_END
+
+
ROM_START( amaztron )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "tms1100nll_mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) )
@@ -737,6 +2030,43 @@ ROM_START( ebball )
ROM_END
+ROM_START( elecdet )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tms0980nll_mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) )
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_elecdet_opla.pla", 0, 352, CRC(652d19c3) SHA1(75550c2b293453b6b9efed88c8cc77195a53161f) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_elecdet_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
+
+ROM_START( starwbc )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
+ROM_END
+
+ROM_START( starwbcp )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
+ROM_END
+
+
+
ROM_START( comp4 )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) )
@@ -762,13 +2092,132 @@ ROM_START( simon )
ROM_LOAD( "tms1000_simon_opla.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
ROM_END
+ROM_START( cnsector )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_default_ipla.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_cnsector_mpla.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0970_cnsector_opla.pla", 0, 352, CRC(7c0bdcd6) SHA1(dade774097e8095dca5deac7b2367d0c701aca51) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0970_cnsector_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) )
+ROM_END
+
+
+ROM_START( merlin )
+ ROM_REGION( 0x800, "maincpu", 0 )
+ ROM_LOAD( "mp3404", 0x0000, 0x800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_merlin_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_merlin_opla.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
+ROM_END
+
+
+ROM_START( stopthie )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tms0980nll_mp6101b", 0x0000, 0x1000, CRC(8bde5bb4) SHA1(8c318fcce67acc24c7ae361f575f28ec6f94665a) )
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
+ROM_START( stopthiep )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums)
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
+ROM_START( bankshot )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tms1400nll_mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_bankshot_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
+ROM_END
+
+
+ROM_START( splitsec )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_splitsec_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
+ROM_END
+
+
+ROM_START( tandy12 )
+ ROM_REGION( 0x800, "maincpu", 0 )
+ ROM_LOAD( "cd7282sl", 0x0000, 0x800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_tandy12_opla.pla", 0, 365, NO_DUMP )
+ROM_END
+
+ROM_START( unk3403 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "tms1100nll_mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_xxx_opla.pla", 0, 365, NO_DUMP )
+ROM_END
+
+
+
+
+
+CONS( 1980, mathmagi, 0, 0, mathmagi, mathmagi, driver_device, 0, "APF Electronics Inc.", "Mathemagician", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
+
CONS( 1979, amaztron, 0, 0, amaztron, amaztron, driver_device, 0, "Coleco", "Amaze-A-Tron", GAME_SUPPORTS_SAVE )
CONS( 1981, tc4, 0, 0, tc4, tc4, driver_device, 0, "Coleco", "Total Control 4", GAME_SUPPORTS_SAVE )
CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Entex", "Baseball (Entex)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
+CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE )
+
+CONS( 1979, starwbc, 0, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command", GAME_SUPPORTS_SAVE )
+CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command (prototype)", GAME_SUPPORTS_SAVE )
+
CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE )
+
+
+CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
+CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin", GAME_SUPPORTS_SAVE )
+CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE )
+CONS( 1979, stopthiep, stopthie, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner) (prototype)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
+CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE )
+CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE )
+
+CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE )
+
+CONS( 1978, unk3403, 0, 0, unk3403, unk3403, driver_device, 0, "<unknown>", "unknown TMS1100 electronic game", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c
new file mode 100644
index 00000000000..4a9a736c8cd
--- /dev/null
+++ b/src/mess/drivers/hh_ucom4.c
@@ -0,0 +1,226 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+ NEC uCOM4 MCU handhelds
+
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/ucom4/ucom4.h"
+#include "sound/speaker.h"
+
+#include "tmpacman.lh"
+
+
+class hh_ucom4_state : public driver_device
+{
+public:
+ hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_inp_matrix(*this, "IN"),
+ m_speaker(*this, "speaker"),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+ // devices
+ required_device<cpu_device> m_maincpu;
+ optional_ioport_array<4> m_inp_matrix; // max 4
+ optional_device<speaker_sound_device> m_speaker;
+
+ // misc common
+ UINT16 m_inp_mux;
+
+ virtual void machine_start();
+ virtual void machine_reset();
+
+ // display common
+ int m_display_wait;
+ int m_display_maxy;
+ int m_display_maxx;
+
+ UINT32 m_grid;
+ UINT32 m_plate;
+
+ UINT32 m_display_state[0x20];
+ UINT32 m_display_cache[0x20];
+ UINT8 m_display_decay[0x20][0x20];
+ UINT16 m_7seg_mask[0x20];
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+
+ // game-specific handlers
+
+};
+
+
+void hh_ucom4_state::machine_start()
+{
+ // zerofill
+ memset(m_display_state, 0, sizeof(m_display_state));
+ memset(m_display_cache, 0, sizeof(m_display_cache));
+ memset(m_display_decay, 0, sizeof(m_display_decay));
+ memset(m_7seg_mask, 0, sizeof(m_7seg_mask));
+
+ m_inp_mux = 0;
+ m_grid = 0;
+ m_plate = 0;
+
+ // register for savestates
+ save_item(NAME(m_display_maxy));
+ save_item(NAME(m_display_maxx));
+ save_item(NAME(m_display_wait));
+
+ save_item(NAME(m_display_state));
+ save_item(NAME(m_display_cache));
+ save_item(NAME(m_display_decay));
+ save_item(NAME(m_7seg_mask));
+
+ save_item(NAME(m_inp_mux));
+ save_item(NAME(m_grid));
+ save_item(NAME(m_plate));
+}
+
+
+void hh_ucom4_state::machine_reset()
+{
+}
+
+/***************************************************************************
+
+ Helper Functions
+
+***************************************************************************/
+
+// LED segments
+#if 0
+enum
+{
+ lA = 0x01,
+ lB = 0x02,
+ lC = 0x04,
+ lD = 0x08,
+ lE = 0x10,
+ lF = 0x20,
+ lG = 0x40,
+ lDP = 0x80
+};
+#endif
+
+// The device strobes the outputs very fast, it is unnoticeable to the user.
+// To prevent flickering here, we need to simulate a decay.
+
+
+void hh_ucom4_state::display_update()
+{
+ UINT32 active_state[0x20];
+
+ for (int y = 0; y < m_display_maxy; y++)
+ {
+ active_state[y] = 0;
+
+ for (int x = 0; x < m_display_maxx; x++)
+ {
+ // turn on powered segments
+ if (m_display_state[y] >> x & 1)
+ m_display_decay[y][x] = m_display_wait;
+
+ // determine active state
+ int ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ active_state[y] |= (ds << x);
+ }
+ }
+
+ // on difference, send to output
+ for (int y = 0; y < m_display_maxy; y++)
+ if (m_display_cache[y] != active_state[y])
+ {
+ if (m_7seg_mask[y] != 0)
+ output_set_digit_value(y, active_state[y] & m_7seg_mask[y]);
+
+ const int mul = (m_display_maxx <= 10) ? 10 : 100;
+ for (int x = 0; x < m_display_maxx; x++)
+ output_set_lamp_value(y * mul + x, active_state[y] >> x & 1);
+ }
+
+ memcpy(m_display_cache, active_state, sizeof(m_display_cache));
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(hh_ucom4_state::display_decay_tick)
+{
+ // slowly turn off unpowered segments
+ for (int y = 0; y < m_display_maxy; y++)
+ for (int x = 0; x < m_display_maxx; x++)
+ if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0)
+ m_display_decay[y][x]--;
+
+ display_update();
+}
+
+
+
+/***************************************************************************
+
+ Minidrivers (I/O, Inputs, Machine Config)
+
+***************************************************************************/
+
+/***************************************************************************
+
+ Tomytronic Pac-Man (manufactured in Japan)
+ * boards are labeled TN-08 2E108E01
+ * NEC uCOM-43 MCU, labeled D553C 160
+ * cyan/red/green VFD display NEC FIP8AM18T
+ * bright yellow round casing
+
+ known releases:
+ - Japan: Puck Man
+ - USA: Pac Man
+ - UK: Puckman (Tomy), and also as Munchman, published by Grandstand
+ - Australia: Pac Man-1, published by Futuretronics
+
+***************************************************************************/
+
+static INPUT_PORTS_START( tmpacman )
+INPUT_PORTS_END
+
+
+static MACHINE_CONFIG_START( tmpacman, hh_ucom4_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", NEC_D553, XTAL_430kHz)
+
+ MCFG_DEFAULT_LAYOUT(layout_tmpacman)
+
+ /* no video! */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( tmpacman )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) )
+ROM_END
+
+
+CONS( 1981, tmpacman, 0, 0, tmpacman, tmpacman, driver_device, 0, "Tomy", "Pac Man (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING )
diff --git a/src/mess/drivers/mathmagi.c b/src/mess/drivers/mathmagi.c
deleted file mode 100644
index 2fe46bfaac4..00000000000
--- a/src/mess/drivers/mathmagi.c
+++ /dev/null
@@ -1,273 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- APF Mathemagician
- * TMS1100 MP1030 - MCU
- * 2 x DS8870N - Hex LED Digit Driver
- * 2 x DS8861N - MOS-to-LED 5-Segment Driver
-
- This is a tabletop educational calculator. It came with plastic overlays
- for playing different kind of games. Refer to the manual on how to use it.
- In short, to start from scratch, press [SEL]. By default the device is in
- calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT],
- one of the games is started.
-
- 1) Number Machine
- 2) Countin' On
- 3) Walk The Plank
- 4) Gooey Gumdrop
- 5) Football
- 6) Lunar Lander
-
-
- TODO:
- - some of the led symbols are probably wrong, output PLA is unknown
- - microinstructions PLA is not verified
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-
-#include "mathmagi.lh"
-
-// master clock is a single stage RC oscillator: R=68K, C=82pf,
-// according to the TMS 1000 series data manual this is around 200kHz
-#define MASTER_CLOCK (200000)
-
-
-class mathmagi_state : public driver_device
-{
-public:
- mathmagi_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN")
- { }
-
- required_device<tms1xxx_cpu_device> m_maincpu;
- required_ioport_array<6> m_button_matrix;
-
- UINT16 m_o;
- UINT16 m_r;
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- virtual void machine_start();
-};
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(mathmagi_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 6; i++)
- {
- const int ki[6] = { 3, 5, 6, 7, 9, 10 };
- if (m_r >> ki[i] & 1)
- k |= m_button_matrix[i]->read();
- }
-
- return k;
-}
-
-WRITE16_MEMBER(mathmagi_state::write_o)
-{
- // O1-O7: led segments A-G
- // O0: N/C
- m_o = data;
-}
-
-WRITE16_MEMBER(mathmagi_state::write_r)
-{
- // R3,R5-R7,R9,R10: input mux
- // and outputs:
- for (int i = 0; i < 11; i++)
- {
- if (data >> i & 1)
- {
- // R8: custom math symbols digit
- // R9: custom equals digit
- // R10: lamps
- if (i >= 8)
- for (int j = 0; j < 8; j++)
- output_set_lamp_value(i*10 + j, m_o >> j & 1);
-
- // R0-R7: 7seg leds
- else
- output_set_digit_value(i, m_o >> 1 & 0x7f);
- }
- }
-
- m_r = data;
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-/* physical button layout and labels is like this:
-
- ON ONE [SEL] [NXT] [?] [/]
- | | [7] [8] [9] [x]
- OFF TWO [4] [5] [6] [-]
- PLAYERS [1] [2] [3] [+]
- [0] [_] [r] [=]
-*/
-
-static INPUT_PORTS_START( mathmagi )
- PORT_START("IN.0") // R3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
-
- PORT_START("IN.1") // R5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
-
- PORT_START("IN.2") // R6
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
-
- PORT_START("IN.3") // R7
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
-
- PORT_START("IN.4") // R9
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
-
- PORT_START("IN.5") // R10
- PORT_CONFNAME( 0x01, 0x00, "Players")
- PORT_CONFSETTING( 0x00, "1" )
- PORT_CONFSETTING( 0x01, "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 )
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void mathmagi_state::machine_start()
-{
- m_o = 0;
- m_r = 0;
-
- save_item(NAME(m_o));
- save_item(NAME(m_r));
-}
-
-// LED segments A-G
-enum
-{
- lA = 0x02,
- lB = 0x04,
- lC = 0x08,
- lD = 0x10,
- lE = 0x20,
- lF = 0x40,
- lG = 0x80
-};
-
-static const UINT16 mathmagi_output_pla[0x20] =
-{
- lA+lB+lC+lD+lE+lF, // 0
- lB+lC, // 1
- lA+lB+lG+lE+lD, // 2
- lA+lB+lG+lC+lD, // 3
- lF+lB+lG+lC, // 4
- lA+lF+lG+lC+lD, // 5
- lA+lF+lG+lC+lD+lE, // 6
- lA+lB+lC, // 7
- lA+lB+lC+lD+lE+lF+lG, // 8
- lA+lB+lG+lF+lC+lD, // 9
- lA+lB+lG+lE, // question mark
- lE+lG, // r
- lD, // underscore?
- lA+lF+lG+lE+lD, // E
- lG, // -
- 0, // empty
- 0, // empty
- lG, // lamp 4 or MATH -
- lD, // lamp 3
- lF+lE+lD+lC+lG, // b
- lB, // lamp 2
- lB+lG, // MATH +
- lB+lC, // MATH mul
- lF+lG+lB+lC+lD, // y
- lA, // lamp 1
- lA+lG, // MATH div
- lA+lD, // EQUALS
- 0, // ?
- 0, // ?
- lE+lD+lC+lG, // o
- 0, // ?
- lA+lF+lE+lD+lC // G
-};
-
-
-static MACHINE_CONFIG_START( mathmagi, mathmagi_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
- MCFG_TMS1XXX_OUTPUT_PLA(mathmagi_output_pla)
- MCFG_TMS1XXX_READ_K_CB(READ8(mathmagi_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mathmagi_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mathmagi_state, write_r))
-
- MCFG_DEFAULT_LAYOUT(layout_mathmagi)
-
- /* no video! */
-
- /* no sound! */
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( mathmagi )
- ROM_REGION( 0x800, "maincpu", 0 )
- ROM_LOAD( "mp1030", 0x0000, 0x800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_mathmagi_opla.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, driver_device, 0, "APF Electronics Inc.", "Mathemagician", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
diff --git a/src/mess/drivers/merlin.c b/src/mess/drivers/merlin.c
deleted file mode 100644
index f47dfd8ac66..00000000000
--- a/src/mess/drivers/merlin.c
+++ /dev/null
@@ -1,199 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol, hap
-/***************************************************************************
-
- Parker Bros Merlin handheld computer game, by Bob Doyle
- * TMS1100NLL MP3404A-N2 (has internal ROM)
-
- To start a game, press NEW GAME, followed by a number:
- 1: Tic-Tac-Toe
- 2: Music Machine
- 3: Echo
- 4: Blackjack 13
- 5: Magic Square
- 6: Mindbender
-
- Refer to the official manual for more information on the games.
-
-
- Other handhelds assumed to be on similar hardware:
- - Dr. Smith - by Tomy, released in Japan (basically a white version of Merlin,
- let's assume for now that the ROM contents is identical)
- - Master Merlin
-
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "merlin.lh" // clickable
-
-// master clock is a single stage RC oscillator: R=33K, C=100pf,
-// according to the TMS 1000 series data manual this is around 350kHz
-#define MASTER_CLOCK (350000)
-
-
-class merlin_state : public driver_device
-{
-public:
- merlin_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- virtual void machine_start();
-
-protected:
- required_device<cpu_device> m_maincpu;
- required_ioport_array<4> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_o;
-};
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(merlin_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 4; i++)
- if (m_o >> i & 1)
- k |= m_button_matrix[i]->read();
-
- return k;
-}
-
-WRITE16_MEMBER(merlin_state::write_o)
-{
- /* The speaker is connected to O4 through O6. The 3 outputs are paralleled for
- increased current driving capability. They are passed thru a 220 ohm resistor
- and then to the speaker, which has the other side grounded. The software then
- toggles these lines to make sounds and noises. (There is no audio generator
- other than toggling it with a software delay between to make tones). */
- static const int count[8] = { 0, 1, 1, 2, 1, 2, 2, 3 };
- m_speaker->level_w(count[data >> 4 & 7]);
-
- // O0-O3: input mux
- // O7: N/C
- m_o = data;
-}
-
-WRITE16_MEMBER(merlin_state::write_r)
-{
- /* LEDs:
-
- R0
- R1 R2 R3
- R4 R5 R6
- R7 R8 R9
- R10
- */
- for (int i = 0; i < 11; i++)
- output_set_lamp_value(i, data >> i & 1);
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-static INPUT_PORTS_START( merlin )
- PORT_START("IN.0") // O0
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2")
-
- PORT_START("IN.1") // O1
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6")
-
- PORT_START("IN.2") // O2
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Same Game")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10")
-
- PORT_START("IN.3") // O3
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game")
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void merlin_state::machine_start()
-{
- m_o = 0;
- save_item(NAME(m_o));
-}
-
-static const INT16 speaker_levels[] = { 0, 10922, 21845, 32767 };
-
-
-static MACHINE_CONFIG_START( merlin, merlin_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(merlin_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(merlin_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(merlin_state, write_r))
-
- MCFG_DEFAULT_LAYOUT(layout_merlin)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SPEAKER_LEVELS(4, speaker_levels)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( merlin )
- ROM_REGION( 0x800, "maincpu", 0 )
- ROM_LOAD( "mp3404", 0x0000, 0x800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_merlin_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_merlin_opla.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
-ROM_END
-
-
-CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin", GAME_SUPPORTS_SAVE )
diff --git a/src/mess/drivers/splitsec.c b/src/mess/drivers/splitsec.c
deleted file mode 100644
index ced46f6a775..00000000000
--- a/src/mess/drivers/splitsec.c
+++ /dev/null
@@ -1,363 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Parker Brothers Split Second
- * TMS1400NLL MP7314-N2 (die labeled MP7314)
-
- This is an electronic handheld reflex gaming device, it's straightforward
- to use. The included mini-games are:
- 1, 2, 3: Mad Maze*
- 4, 5: Space Attack*
- 6: Auto Cross
- 7: Stomp
- 8: Speedball
-
- *: higher number indicates higher difficulty
-
-
-----------------------------------------------------------------------------
-
- Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen
- * TMS1400NLL MP7313-N2 (die labeled MP7313)
-
- Bank Shot is an electronic pool game. To select a game, repeatedly press
- the [SELECT] button, then press [CUE UP] to start. Refer to the official
- manual for more information. The game selections are:
- 1: Straight Pool (1 player)
- 2: Straight Pool (2 players)
- 3: Poison Pool
- 4: Trick Shots
-
-
- TODO:
- - bankshot: the cue ball led is strobed more often than other leds,
- making it look brighter. We need more accurate led decay simulation
- for this to work.
- - MCU clock is unknown
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "splitsec.lh"
-#include "bankshot.lh"
-
-// The master clock is a single stage RC oscillator: R=24K, C=100pf,
-// according to the TMS 1000 series data manual this is around 375kHz.
-// However, this sounds too low-pitched and runs too slow when compared
-// to recordings, maybe the RC osc curve is different for TMS1400?
-
-// so for now, the value below is an approximation
-#define MASTER_CLOCK (475000)
-
-
-class splitsec_state : public driver_device
-{
-public:
- splitsec_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<2> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT8 m_input_mux;
- UINT16 m_r;
- UINT16 m_o;
-
- UINT16 m_display_state[0x10];
- UINT16 m_display_cache[0x10];
- UINT8 m_display_decay[0x100];
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(splitsec_write_r);
- DECLARE_WRITE16_MEMBER(bankshot_write_r);
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
-
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- LED Display
-
-***************************************************************************/
-
-// The device strobes the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-/* display layout, where number xy is lamp R(x),O(y)
-
- Split Second:
-
- 00 02 04
- 10 01 12 03 14 05 16
- 11 13 15
- 20 21 22 23 24 25 26
- 31 33 35
- 30 41 32 43 34 45 36
- 51 53 55
- 40 61 42 63 44 65 46
- 71 73 75
- 50 60 52 62 54 64 56
- 70 72 74
-
-
- Bank Shot: pretty much linear, see bankshot.lay
-
-*/
-
-void splitsec_state::display_update()
-{
- UINT16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
- {
- // update current state
- m_display_state[i] = (m_r >> i & 1) ? m_o : 0;
-
- active_state[i] = 0;
-
- for (int j = 0; j < 0x10; j++)
- {
- int di = j << 4 | i;
-
- // turn on powered segments
- if (m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
-
- // determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
- }
- }
-
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- if (m_display_cache[i] != active_state[i])
- {
- for (int j = 0; j < 8; j++)
- output_set_lamp_value(i*10 + j, active_state[i] >> j & 1);
- }
-
- memcpy(m_display_cache, active_state, sizeof(m_display_cache));
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(splitsec_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
-
- display_update();
-}
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(splitsec_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 2; i++)
- if (m_input_mux >> i & 1)
- k |= m_button_matrix[i]->read();
-
- return k;
-}
-
-WRITE16_MEMBER(splitsec_state::write_o)
-{
- // O0-O6: led columns
- // O7: N/C
- m_o = data;
- display_update();
-}
-
-WRITE16_MEMBER(splitsec_state::splitsec_write_r)
-{
- // R8: speaker out
- m_speaker->level_w(data >> 8 & 1);
-
- // R9,R10: input mux
- m_input_mux = data >> 9 & 3;
-
- // R0-R7: led rows
- m_r = data & 0xff;
- display_update();
-}
-
-WRITE16_MEMBER(splitsec_state::bankshot_write_r)
-{
- // R0: speaker out
- m_speaker->level_w(data & 1);
-
- // R2,R3: input mux
- m_input_mux = data >> 2 & 3;
-
- // R2-R10: led rows
- m_r = data & ~3;
- display_update();
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-static INPUT_PORTS_START( splitsec )
- PORT_START("IN.0") // R9
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 4 separate directional buttons, hence 16way
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.1") // R10
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Start")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-/* bankshot physical button layout and labels is like this:
- (note: remember that you can rotate the display in MESS)
-
- [SELECT [BALL UP] [BALL OVER]
- SCORE]
-
- ------ led display ------
-
- [ANGLE] [AIM] [CUE UP
- SHOOT]
-*/
-
-static INPUT_PORTS_START( bankshot )
- PORT_START("IN.0") // R2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up / Shoot")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.1") // R3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select / Score")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void splitsec_state::machine_start()
-{
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_cache, 0, sizeof(m_display_cache));
- memset(m_display_decay, 0, sizeof(m_display_decay));
-
- m_input_mux = 0;
- m_r = 0;
- m_o = 0;
-
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_cache));
- save_item(NAME(m_display_decay));
-
- save_item(NAME(m_input_mux));
- save_item(NAME(m_r));
- save_item(NAME(m_o));
-}
-
-
-static MACHINE_CONFIG_START( splitsec, splitsec_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(splitsec_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(splitsec_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, splitsec_write_r))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", splitsec_state, display_decay_tick, attotime::from_msec(1))
-
- MCFG_DEFAULT_LAYOUT(layout_splitsec)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-static MACHINE_CONFIG_DERIVED( bankshot, splitsec )
-
- /* basic machine hardware */
- MCFG_CPU_MODIFY("maincpu")
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, bankshot_write_r))
-
- MCFG_DEFAULT_LAYOUT(layout_bankshot)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( splitsec )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "tms1400nll_mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_splitsec_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
-ROM_END
-
-ROM_START( bankshot )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "tms1400nll_mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_bankshot_opla.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
-ROM_END
-
-
-CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE )
-CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE )
diff --git a/src/mess/drivers/starwbc.c b/src/mess/drivers/starwbc.c
deleted file mode 100644
index 2235a73f9b4..00000000000
--- a/src/mess/drivers/starwbc.c
+++ /dev/null
@@ -1,297 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Kenner Star Wars - Electronic Battle Command
- * TMS1100 MCU, labeled MP3438A
-
- This is a small tabletop space-dogfighting game. To start the game,
- press BASIC/INTER/ADV and enter P#(number of players), then
- START TURN. Refer to the official manual for more information.
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "starwbc.lh"
-
-// master clock is a single stage RC oscillator: R=51K, C=47pf,
-// according to the TMS 1000 series data manual this is around 350kHz
-#define MASTER_CLOCK (350000)
-
-
-class starwbc_state : public driver_device
-{
-public:
- starwbc_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<5> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_r;
- UINT16 m_o;
-
- UINT16 m_display_state[0x10];
- UINT16 m_display_cache[0x10];
- UINT8 m_display_decay[0x100];
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void prepare_and_update();
-
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- LED Display
-
-***************************************************************************/
-
-// The device strobes the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-void starwbc_state::display_update()
-{
- UINT16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
- {
- active_state[i] = 0;
-
- for (int j = 0; j < 0x10; j++)
- {
- int di = j << 4 | i;
-
- // turn on powered segments
- if (m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
-
- // determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
- }
- }
-
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- if (m_display_cache[i] != active_state[i])
- {
- output_set_digit_value(i, active_state[i]);
-
- for (int j = 0; j < 8; j++)
- output_set_lamp_value(i*10 + j, active_state[i] >> j & 1);
- }
-
- memcpy(m_display_cache, active_state, sizeof(m_display_cache));
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(starwbc_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
-
- display_update();
-}
-
-void starwbc_state::prepare_and_update()
-{
- UINT8 o = (m_o << 4 & 0xf0) | (m_o >> 4 & 0x0f);
- const UINT8 mask[5] = { 0x30, 0xff, 0xff, 0x7f, 0x7f };
-
- // R0,R2,R4,R6,R8
- for (int i = 0; i < 5; i++)
- m_display_state[i*2] = (m_r >> (i*2) & 1) ? (o & mask[i]) : 0;
-
- display_update();
-}
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(starwbc_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 5; i++)
- {
- const int ki[5] = { 0, 1, 3, 5, 7 };
- if (m_r >> ki[i] & 1)
- k |= m_button_matrix[i]->read();
- }
-
- return k;
-}
-
-WRITE16_MEMBER(starwbc_state::write_r)
-{
- // R0,R2,R4: select lamp row
- // R6,R8: select digit
- // R0,R1,R3,R5,R7: input mux
- // R9: piezo speaker
- m_speaker->level_w(data >> 9 & 1);
-
- m_r = data;
- prepare_and_update();
-}
-
-WRITE16_MEMBER(starwbc_state::write_o)
-{
- // O0-O7: leds state
- m_o = data;
- prepare_and_update();
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-/* physical button layout and labels is like this:
-
- (reconnnaissance=yellow) (tactical reaction=green)
- [MAGNA] [ENEMY] [EM] [BS] [SCR]
-
- [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE]
- [ADV] [P#] [<] [^] [>] [v]
- (game=blue) (maneuvers=red) */
-
-static INPUT_PORTS_START( starwbc )
- PORT_START("IN.0") // R0
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number")
-
- PORT_START("IN.1") // R1
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn")
-
- PORT_START("IN.2") // R3
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up")
-
- PORT_START("IN.3") // R5
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Fire")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations")
-
- PORT_START("IN.4") // R7
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right")
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void starwbc_state::machine_start()
-{
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_cache, 0, sizeof(m_display_cache));
- memset(m_display_decay, 0, sizeof(m_display_decay));
-
- m_r = 0;
- m_o = 0;
-
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_cache));
- save_item(NAME(m_display_decay));
-
- save_item(NAME(m_r));
- save_item(NAME(m_o));
-}
-
-
-static MACHINE_CONFIG_START( starwbc, starwbc_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(starwbc_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(starwbc_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(starwbc_state, write_r))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", starwbc_state, display_decay_tick, attotime::from_msec(1))
-
- MCFG_DEFAULT_LAYOUT(layout_starwbc)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( starwbc )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
-ROM_END
-
-ROM_START( starwbcp )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_starwbc_mpla.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_starwbc_opla.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
-ROM_END
-
-
-CONS( 1979, starwbc, 0, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command", GAME_SUPPORTS_SAVE )
-CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command (prototype)", GAME_SUPPORTS_SAVE )
diff --git a/src/mess/drivers/stopthie.c b/src/mess/drivers/stopthie.c
deleted file mode 100644
index f07dd1457f3..00000000000
--- a/src/mess/drivers/stopthie.c
+++ /dev/null
@@ -1,313 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Parker Brothers Stop Thief, by Bob Doyle
- * TMS0980NLL MP6101B (die labeled 0980B-01A)
-
- Stop Thief is actually a board game, the electronic device emulated here
- (called Electronic Crime Scanner) is an accessory. To start a game, press
- the ON button. Otherwise, it is in test-mode where you can hear all sounds.
-
-
- TODO:
- - MCU clock is unknown
- - stopthiep: unable to start a game (may be intentional?)
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "stopthie.lh"
-
-// master clock is unknown, the value below is an approximation
-#define MASTER_CLOCK (425000)
-
-
-class stopthief_state : public driver_device
-{
-public:
- stopthief_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<3> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_o;
- bool m_power_on;
-
- UINT16 m_display_state[0x10];
- UINT16 m_display_cache[0x10];
- UINT8 m_display_decay[0x100];
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- DECLARE_INPUT_CHANGED_MEMBER(power_button);
- DECLARE_WRITE_LINE_MEMBER(auto_power_off);
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
-
- virtual void machine_reset();
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- LED Display
-
-***************************************************************************/
-
-// The device strobes the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-void stopthief_state::display_update()
-{
- UINT16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
- {
- active_state[i] = 0;
-
- for (int j = 0; j < 0x10; j++)
- {
- int di = j << 4 | i;
-
- // turn on powered segments
- if (m_power_on && m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
-
- // determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
- }
- }
-
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- if (m_display_cache[i] != active_state[i])
- output_set_digit_value(i, active_state[i]);
-
- memcpy(m_display_cache, active_state, sizeof(m_display_cache));
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(stopthief_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
-
- display_update();
-}
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(stopthief_state::read_k)
-{
- // the Vss row is always on
- UINT8 k = m_button_matrix[2]->read();
-
- // read selected button rows
- for (int i = 0; i < 2; i++)
- {
- const int ki[2] = { 0, 6 };
- if (m_o >> ki[i] & 1)
- k |= m_button_matrix[i]->read();
- }
-
- return k;
-}
-
-WRITE16_MEMBER(stopthief_state::write_r)
-{
- // R0-R2: select digit
- UINT8 o = BITSWAP8(m_o,3,5,2,1,4,0,6,7) & 0x7f;
- for (int i = 0; i < 3; i++)
- m_display_state[i] = (data >> i & 1) ? o : 0;
-
- display_update();
-
- // R3-R8: speaker on
- m_speaker->level_w((data & 0x1f8 && m_o & 8) ? 1 : 0);
-}
-
-WRITE16_MEMBER(stopthief_state::write_o)
-{
- // O0,O6: input mux
- // O3: speaker out
- // O0-O2,O4-O7: led segments A-G
- m_o = data;
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-INPUT_CHANGED_MEMBER(stopthief_state::power_button)
-{
- m_power_on = (bool)(FPTR)param;
- m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE);
-}
-
-/* physical button layout and labels is like this:
-
- [1] [2] [OFF]
- [3] [4] [ON]
- [5] [6] [T, TIP]
- [7] [8] [A, ARREST]
- [9] [0] [C, CLUE]
-*/
-
-static INPUT_PORTS_START( stopthief )
- PORT_START("IN.0") // O0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
-
- PORT_START("IN.1") // O6
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
-
- // note: even though power buttons are on the matrix, they are not CPU-controlled
- PORT_START("IN.2") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, stopthief_state, power_button, (void *)true)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, stopthief_state, power_button, (void *)false)
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-WRITE_LINE_MEMBER(stopthief_state::auto_power_off)
-{
- // TMS0980 auto power-off opcode
- if (state)
- {
- m_power_on = false;
- m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- }
-}
-
-
-void stopthief_state::machine_reset()
-{
- m_power_on = true;
-}
-
-void stopthief_state::machine_start()
-{
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_cache, 0, sizeof(m_display_cache));
- memset(m_display_decay, 0, sizeof(m_display_decay));
-
- m_o = 0;
- m_power_on = false;
-
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_cache));
- save_item(NAME(m_display_decay));
-
- save_item(NAME(m_o));
- save_item(NAME(m_power_on));
-}
-
-
-static MACHINE_CONFIG_START( stopthief, stopthief_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS0980, MASTER_CLOCK)
- MCFG_TMS1XXX_READ_K_CB(READ8(stopthief_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(stopthief_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(stopthief_state, write_r))
- MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(stopthief_state, auto_power_off))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", stopthief_state, display_decay_tick, attotime::from_msec(1))
-
- MCFG_DEFAULT_LAYOUT(layout_stopthie)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( stopthie )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "tms0980nll_mp6101b", 0x0000, 0x1000, CRC(8bde5bb4) SHA1(8c318fcce67acc24c7ae361f575f28ec6f94665a) )
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-ROM_START( stopthiep )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums)
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_default_mpla.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_stopthie_opla.pla", 0, 352, CRC(50337a48) SHA1(4a9ea62ed797a9ac5190eec3bb6ebebb7814628c) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_stopthie_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-
-CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE )
-CONS( 1979, stopthiep, stopthie, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner) (prototype)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
diff --git a/src/mess/drivers/tandy12.c b/src/mess/drivers/tandy12.c
deleted file mode 100644
index cbe5a33038b..00000000000
--- a/src/mess/drivers/tandy12.c
+++ /dev/null
@@ -1,229 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Tandy Radio Shack Computerized Arcade (1981, 1982, 1995)
- * TMS1100 CD7282SL
-
- This handheld contains 12 minigames. It looks and plays like "Fabulous Fred"
- by the Japanese company Mego Corp. in 1980, which in turn is a mix of Merlin
- and Simon. Unlike Merlin and Simon, spin-offs like these were not successful.
- 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; 4 C-cells and a 9-volt.
-
- Some of the games require accessories included with the toy (eg. the Baseball
- game is played with a board representing the playing field). To start a game,
- hold the [SELECT] button, then press [START] when the game button lights up.
- As always, refer to the official manual for more information.
-
- See below at the input defs for a list of the games.
-
-
- TODO:
- - output PLA is not verified
- - microinstructions PLA is not verified
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-#include "tandy12.lh" // clickable
-
-// master clock is a single stage RC oscillator: R=39K, C=47pf,
-// according to the TMS 1000 series data manual this is around 400kHz
-#define MASTER_CLOCK (400000)
-
-
-class tandy12_state : public driver_device
-{
-public:
- tandy12_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<tms1xxx_cpu_device> m_maincpu;
- required_ioport_array<5> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_r;
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- virtual void machine_start();
-};
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-READ8_MEMBER(tandy12_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 5; i++)
- if (m_r >> (i+5) & 1)
- k |= m_button_matrix[i]->read();
-
- return k;
-}
-
-WRITE16_MEMBER(tandy12_state::write_o)
-{
- // O0-O7: button lamps 1-8
- for (int i = 0; i < 8; i++)
- output_set_lamp_value(i+1, data >> i & 1);
-}
-
-WRITE16_MEMBER(tandy12_state::write_r)
-{
- // R0-R3: button lamps 9-12
- for (int i = 0; i < 4; i++)
- output_set_lamp_value(i+1 + 8, data >> i & 1);
-
- // R10: speaker out
- m_speaker->level_w(data >> 10 & 1);
-
- // R5-R9: input mux
- m_r = data;
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-/* physical button layout and labels is like this:
-
- REPEAT-2 SPACE-2
- [O] OFF--ON [O]
-
- [purple]1 [blue]5 [l-green]9
- ORGAN TAG-IT TREASURE HUNT
-
- [l-orange]2 [turquoise]6 [red]10
- SONG WRITER ROULETTE COMPETE
-
- [pink]3 [yellow]7 [violet]11
- REPEAT BASEBALL FIRE AWAY
-
- [green]4 [orange]8 [brown]12
- TORPEDO REPEAT PLUS HIDE 'N SEEK
-
- [O] [O] [O]
- START SELECT PLAY-2/HIT-7
-*/
-
-static INPUT_PORTS_START( tandy12 )
- PORT_START("IN.0") // R5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("12")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("11")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
-
- PORT_START("IN.1") // R6
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start")
-
- PORT_START("IN.2") // R7
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.3") // R8
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
-
- PORT_START("IN.4") // R9
- 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_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
- 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_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void tandy12_state::machine_start()
-{
- m_r = 0;
- save_item(NAME(m_r));
-}
-
-
-static const UINT16 tandy12_output_pla[0x20] =
-{
- // these are certain
- 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
- 0x80, 0x00, 0x00, 0x00, 0x00,
-
- // rest is unused?
- 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-
-static MACHINE_CONFIG_START( tandy12, tandy12_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
- MCFG_TMS1XXX_OUTPUT_PLA(tandy12_output_pla)
- MCFG_TMS1XXX_READ_K_CB(READ8(tandy12_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tandy12_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tandy12_state, write_r))
-
- MCFG_DEFAULT_LAYOUT(layout_tandy12)
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( tandy12 )
- ROM_REGION( 0x800, "maincpu", 0 )
- ROM_LOAD( "cd7282sl", 0x0000, 0x800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_tandy12_opla.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE )
diff --git a/src/mess/drivers/unk3403.c b/src/mess/drivers/unk3403.c
deleted file mode 100644
index cf1fc6391c0..00000000000
--- a/src/mess/drivers/unk3403.c
+++ /dev/null
@@ -1,211 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- TMS1100NLL MP3403 DBS 7836 SINGAPORE some game board with 7-segs.
-
- What old electronic game is this?
-
- some clues:
- - it's from 1978
- - Merlin is MP3404, Amaze-A-Tron is MP3405, this one is MP3403
- - it plays some short jingles (you need to be lucky with button mashing),
- jingles feel like maybe a horse racing game
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/tms0980/tms0980.h"
-#include "sound/speaker.h"
-
-// master clock is unknown, the value below is an approximation
-#define MASTER_CLOCK (350000)
-
-
-class unk3403_state : public driver_device
-{
-public:
- unk3403_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_button_matrix(*this, "IN"),
- m_speaker(*this, "speaker")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_ioport_array<4> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_r;
- UINT16 m_o;
-
- DECLARE_READ8_MEMBER(read_k);
- DECLARE_WRITE16_MEMBER(write_o);
- DECLARE_WRITE16_MEMBER(write_r);
-
- void leds_update();
-
- virtual void machine_start();
-};
-
-
-
-/***************************************************************************
-
- I/O
-
-***************************************************************************/
-
-void unk3403_state::leds_update()
-{
- // show debug clues
- static UINT8 leds[0x10] = { 0 };
- char msg[0x100] = { 0 };
- char dig[0x100] = { 0 };
- sprintf(msg, "R, *R, O[R]");
-
- for (int i = 0; i < 11; i++)
- {
- if (m_r >> i & 1)
- {
- leds[i]=m_o;
- }
- sprintf(dig, "\n %X %c %02X",i, (m_r >> i & 1) ? 'X' : '_', leds[i]);
- strcat(msg, dig);
- }
-
- popmessage("%s", msg);
-}
-
-READ8_MEMBER(unk3403_state::read_k)
-{
- UINT8 k = 0;
-
- // read selected button rows
- for (int i = 0; i < 4; i++)
- {
- if (m_r >> (i + 4) & 1)
- k |= m_button_matrix[i]->read();
- }
-
- return k;
-}
-
-WRITE16_MEMBER(unk3403_state::write_r)
-{
- // R4-R7: input mux
- // R10: maybe a switch or other button row?
- // R9: speaker out
- m_speaker->level_w(data >> 9 & 1);
-
- // others: ?
- m_r = data;
- leds_update();
-}
-
-WRITE16_MEMBER(unk3403_state::write_o)
-{
- // ?
- m_o = data;
- leds_update();
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-static INPUT_PORTS_START( unk3403 )
- PORT_START("IN.0") // R4
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)
-
- PORT_START("IN.1") // R5
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)
-
- PORT_START("IN.2") // R6
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) // reset/newgame?
-
- PORT_START("IN.3") // R7
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)
-INPUT_PORTS_END
-
-
-
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
-
-void unk3403_state::machine_start()
-{
- m_r = 0;
- m_o = 0;
-
- save_item(NAME(m_r));
- save_item(NAME(m_o));
-}
-
-
-static const UINT16 unk3403_output_pla[0x20] =
-{
- /* O output PLA configuration currently unknown */
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
-};
-
-
-static MACHINE_CONFIG_START( unk3403, unk3403_state )
-
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, MASTER_CLOCK)
- MCFG_TMS1XXX_OUTPUT_PLA(unk3403_output_pla)
- MCFG_TMS1XXX_READ_K_CB(READ8(unk3403_state, read_k))
- MCFG_TMS1XXX_WRITE_O_CB(WRITE16(unk3403_state, write_o))
- MCFG_TMS1XXX_WRITE_R_CB(WRITE16(unk3403_state, write_r))
-
- /* no video! */
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( unk3403 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "tms1100nll_mp3403", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_xxx_opla.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-CONS( 1978, unk3403, 0, 0, unk3403, unk3403, driver_device, 0, "<unknown>", "unknown TMS1100 electronic game", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
diff --git a/src/mess/layout/cnsector.lay b/src/mess/layout/cnsector.lay
index 9c7c22c7baf..5bd9aaa0d48 100644
--- a/src/mess/layout/cnsector.lay
+++ b/src/mess/layout/cnsector.lay
@@ -115,16 +115,16 @@
<bezel element="static_gray"><bounds x="0" y="50" width="100" height="100" /></bezel>
<bezel element="static_red"><bounds x="0" y="55" width="100" height="86" /></bezel>
- <bezel name="lamp0" element="lamp">
+ <bezel name="lamp60" element="lamp">
<bounds x="42" y="62" width="8" height="8" />
</bezel>
- <bezel name="lamp1" element="lamp">
+ <bezel name="lamp61" element="lamp">
<bounds x="42" y="126" width="8" height="8" />
</bezel>
- <bezel name="lamp2" element="lamp">
+ <bezel name="lamp62" element="lamp">
<bounds x="74" y="94" width="8" height="8" />
</bezel>
- <bezel name="lamp3" element="lamp">
+ <bezel name="lamp63" element="lamp">
<bounds x="10" y="94" width="8" height="8" />
</bezel>
diff --git a/src/mess/layout/tmpacman.lay b/src/mess/layout/tmpacman.lay
new file mode 100644
index 00000000000..e0a42256316
--- /dev/null
+++ b/src/mess/layout/tmpacman.lay
@@ -0,0 +1,186 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+
+ <element name="led" defstate="0">
+ <disk state="0"><color red="0.1" green="0.2" blue="0.2" /></disk>
+ <disk state="1"><color red="0.5" green="1.0" blue="1.0" /></disk>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Test Layout">
+ <bounds left="0" right="64" top="0" bottom="64" />
+ <bezel element="static_black">
+ <bounds left="0" right="64" top="0" bottom="64" />
+ </bezel>
+
+ <!-- 8*19 matrix -->
+
+ <bezel name="lamp0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp100" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp101" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp102" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp103" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp104" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp105" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp106" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp107" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp108" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp109" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp110" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp111" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp112" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp113" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp114" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp115" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp116" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp117" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp118" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp200" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp201" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp202" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp203" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp204" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp205" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp206" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp207" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp208" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp209" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp210" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp211" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp212" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp213" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp214" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp215" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp216" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp217" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp218" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp300" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp301" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp302" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp303" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp304" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp305" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp306" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp307" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp308" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp309" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp310" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp311" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp312" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp313" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp314" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp315" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp316" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp317" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp318" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp400" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp401" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp402" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp403" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp404" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp405" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp406" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp407" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp408" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp409" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp410" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp411" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp412" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp413" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp414" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp415" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp416" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp417" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp418" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp500" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp501" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp502" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp503" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp504" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp505" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp506" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp507" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp508" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp509" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp510" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp511" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp512" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp513" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp514" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp515" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp516" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp517" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp518" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp600" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp601" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp602" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp603" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp604" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp605" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp606" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp607" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp608" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp609" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp610" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp611" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp612" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp613" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp614" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp615" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp616" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp617" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp618" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
+
+ <bezel name="lamp700" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
+ <bezel name="lamp701" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
+ <bezel name="lamp702" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
+ <bezel name="lamp703" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
+ <bezel name="lamp704" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
+ <bezel name="lamp705" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
+ <bezel name="lamp706" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
+ <bezel name="lamp707" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
+ <bezel name="lamp708" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
+ <bezel name="lamp709" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
+ <bezel name="lamp710" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
+ <bezel name="lamp711" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
+ <bezel name="lamp712" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
+ <bezel name="lamp713" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
+ <bezel name="lamp714" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
+ <bezel name="lamp715" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
+ <bezel name="lamp716" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
+ <bezel name="lamp717" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
+ <bezel name="lamp718" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
+
+
+ </view>
+</mamelayout>
diff --git a/src/mess/mess.lst b/src/mess/mess.lst
index c7fbff6fe67..40d6736c581 100644
--- a/src/mess/mess.lst
+++ b/src/mess/mess.lst
@@ -2617,3 +2617,4 @@ alnchase
edracula
tc4
ebball
+tmpacman
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index d62c7546631..a6ff3ea45c1 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -735,14 +735,12 @@ DRVLIBS += \
$(MESSOBJ)/homebrew.a \
$(MESSOBJ)/homelab.a \
$(MESSOBJ)/hp.a \
- $(MESSOBJ)/ideal.a \
$(MESSOBJ)/imp.a \
$(MESSOBJ)/intel.a \
$(MESSOBJ)/interton.a \
$(MESSOBJ)/intv.a \
$(MESSOBJ)/isc.a \
$(MESSOBJ)/kaypro.a \
- $(MESSOBJ)/kenner.a \
$(MESSOBJ)/koei.a \
$(MESSOBJ)/kyocera.a \
$(MESSOBJ)/luxor.a \
@@ -1004,7 +1002,6 @@ $(MESSOBJ)/amstrad.a: \
$(MESSOBJ)/apf.a: \
$(MESS_DRIVERS)/apf.o \
- $(MESS_DRIVERS)/mathmagi.o \
$(MESSOBJ)/apollo.a: \
$(MESS_DRIVERS)/apollo.o $(MESS_MACHINE)/apollo.o $(MESS_MACHINE)/apollo_dbg.o $(MESS_MACHINE)/apollo_kbd.o $(MESS_VIDEO)/apollo.o \
@@ -1333,9 +1330,6 @@ $(MESSOBJ)/intel.a: \
$(MESS_DRIVERS)/sdk85.o \
$(MESS_DRIVERS)/sdk86.o \
-$(MESSOBJ)/ideal.a: \
- $(MESS_DRIVERS)/elecdet.o \
-
$(MESSOBJ)/imp.a: \
$(MESS_DRIVERS)/tim011.o \
$(MESS_DRIVERS)/tim100.o \
@@ -1352,9 +1346,6 @@ $(MESSOBJ)/isc.a: \
$(MESSOBJ)/kaypro.a: \
$(MESS_DRIVERS)/kaypro.o $(MESS_MACHINE)/kaypro.o $(MESS_MACHINE)/kay_kbd.o $(MESS_VIDEO)/kaypro.o \
-$(MESSOBJ)/kenner.a: \
- $(MESS_DRIVERS)/starwbc.o \
-
$(MESSOBJ)/koei.a: \
$(MESS_DRIVERS)/pasogo.o \
@@ -1444,6 +1435,7 @@ $(MESSOBJ)/nec.a: \
$(MESS_DRIVERS)/pc100.o \
$(MESS_DRIVERS)/pc9801.o $(MESS_MACHINE)/pc9801_26.o $(MESS_MACHINE)/pc9801_86.o $(MESS_MACHINE)/pc9801_118.o $(MESS_MACHINE)/pc9801_cbus.o $(MESS_MACHINE)/pc9801_kbd.o \
$(MESS_DRIVERS)/tk80bs.o \
+ $(MESS_DRIVERS)/hh_ucom4.o \
$(MESSOBJ)/netronic.a: \
$(MESS_DRIVERS)/elf.o \
@@ -1496,10 +1488,6 @@ $(MESSOBJ)/palm.a: \
$(MESS_DRIVERS)/palmz22.o \
$(MESSOBJ)/parker.a: \
- $(MESS_DRIVERS)/cnsector.o \
- $(MESS_DRIVERS)/merlin.o \
- $(MESS_DRIVERS)/splitsec.o \
- $(MESS_DRIVERS)/stopthie.o \
$(MESS_DRIVERS)/wildfire.o \
$(MESSOBJ)/pitronic.a: \
@@ -1825,7 +1813,6 @@ $(MESSOBJ)/trs.a: \
$(MESS_MACHINE)/dragon.o \
$(MESS_MACHINE)/dgnalpha.o \
$(MESS_VIDEO)/gime.o \
- $(MESS_DRIVERS)/tandy12.o \
$(MESS_DRIVERS)/trs80.o $(MESS_MACHINE)/trs80.o $(MESS_VIDEO)/trs80.o \
$(MESS_DRIVERS)/trs80m2.o $(MESS_MACHINE)/trs80m2kb.o \
$(MESS_DRIVERS)/tandy2k.o $(MESS_MACHINE)/tandy2kb.o \
@@ -2017,7 +2004,6 @@ $(MESSOBJ)/skeleton.a: \
$(MESS_DRIVERS)/ti630.o \
$(MESS_DRIVERS)/tsispch.o \
$(MESS_DRIVERS)/unistar.o \
- $(MESS_DRIVERS)/unk3403.o \
$(MESS_DRIVERS)/v6809.o \
$(MESS_DRIVERS)/vector4.o \
$(MESS_DRIVERS)/vii.o \
@@ -2117,7 +2103,6 @@ $(MAME_DRIVERS)/cdi.o: $(MAME_LAYOUT)/cdi.lh
$(MESS_DRIVERS)/chessmst.o: $(MESS_LAYOUT)/chessmst.lh
$(MESS_DRIVERS)/chesstrv.o: $(MESS_LAYOUT)/chesstrv.lh \
$(MESS_LAYOUT)/borisdpl.lh
-$(MESS_DRIVERS)/cnsector.o: $(MESS_LAYOUT)/cnsector.lh
$(MESS_DRIVERS)/comp4.o: $(MESS_LAYOUT)/comp4.lh
$(MESS_DRIVERS)/cp1.o: $(MESS_LAYOUT)/cp1.lh
$(MESS_DRIVERS)/cvicny.o: $(MESS_LAYOUT)/cvicny.lh
@@ -2129,7 +2114,6 @@ $(MESS_DRIVERS)/dmv.o: $(MESS_LAYOUT)/dmv.lh
$(MESS_DRIVERS)/dolphunk.o: $(MESS_LAYOUT)/dolphunk.lh
$(MESS_DRIVERS)/eacc.o: $(MESS_LAYOUT)/eacc.lh
$(MESS_DRIVERS)/edracula.o: $(MESS_LAYOUT)/edracula.lh
-$(MESS_DRIVERS)/elecdet.o: $(MESS_LAYOUT)/elecdet.lh
$(MESS_DRIVERS)/elekscmp.o: $(MESS_LAYOUT)/elekscmp.lh
$(MESS_DRIVERS)/elf.o: $(MESS_LAYOUT)/elf2.lh
$(MESS_MACHINE)/esqvfd.o: $(MESS_LAYOUT)/esq2by40.lh \
@@ -2143,10 +2127,20 @@ $(MESS_DRIVERS)/gamecom.o: $(MESS_LAYOUT)/gamecom.lh
$(MESS_DRIVERS)/glasgow.o: $(MESS_LAYOUT)/glasgow.lh
$(MESS_DRIVERS)/h8.o: $(MESS_LAYOUT)/h8.lh
$(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \
+ $(MESS_LAYOUT)/bankshot.lh \
+ $(MESS_LAYOUT)/cnsector.lh \
$(MESS_LAYOUT)/comp4.lh \
$(MESS_LAYOUT)/ebball.lh \
+ $(MESS_LAYOUT)/elecdet.lh \
+ $(MESS_LAYOUT)/mathmagi.lh \
+ $(MESS_LAYOUT)/merlin.lh \
$(MESS_LAYOUT)/simon.lh \
+ $(MESS_LAYOUT)/splitsec.lh \
+ $(MESS_LAYOUT)/starwbc.lh \
+ $(MESS_LAYOUT)/stopthie.lh \
+ $(MESS_LAYOUT)/tandy12.lh \
$(MESS_LAYOUT)/tc4.lh
+$(MESS_DRIVERS)/hh_ucom4.o: $(MESS_LAYOUT)/tmpacman.lh
$(MESS_DRIVERS)/ie15.o: $(MESS_LAYOUT)/ie15.lh
$(MESS_DRIVERS)/instruct.o: $(MESS_LAYOUT)/instruct.lh
$(MESS_DRIVERS)/k1003.o: $(MESS_LAYOUT)/k1003.lh
@@ -2156,11 +2150,9 @@ $(MESS_DRIVERS)/lc80.o: $(MESS_LAYOUT)/lc80.lh
$(MESS_DRIVERS)/llc.o: $(MESS_LAYOUT)/llc1.lh
$(MESS_DRIVERS)/lynx.o: $(MESS_LAYOUT)/lynx.lh
$(MESS_DRIVERS)/mac.o: $(MESS_LAYOUT)/mac.lh
-$(MESS_DRIVERS)/mathmagi.o: $(MESS_LAYOUT)/mathmagi.lh
$(MESS_MACHINE)/megacd.o: $(MESS_LAYOUT)/megacd.lh
$(MESS_DRIVERS)/mekd2.o: $(MESS_LAYOUT)/mekd2.lh
$(MESS_DRIVERS)/mephisto.o: $(MESS_LAYOUT)/mephisto.lh
-$(MESS_DRIVERS)/merlin.o: $(MESS_LAYOUT)/merlin.lh
$(MESS_DRIVERS)/minicom.o: $(MESS_LAYOUT)/minicom.lh
$(MESS_DRIVERS)/mirage.o: $(MESS_LAYOUT)/mirage.lh
$(MESS_DRIVERS)/mk1.o: $(MESS_LAYOUT)/mk1.lh
@@ -2196,16 +2188,11 @@ $(MESS_DRIVERS)/simon.o: $(MESS_LAYOUT)/simon.lh
$(MESS_DRIVERS)/sitcom.o: $(MESS_LAYOUT)/sitcom.lh
$(MESS_DRIVERS)/slc1.o: $(MESS_LAYOUT)/slc1.lh
$(MESS_DRIVERS)/sms.o: $(MESS_LAYOUT)/sms1.lh
-$(MESS_DRIVERS)/splitsec.o: $(MESS_LAYOUT)/bankshot.lh \
- $(MESS_LAYOUT)/splitsec.lh
-$(MESS_DRIVERS)/starwbc.o: $(MESS_LAYOUT)/starwbc.lh
-$(MESS_DRIVERS)/stopthie.o: $(MESS_LAYOUT)/stopthie.lh
$(MESS_DRIVERS)/super80.o: $(MESS_LAYOUT)/super80.lh
$(MESS_DRIVERS)/supercon.o: $(MESS_LAYOUT)/supercon.lh
$(MESS_DRIVERS)/svision.o: $(MESS_LAYOUT)/svision.lh
$(MESS_DRIVERS)/svmu.o: $(MESS_LAYOUT)/svmu.lh
$(MESS_DRIVERS)/sym1.o: $(MESS_LAYOUT)/sym1.lh
-$(MESS_DRIVERS)/tandy12.o: $(MESS_LAYOUT)/tandy12.lh
$(MESS_DRIVERS)/tavernie.o: $(MESS_LAYOUT)/tavernie.lh
$(MESS_DRIVERS)/tb303.o: $(MESS_LAYOUT)/tb303.lh
$(MESS_DRIVERS)/tc4.o: $(MESS_LAYOUT)/tc4.lh